Improve highlither for document edits
The syntax highlighter keep a cache of the documents like tokenization. In order to minimize the amount of tokenize re-computations we insert some emtty lines or remove some lines in the highlither lines corresponding to the lines added or removed to the document.
This commit is contained in:
parent
8477818c96
commit
44d7f3738f
|
@ -44,12 +44,25 @@ function Highlighter:reset()
|
||||||
self.max_wanted_line = 0
|
self.max_wanted_line = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function Highlighter:invalidate(idx)
|
function Highlighter:invalidate(idx)
|
||||||
self.first_invalid_line = math.min(self.first_invalid_line, idx)
|
self.first_invalid_line = math.min(self.first_invalid_line, idx)
|
||||||
self.max_wanted_line = math.min(self.max_wanted_line, #self.doc.lines)
|
self.max_wanted_line = math.min(self.max_wanted_line, #self.doc.lines)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function Highlighter:insert_notify(line, n)
|
||||||
|
self:invalidate(line)
|
||||||
|
for i = 1, n do
|
||||||
|
table.insert(self.lines, line, nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Highlighter:remove_notify(line, n)
|
||||||
|
self:invalidate(line)
|
||||||
|
for i = 1, n do
|
||||||
|
table.remove(self.lines, line)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
function Highlighter:tokenize_line(idx, state)
|
function Highlighter:tokenize_line(idx, state)
|
||||||
local res = {}
|
local res = {}
|
||||||
|
|
|
@ -348,7 +348,7 @@ function Doc:raw_insert(line, col, text, undo_stack, time)
|
||||||
push_undo(undo_stack, time, "remove", line, col, line2, col2)
|
push_undo(undo_stack, time, "remove", line, col, line2, col2)
|
||||||
|
|
||||||
-- update highlighter and assure selection is in bounds
|
-- update highlighter and assure selection is in bounds
|
||||||
self.highlighter:invalidate(line)
|
self.highlighter:insert_notify(line, #lines - 1)
|
||||||
self:sanitize_selection()
|
self:sanitize_selection()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -375,7 +375,7 @@ function Doc:raw_remove(line1, col1, line2, col2, undo_stack, time)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- update highlighter and assure selection is in bounds
|
-- update highlighter and assure selection is in bounds
|
||||||
self.highlighter:invalidate(line1)
|
self.highlighter:remove_notify(line1, line2 - line1)
|
||||||
self:sanitize_selection()
|
self:sanitize_selection()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue