From f305cfd7674eb1cfec919e07d193f20855907cbf Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 15 Nov 2018 15:53:50 -0800 Subject: [PATCH] :racehorse: Avoid duplicate calls to TextBuffer.characterIndexForPosition --- src/tree-sitter-language-mode.js | 36 +++++++++++++++++--------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/tree-sitter-language-mode.js b/src/tree-sitter-language-mode.js index d2f1375fe..870127625 100644 --- a/src/tree-sitter-language-mode.js +++ b/src/tree-sitter-language-mode.js @@ -99,10 +99,13 @@ class TreeSitterLanguageMode { return this.grammar.scopeName } - bufferDidChange (change) { - this.rootLanguageLayer.handleTextChange(change) + bufferDidChange ({oldRange, newRange, oldText, newText}) { + const edit = this.rootLanguageLayer._treeEditForBufferChange( + oldRange.start, oldRange.end, newRange.end, oldText, newText + ) + this.rootLanguageLayer.handleTextChange(edit, oldText, newText) for (const marker of this.injectionsMarkerLayer.getMarkers()) { - marker.languageLayer.handleTextChange(change) + marker.languageLayer.handleTextChange(edit, oldText, newText) } } @@ -542,31 +545,30 @@ class LanguageLayer { } } - handleTextChange ({oldRange, newRange, oldText, newText}) { - if (this.tree) { - this.tree.edit(this._treeEditForBufferChange( - oldRange.start, oldRange.end, newRange.end, oldText, newText - )) + handleTextChange (edit, oldText, newText) { + const {startPosition, oldEndPosition, newEndPosition} = edit + if (this.tree) { + this.tree.edit(edit) if (this.editedRange) { - if (newRange.start.isLessThan(this.editedRange.start)) { - this.editedRange.start = newRange.start + if (startPosition.isLessThan(this.editedRange.start)) { + this.editedRange.start = startPosition } - if (oldRange.end.isLessThan(this.editedRange.end)) { - this.editedRange.end = newRange.end.traverse(this.editedRange.end.traversalFrom(oldRange.end)) + if (oldEndPosition.isLessThan(this.editedRange.end)) { + this.editedRange.end = newEndPosition.traverse(this.editedRange.end.traversalFrom(oldEndPosition)) } else { - this.editedRange.end = newRange.end + this.editedRange.end = newEndPosition } } else { - this.editedRange = newRange.copy() + this.editedRange = new Range(startPosition, newEndPosition) } } if (this.patchSinceCurrentParseStarted) { this.patchSinceCurrentParseStarted.splice( - oldRange.start, - oldRange.getExtent(), - newRange.getExtent(), + startPosition, + oldEndPosition.traversalFrom(startPosition), + newEndPosition.traversalFrom(startPosition), oldText, newText )