Merge pull request #17801 from atom/mb-tree-sitter-onDidTokenize

Emit onDidTokenize event from TreeSitterLanguageMode
This commit is contained in:
Max Brunsfeld
2018-08-08 09:11:34 -07:00
committed by GitHub
2 changed files with 41 additions and 7 deletions

View File

@@ -210,9 +210,6 @@ describe('TreeSitterLanguageMode', () => {
buffer.setLanguageMode(languageMode)
await nextHighlightingUpdate(languageMode)
console.log(languageMode.tree.rootNode.toString());
console.log(languageMode.grammar.scopeMap);
expectTokensToEqual(editor, [
[
{text: 'a', scopes: ['function']},
@@ -728,6 +725,39 @@ describe('TreeSitterLanguageMode', () => {
],
])
})
it('notifies onDidTokenize listeners the first time all syntax highlighting is done', async () => {
const promise = new Promise(resolve => {
editor.onDidTokenize(event => {
expectTokensToEqual(editor, [
[
{text: '<', scopes: ['html']},
{text: 'script', scopes: ['html', 'tag']},
{text: '>', scopes: ['html']},
],
[
{text: 'hello', scopes: ['html', 'function']},
{text: '();', scopes: ['html']},
],
[
{text: '</', scopes: ['html']},
{text: 'script', scopes: ['html', 'tag']},
{text: '>', scopes: ['html']},
]
])
resolve()
})
})
atom.grammars.addGrammar(jsGrammar)
atom.grammars.addGrammar(htmlGrammar)
buffer.setText('<script>\nhello();\n</script>')
const languageMode = new TreeSitterLanguageMode({buffer, grammar: htmlGrammar, grammars: atom.grammars})
buffer.setLanguageMode(languageMode)
await promise
})
})
})

View File

@@ -1,7 +1,7 @@
const Parser = require('tree-sitter')
const {Point, Range, spliceArray} = require('text-buffer')
const {Patch} = require('superstring')
const {Emitter, Disposable} = require('event-kit')
const {Emitter} = require('event-kit')
const ScopeDescriptor = require('./scope-descriptor')
const TokenizedLine = require('./tokenized-line')
const TextMateLanguageMode = require('./text-mate-language-mode')
@@ -63,7 +63,9 @@ class TreeSitterLanguageMode {
this.rootLanguageLayer.update(null)
})
this.rootLanguageLayer.update(null)
this.rootLanguageLayer.update(null).then(() =>
this.emitter.emit('did-tokenize')
)
// TODO: Remove this once TreeSitterLanguageMode implements its own auto-indentation system. This
// is temporarily needed in order to delegate to the TextMateLanguageMode's auto-indent system.
@@ -119,6 +121,10 @@ class TreeSitterLanguageMode {
return new HighlightIterator(this, layerIterators)
}
onDidTokenize (callback) {
return this.emitter.on('did-tokenize', callback)
}
onDidChangeHighlighting (callback) {
return this.emitter.on('did-change-highlighting', callback)
}
@@ -386,8 +392,6 @@ class TreeSitterLanguageMode {
Section - Backward compatibility shims
*/
onDidTokenize (callback) { return new Disposable(() => {}) }
tokenizedLineForRow (row) {
return new TokenizedLine({
openScopes: [],