Merge branch 'tree-sitter-injections' of github.com:atom/atom into tree-sitter-injections

This commit is contained in:
Ashi Krishnan
2018-07-05 13:09:28 -04:00
6 changed files with 64 additions and 9 deletions

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()
@@ -30,6 +31,19 @@ class TreeSitterLanguageMode {
this.parser = new Parser()
this.rootLanguageLayer = new LanguageLayer(this, grammar)
this.injectionsMarkerLayer = buffer.addMarkerLayer()
this.updatedGrammars = []
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.rootScopeDescriptor = new ScopeDescriptor({scopes: [this.grammar.id]})
this.emitter = new Emitter()
@@ -80,6 +94,14 @@ 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
}
@@ -476,11 +498,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
@@ -566,9 +587,11 @@ class LanguageLayer {
}
}
const promises = []
for (const [marker, injectionNode] of markersToUpdate) {
await marker.languageLayer.update(injectionNode)
promises.push(marker.languageLayer.update(injectionNode))
}
return Promise.all(promises)
}
/**

View File

@@ -1268,7 +1268,8 @@ module.exports = class Workspace extends Model {
handleGrammarUsed (grammar) {
if (grammar == null) { return }
return this.packageManager.triggerActivationHook(`${grammar.packageName}:grammar-used`)
this.packageManager.triggerActivationHook(`${grammar.scopeName}:root-scope-used`)
this.packageManager.triggerActivationHook(`${grammar.packageName}:grammar-used`)
}
// Public: Returns a {Boolean} that is `true` if `object` is a `TextEditor`.