diff --git a/spec/tree-sitter-language-mode-spec.js b/spec/tree-sitter-language-mode-spec.js index 5797bb773..2b8283067 100644 --- a/spec/tree-sitter-language-mode-spec.js +++ b/spec/tree-sitter-language-mode-spec.js @@ -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']}, + ] + ]) + resolve() + }) + }) + + atom.grammars.addGrammar(jsGrammar) + atom.grammars.addGrammar(htmlGrammar) + buffer.setText('') + + const languageMode = new TreeSitterLanguageMode({buffer, grammar: htmlGrammar, grammars: atom.grammars}) + buffer.setLanguageMode(languageMode) + + await promise + }) }) }) diff --git a/src/tree-sitter-language-mode.js b/src/tree-sitter-language-mode.js index c229cec19..9d42386e4 100644 --- a/src/tree-sitter-language-mode.js +++ b/src/tree-sitter-language-mode.js @@ -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: [],