diff --git a/src/selectors.js b/src/selectors.js index f6f415149..3d4372e1e 100644 --- a/src/selectors.js +++ b/src/selectors.js @@ -22,6 +22,7 @@ const always = scope => true // true iff the scope matches the selector. function matcherForSelector (selector) { const parts = parse(selector) + if (typeof parts === 'function') return parts return selector ? scope => isSubset(parts, parse(scope)) : always diff --git a/src/tree-sitter-language-mode.js b/src/tree-sitter-language-mode.js index 70555d1eb..eac0c7894 100644 --- a/src/tree-sitter-language-mode.js +++ b/src/tree-sitter-language-mode.js @@ -349,18 +349,18 @@ class TreeSitterLanguageMode { Section - Syntax Tree APIs */ - getRangeForSyntaxNodeContainingRange (range, selector) { + getRangeForSyntaxNodeContainingRange (range, where = _ => true) { const startIndex = this.buffer.characterIndexForPosition(range.start) const endIndex = this.buffer.characterIndexForPosition(range.end) const searchEndIndex = Math.max(0, endIndex - 1) - const matches = matcherForSelector(selector) let smallestNode this._forEachTreeWithRange(range, tree => { + if (typeof selector === 'function') debugger let node = tree.rootNode.descendantForIndex(startIndex, searchEndIndex) while (node) { - if (nodeContainsIndices(node, startIndex, endIndex) && matches(node.type)) { + if (nodeContainsIndices(node, startIndex, endIndex) && where(node)) { if (nodeIsSmaller(node, smallestNode)) smallestNode = node break } @@ -372,6 +372,11 @@ class TreeSitterLanguageMode { } bufferRangeForScopeAtPosition (selector, position) { + if (typeof selector === 'string') { + const match = matcherForSelector(selector) + selector = ({type}) => match(type) + } + if (selector === null) selector = undefined return this.getRangeForSyntaxNodeContainingRange(new Range(position, position), selector) }