diff --git a/spec/tree-sitter-language-mode-spec.js b/spec/tree-sitter-language-mode-spec.js index 6bcd23ead..e1b06dd2d 100644 --- a/spec/tree-sitter-language-mode-spec.js +++ b/spec/tree-sitter-language-mode-spec.js @@ -1360,6 +1360,14 @@ describe('TreeSitterLanguageMode', () => { 'source.js', 'property.name' ]) + + // Drive-by test for .tokenForPosition() + const token = editor.tokenForBufferPosition([0, 'foo({b'.length]) + expect(token.value).toBe('bar') + expect(token.scopes).toEqual([ + 'source.js', + 'property.name' + ]) }) it('includes nodes in injected syntax trees', async () => { diff --git a/src/tree-sitter-language-mode.js b/src/tree-sitter-language-mode.js index 05aeaaa2b..82160c013 100644 --- a/src/tree-sitter-language-mode.js +++ b/src/tree-sitter-language-mode.js @@ -3,6 +3,7 @@ const {Point, Range, spliceArray} = require('text-buffer') const {Patch} = require('superstring') const {Emitter} = require('event-kit') const ScopeDescriptor = require('./scope-descriptor') +const Token = require('./token') const TokenizedLine = require('./tokenized-line') const TextMateLanguageMode = require('./text-mate-language-mode') const {matcherForSelector} = require('./selectors') @@ -435,6 +436,12 @@ class TreeSitterLanguageMode { return new ScopeDescriptor({scopes}) } + tokenForPosition (point) { + const node = this.getSyntaxNodeAtPosition(point) + const scopes = this.scopeDescriptorForPosition(point).getScopesArray() + return new Token({value: node.text, scopes}) + } + getGrammar () { return this.grammar }