WIP - put back parse queue

This commit is contained in:
Max Brunsfeld
2018-07-09 16:01:05 -07:00
parent 10d8d515ba
commit 79071996a6

View File

@@ -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) {