From 311b28a3a5b86b5bc061d30408f2919477fac2c8 Mon Sep 17 00:00:00 2001 From: Ashi Krishnan Date: Fri, 20 Jul 2018 21:16:59 -0400 Subject: [PATCH] Added getSyntaxNodeAtPosition and getSyntaxNodeContainingRange, tested --- src/tree-sitter-language-mode.js | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/tree-sitter-language-mode.js b/src/tree-sitter-language-mode.js index eac0c7894..d60a57590 100644 --- a/src/tree-sitter-language-mode.js +++ b/src/tree-sitter-language-mode.js @@ -20,6 +20,13 @@ class TreeSitterLanguageMode { } }) } + if (!Parser.SyntaxNode.prototype.hasOwnProperty('range')) { + Object.defineProperty(Parser.SyntaxNode.prototype, 'range', { + get () { + return rangeForNode(this) + } + }) + } } constructor ({buffer, grammar, config, grammars}) { @@ -349,12 +356,11 @@ class TreeSitterLanguageMode { Section - Syntax Tree APIs */ - getRangeForSyntaxNodeContainingRange (range, where = _ => true) { + getSyntaxNodeContainingRange (range, where = _ => true) { const startIndex = this.buffer.characterIndexForPosition(range.start) const endIndex = this.buffer.characterIndexForPosition(range.end) const searchEndIndex = Math.max(0, endIndex - 1) - let smallestNode this._forEachTreeWithRange(range, tree => { if (typeof selector === 'function') debugger @@ -368,7 +374,11 @@ class TreeSitterLanguageMode { } }) - if (smallestNode) return rangeForNode(smallestNode) + return smallestNode + } + + getSyntaxNodeAtPosition (position, where) { + return this.getSyntaxNodeContainingRange(new Range(position, position), where) } bufferRangeForScopeAtPosition (selector, position) { @@ -377,7 +387,8 @@ class TreeSitterLanguageMode { selector = ({type}) => match(type) } if (selector === null) selector = undefined - return this.getRangeForSyntaxNodeContainingRange(new Range(position, position), selector) + const node = this.getSyntaxNodeAtPosition(position, selector) + return node && node.range } /*