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:
Francesco Abbate 2021-10-07 19:19:03 +02:00
parent 7a435a568a
commit 92362586df
2 changed files with 16 additions and 3 deletions

View File

@ -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 = {}

View File

@ -349,7 +349,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
@ -376,7 +376,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