@@ -3,25 +3,30 @@ import { getTrees, queryNode, toPoint, toRange } from "../TreeSitter";
33
44export const DocumentHighlightProvider : vscode . DocumentHighlightProvider = {
55 provideDocumentHighlights ( document : vscode . TextDocument , position : vscode . Position , token : vscode . CancellationToken ) : vscode . DocumentHighlight [ ] | undefined {
6- // vscode.window.showInformationMessage(JSON.stringify("DocumentHighlights") );
6+ // vscode.window.showInformationMessage(`DocumentHighlights ${ JSON.stringify(position)}\n${JSON.stringify(document)}` );
77 // const start = performance.now();
88 const trees = getTrees ( document ) ;
9- const jsonTree = trees . jsonTree ;
9+ const rootNode = trees . jsonTree . rootNode ;
1010 const point = toPoint ( position ) ;
1111
1212 const cursorQuery = `;scm
13- (key) @key
14- (value !scopeName !ruleName !self !base) @value
1513 (capture . (key) @key)
1614 (repo . (key) @repo)
1715 (json (scopeName (value) @rootScopeName))
18- (include (value (scopeName) !ruleName !base) @scopeName )
16+ (include (value (scopeName) @scopeName !ruleName !base))
1917 (include (value (ruleName)) @include)
2018 (include (value !scopeName (self) @self))
2119 (include (value (base) @base))
22- (name (value (scope) @scope))
20+ (name (value (scope) @name))
21+ (contentName (value (scope) @name))
22+ (injectionSelector (value (scope) @injection))
23+ (injection (key (scope) @injection))
2324 ` ;
24- const cursorCapture = queryNode ( jsonTree . rootNode , cursorQuery , point ) ;
25+ const fallbackQuery = `;scm
26+ (key) @key
27+ (value !scopeName !ruleName !self !base) @value
28+ ` ;
29+ const cursorCapture = queryNode ( rootNode , cursorQuery , point ) || queryNode ( rootNode , fallbackQuery , point ) ;
2530 // vscode.window.showInformationMessage(JSON.stringify(cursorCapture));
2631 if ( ! cursorCapture ) {
2732 return ;
@@ -34,18 +39,22 @@ export const DocumentHighlightProvider: vscode.DocumentHighlightProvider = {
3439
3540
3641 // const scopeName = cursorNode.parent.childForFieldName('scopeName')?.text;
37- const rootScopeName = queryNode ( jsonTree . rootNode , `(json (scopeName (value) @scopeName))` ) . pop ( ) ?. node ?. text ;
42+ const rootScopeName = queryNode ( rootNode , `(json (scopeName (value) @scopeName))` ) . pop ( ) ?. node ?. text ;
3843
3944
4045 let query = `` ;
4146 switch ( cursorName ) {
4247 case 'key' :
4348 const cursorType = cursorNode . parent ! . type ;
44- if ( cursorType != 'repo' ) {
45- query = `(${ cursorType } . (key) @key (#eq? @key "${ cursorText } "))` ;
46- break ;
47- }
48- // FallThrough
49+ query = `;scm
50+ (${ cursorType } . (key) @key (#eq? @key "${ cursorText } "))
51+ ` ;
52+ break ;
53+ case 'value' :
54+ query = `;scm
55+ ((value) @value (#eq? @value "${ cursorText } "))
56+ ` ;
57+ break ;
4958 case 'repo' :
5059 query = `;scm
5160 (repo (key) @repo (#eq? @repo "${ cursorText } "))
@@ -57,46 +66,83 @@ export const DocumentHighlightProvider: vscode.DocumentHighlightProvider = {
5766 )
5867 ` ;
5968 break ;
60- case 'value' :
61- query = `(_ (value) @value (#eq? @value "${ cursorText } "))` ;
62- break ;
6369 case 'self' :
6470 case 'rootScopeName' :
65- query = `(json (scopeName (value) @scopeName))` ;
66- query += `(include (value (scopeName) @_scopeName (#eq? @_scopeName "${ rootScopeName } ") !ruleName !base) @include)` ;
67- query += `(include (value (self) !scopeName) @self)` ;
71+ query = `;scm
72+ (json (scopeName (value) @scopeName))
73+ (include (value (scopeName) @scopeName (#eq? @scopeName "${ rootScopeName } ") !base))
74+ (include (value (self) !scopeName) @self)
75+ (injectionSelector (value (scope) @scope (#eq? @scope "${ cursorText } ")))
76+ (injection (key (scope) @scope (#eq? @scope "${ cursorText } ")))
77+ ` ;
6878 break ;
6979 case 'base' :
70- query = `(include (value (base)) @base)` ;
80+ query = `;scm
81+ (include (value (base)) @base)
82+ ` ;
7183 break ;
7284 case 'scopeName' :
73- const scopeName = cursorNode . childForFieldName ( 'scopeName' ) ?. text ;
74- query = `(include (value (scopeName) @_scopeName (#eq? @_scopeName "${ scopeName } ") !ruleName !base) @include)` ;
75- if ( scopeName == rootScopeName ) {
76- query += `(json (scopeName (value) @scopeName))` ;
77- query += `(include (value (self) !scopeName) @self)` ;
85+ query = `;scm
86+ (include (value (scopeName) @scopeName (#eq? @scopeName "${ cursorText } ") !base))
87+ (injectionSelector (value (scope) @scope (#eq? @scope "${ cursorText } ")))
88+ (injection (key (scope) @scope (#eq? @scope "${ cursorText } ")))
89+ ` ;
90+ if ( cursorText == rootScopeName ) {
91+ query += `;scm
92+ (json (scopeName (value) @scopeName))
93+ (include (value (self) !scopeName) @self)
94+ ` ;
7895 }
7996 break ;
8097 case 'include' :
81- const scopeName2 = cursorNode . childForFieldName ( 'scopeName' ) ?. text ;
82- const ruleName = cursorNode . childForFieldName ( 'ruleName' ) ?. text ;
83- if ( ! scopeName2 || scopeName2 == rootScopeName ) {
84- query = `(include (value (scopeName)? @_scopeName (#eq? @_scopeName "${ scopeName2 ?? rootScopeName } ") (ruleName) @_ruleName (#eq? @_ruleName "${ ruleName } ")) @include)` ;
85- query += `(repo (key) @repo (#eq? @repo "${ ruleName } "))` ;
98+ const scopeName = cursorNode . childForFieldName ( 'scopeName' ) ?. text || '' ;
99+ const ruleName = cursorNode . childForFieldName ( 'ruleName' ) ?. text || '' ;
100+ if ( ! scopeName || scopeName == rootScopeName ) {
101+ query = `;scm
102+ (include
103+ (value
104+ (scopeName)? @_scopeName (#eq? @_scopeName "${ scopeName || rootScopeName } ")
105+ (ruleName) @_ruleName (#eq? @_ruleName "${ ruleName } ")
106+ ) @include
107+ )
108+ (repo (key) @repo (#eq? @repo "${ ruleName } "))
109+ ` ;
86110 }
87111 else {
88- query = `(include (value (scopeName) @_scopeName (#eq? @_scopeName "${ scopeName2 } ") (ruleName) @_ruleName (#eq? @_ruleName "${ ruleName } ")) @include)` ;
112+ query = `;scm
113+ (include
114+ (value
115+ (scopeName) @_scopeName (#eq? @_scopeName "${ scopeName } ")
116+ (ruleName) @_ruleName (#eq? @_ruleName "${ ruleName } ")
117+ ) @include
118+ )
119+ ` ;
89120 }
90121 break ;
91- case 'scope' :
92- query = `(name (value (scope) @scope (#eq? @scope "${ cursorText } ")))` ;
122+ case 'name' :
123+ query = `;scm
124+ (name (value (scope) @scope (#eq? @scope "${ cursorText } ")))
125+ (contentName (value (scope) @scope (#eq? @scope "${ cursorText } ")))
126+ (injectionSelector (value (scope) @scope (#eq? @scope "${ cursorText } ")))
127+ (injection (key (scope) @scope (#eq? @scope "${ cursorText } ")))
128+ ` ;
129+ break ;
130+ case 'injection' :
131+ query = `;scm
132+ (name (value (scope) @scope (#eq? @scope "${ cursorText } ")))
133+ (contentName (value (scope) @scope (#eq? @scope "${ cursorText } ")))
134+ (injectionSelector (value (scope) @scope (#eq? @scope "${ cursorText } ")))
135+ (injection (key (scope) @scope (#eq? @scope "${ cursorText } ")))
136+ (include (value (scopeName) @scopeName (#eq? @scopeName "${ cursorText } ") !base))
137+ (json (scopeName (value) @scopeName (#eq? @scopeName "${ cursorText } ")))
138+ ` ;
93139 break ;
94140 default :
95141 return ;
96142 }
97143
98144 const documentHighlights : vscode . DocumentHighlight [ ] = [ ] ;
99- const queryCaptures = queryNode ( jsonTree . rootNode , query ) ;
145+ const queryCaptures = queryNode ( rootNode , query ) ;
100146 for ( const queryCapture of queryCaptures ) {
101147 if ( queryCapture . name . charAt ( 0 ) == '_' ) {
102148 // Ignore internal use captures
@@ -108,7 +154,7 @@ export const DocumentHighlightProvider: vscode.DocumentHighlightProvider = {
108154 documentHighlights . push ( documentHighlight ) ;
109155 }
110156
111- // vscode.window.showInformationMessage(`documentHighlights ${(performance.now() - start).toFixed(3)}ms\n${JSON.stringify(documentHighlights)}`);
157+ // vscode.window.showInformationMessage(`documentHighlights ${(performance.now() - start).toFixed(3)}ms\n${query}\n${ JSON.stringify(documentHighlights)}`);
112158 return documentHighlights ;
113159 }
114160} ;
0 commit comments