From 77fd29647a6f756a668268551fd11bc88600be60 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 5 Dec 2017 17:01:49 -0800 Subject: [PATCH] Cache foldability more intelligently Signed-off-by: Nathan Sobo --- src/tree-sitter-language-mode.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/tree-sitter-language-mode.js b/src/tree-sitter-language-mode.js index ff7d6c096..166816d0d 100644 --- a/src/tree-sitter-language-mode.js +++ b/src/tree-sitter-language-mode.js @@ -26,7 +26,10 @@ class TreeSitterLanguageMode { } bufferDidChange ({oldRange, newRange, oldText, newText}) { - this.isFoldableCache.length = 0 + const startRow = oldRange.start.row + const oldEndRow = oldRange.end.row + const newEndRow = newRange.end.row + this.isFoldableCache.splice(startRow, oldEndRow - startRow, ...new Array(newEndRow - startRow)) this.document.edit({ startIndex: this.buffer.characterIndexForPosition(oldRange.start), lengthRemoved: oldText.length, @@ -44,7 +47,13 @@ class TreeSitterLanguageMode { buildHighlightIterator () { const invalidatedRanges = this.document.parse() for (let i = 0, n = invalidatedRanges.length; i < n; i++) { - this.emitter.emit('did-change-highlighting', invalidatedRanges[i]) + const range = invalidatedRanges[i] + const startRow = range.start.row + const endRow = range.end.row + for (let row = startRow; row < endRow; row++) { + this.isFoldableCache[row] = undefined + } + this.emitter.emit('did-change-highlighting', range) } return new TreeSitterHighlightIterator(this) }