Ensure that searching for completion data in HTML is not too slow inside large blocks of text

This commit is contained in:
Kovid Goyal 2014-12-24 10:42:35 +05:30
parent ba6a257331
commit a3822b0fdf

View File

@ -41,8 +41,8 @@ class Tag(object):
self.name, self.start_block.blockNumber(), self.start_offset, self.end_block.blockNumber(), self.end_offset, self.self_closing) self.name, self.start_block.blockNumber(), self.start_offset, self.end_block.blockNumber(), self.end_offset, self.self_closing)
__str__ = __repr__ __str__ = __repr__
def next_tag_boundary(block, offset, forward=True): def next_tag_boundary(block, offset, forward=True, max_lines=10000):
while block.isValid(): while block.isValid() and max_lines > 0:
ud = block.userData() ud = block.userData()
if ud is not None: if ud is not None:
tags = sorted(ud.tags, key=get_offset, reverse=not forward) tags = sorted(ud.tags, key=get_offset, reverse=not forward)
@ -53,6 +53,7 @@ def next_tag_boundary(block, offset, forward=True):
return block, boundary return block, boundary
block = block.next() if forward else block.previous() block = block.next() if forward else block.previous()
offset = -1 if forward else sys.maxint offset = -1 if forward else sys.maxint
max_lines -= 1
return None, None return None, None
def next_attr_boundary(block, offset, forward=True): def next_attr_boundary(block, offset, forward=True):
@ -629,7 +630,7 @@ class Smarts(NullSmarts):
def get_completion_data(self, editor, ev=None): def get_completion_data(self, editor, ev=None):
c = editor.textCursor() c = editor.textCursor()
block, offset = c.block(), c.positionInBlock() block, offset = c.block(), c.positionInBlock()
oblock, boundary = next_tag_boundary(block, offset, forward=False) oblock, boundary = next_tag_boundary(block, offset, forward=False, max_lines=5)
if boundary is None or not boundary.is_start or boundary.closing: if boundary is None or not boundary.is_start or boundary.closing:
# Not inside a opening tag definition # Not inside a opening tag definition
return return