From 79071996a663925e8dbdadf79ff91181e4d39b6e Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 9 Jul 2018 16:01:05 -0700 Subject: [PATCH] WIP - put back parse queue --- src/tree-sitter-language-mode.js | 34 +++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/tree-sitter-language-mode.js b/src/tree-sitter-language-mode.js index 53efc0771..7bfaaf3ec 100644 --- a/src/tree-sitter-language-mode.js +++ b/src/tree-sitter-language-mode.js @@ -5,6 +5,7 @@ const {Emitter, Disposable} = require('event-kit') const ScopeDescriptor = require('./scope-descriptor') const TokenizedLine = require('./tokenized-line') const TextMateLanguageMode = require('./text-mate-language-mode') +const async = require('async') let nextId = 0 const MAX_RANGE = new Range(Point.ZERO, Point.INFINITY).freeze() @@ -55,6 +56,18 @@ class TreeSitterLanguageMode { this.grammarForLanguageString = this.grammarForLanguageString.bind(this) this.emitRangeUpdate = this.emitRangeUpdate.bind(this) + this.parsers = [] + this.parseQueue = async.queue(async ({language, oldTree, ranges}, done) => { + const parser = this.parsers.pop() || new Parser() + parser.setLanguage(language) + const newTree = await parser.parseTextBuffer(this.buffer.buffer, oldTree, { + syncOperationLimit: 1000, + includedRanges: ranges + }) + this.parsers.push(parser) + done(null, newTree) + }, 2) + this.subscription = this.buffer.onDidChangeText(({changes}) => { for (let i = changes.length - 1; i >= 0; i--) { const {oldRange, newRange} = changes[i] @@ -96,6 +109,12 @@ class TreeSitterLanguageMode { } } + parse (language, oldTree, ranges) { + return new Promise(resolve => + this.parseQueue.push({language, oldTree, ranges}, (error, tree) => resolve(tree)) + ) + } + get tree () { return this.rootLanguageLayer.tree } @@ -275,7 +294,7 @@ class TreeSitterLanguageMode { for (const injectionMarker of injectionMarkers) { const {tree, grammar} = injectionMarker.languageLayer - callback(tree, grammar) + if (tree) callback(tree, grammar) } } @@ -524,11 +543,10 @@ class LanguageLayer { if (includedRanges.length === 0) return } - this.languageMode.parser.setLanguage(this.grammar.languageModule) - const tree = await this.languageMode.parser.parseTextBuffer( - this.languageMode.buffer.buffer, + const tree = await this.languageMode.parse( + this.grammar.languageModule, this.tree, - {syncOperationLimit: 1000, includedRanges} + includedRanges ) tree.buffer = this.languageMode.buffer @@ -563,7 +581,7 @@ class LanguageLayer { await this._populateInjections(affectedRange, nodeRangeSet) } - async _populateInjections (range, nodeRangeSet) { + _populateInjections (range, nodeRangeSet) { const {injectionsMarkerLayer, grammarForLanguageString} = this.languageMode const existingInjectionMarkers = injectionsMarkerLayer @@ -621,9 +639,11 @@ class LanguageLayer { } } + const promises = [] for (const [marker, nodeRangeSet] of markersToUpdate) { - await marker.languageLayer.update(nodeRangeSet) + promises.push(marker.languageLayer.update(nodeRangeSet)) } + return Promise.all(promises) } _treeEditForBufferChange (start, oldEnd, newEnd, oldText, newText) {