Customized fork of github.com/rxi/lite

Fixed rare case where core.doc.highlighter would iterate out of line bounds

rxi 18b7d70a a651d48e

Changed files
+8 -7
data
core
+8 -7
data/core/doc/highlighter.lua
··· 10 function Highlighter:new(doc) 11 self.doc = doc 12 self.lines = {} 13 - self.last_valid_line = 1 14 self.max_wanted_line = 0 15 16 -- init incremental syntax highlighting 17 core.add_thread(function() 18 while true do 19 - if self.last_valid_line > self.max_wanted_line then 20 self.max_wanted_line = 0 21 coroutine.yield(1 / config.fps) 22 23 else 24 - local max = math.min(self.last_valid_line + 40, self.max_wanted_line) 25 26 - for i = self.last_valid_line, max do 27 local state = (i > 1) and self.lines[i - 1].state 28 local line = self.lines[i] 29 if not (line and line.init_state == state) then ··· 31 end 32 end 33 34 - self.last_valid_line = max + 1 35 core.redraw = true 36 coroutine.yield() 37 end ··· 41 42 43 function Highlighter:invalidate(idx) 44 - self.last_valid_line = idx 45 end 46 47 ··· 60 local prev = self.lines[idx - 1] 61 line = self:tokenize_line(idx, prev and prev.state) 62 self.lines[idx] = line 63 - self.last_valid_line = math.min(self.last_valid_line, idx) 64 end 65 self.max_wanted_line = math.max(self.max_wanted_line, idx) 66 return line
··· 10 function Highlighter:new(doc) 11 self.doc = doc 12 self.lines = {} 13 + self.first_invalid_line = 1 14 self.max_wanted_line = 0 15 16 -- init incremental syntax highlighting 17 core.add_thread(function() 18 while true do 19 + if self.first_invalid_line > self.max_wanted_line then 20 self.max_wanted_line = 0 21 coroutine.yield(1 / config.fps) 22 23 else 24 + local max = math.min(self.first_invalid_line + 40, self.max_wanted_line) 25 26 + for i = self.first_invalid_line, max do 27 local state = (i > 1) and self.lines[i - 1].state 28 local line = self.lines[i] 29 if not (line and line.init_state == state) then ··· 31 end 32 end 33 34 + self.first_invalid_line = max + 1 35 core.redraw = true 36 coroutine.yield() 37 end ··· 41 42 43 function Highlighter:invalidate(idx) 44 + self.first_invalid_line = idx 45 + self.max_wanted_line = math.min(self.max_wanted_line, #self.doc.lines) 46 end 47 48 ··· 61 local prev = self.lines[idx - 1] 62 line = self:tokenize_line(idx, prev and prev.state) 63 self.lines[idx] = line 64 + self.first_invalid_line = math.min(self.first_invalid_line, idx) 65 end 66 self.max_wanted_line = math.max(self.max_wanted_line, idx) 67 return line