@@ -3,25 +3,30 @@ import { getTrees, queryNode, toPoint, toRange } from "../TreeSitter";
3
3
4
4
export const DocumentHighlightProvider : vscode . DocumentHighlightProvider = {
5
5
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)}` );
7
7
// const start = performance.now();
8
8
const trees = getTrees ( document ) ;
9
- const jsonTree = trees . jsonTree ;
9
+ const rootNode = trees . jsonTree . rootNode ;
10
10
const point = toPoint ( position ) ;
11
11
12
12
const cursorQuery = `;scm
13
- (key) @key
14
- (value !scopeName !ruleName !self !base) @value
15
13
(capture . (key) @key)
16
14
(repo . (key) @repo)
17
15
(json (scopeName (value) @rootScopeName))
18
- (include (value (scopeName) !ruleName !base) @scopeName )
16
+ (include (value (scopeName) @scopeName !ruleName !base))
19
17
(include (value (ruleName)) @include)
20
18
(include (value !scopeName (self) @self))
21
19
(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))
23
24
` ;
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 ) ;
25
30
// vscode.window.showInformationMessage(JSON.stringify(cursorCapture));
26
31
if ( ! cursorCapture ) {
27
32
return ;
@@ -34,18 +39,22 @@ export const DocumentHighlightProvider: vscode.DocumentHighlightProvider = {
34
39
35
40
36
41
// 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 ;
38
43
39
44
40
45
let query = `` ;
41
46
switch ( cursorName ) {
42
47
case 'key' :
43
48
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 ;
49
58
case 'repo' :
50
59
query = `;scm
51
60
(repo (key) @repo (#eq? @repo "${ cursorText } "))
@@ -57,46 +66,83 @@ export const DocumentHighlightProvider: vscode.DocumentHighlightProvider = {
57
66
)
58
67
` ;
59
68
break ;
60
- case 'value' :
61
- query = `(_ (value) @value (#eq? @value "${ cursorText } "))` ;
62
- break ;
63
69
case 'self' :
64
70
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
+ ` ;
68
78
break ;
69
79
case 'base' :
70
- query = `(include (value (base)) @base)` ;
80
+ query = `;scm
81
+ (include (value (base)) @base)
82
+ ` ;
71
83
break ;
72
84
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
+ ` ;
78
95
}
79
96
break ;
80
97
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
+ ` ;
86
110
}
87
111
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
+ ` ;
89
120
}
90
121
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
+ ` ;
93
139
break ;
94
140
default :
95
141
return ;
96
142
}
97
143
98
144
const documentHighlights : vscode . DocumentHighlight [ ] = [ ] ;
99
- const queryCaptures = queryNode ( jsonTree . rootNode , query ) ;
145
+ const queryCaptures = queryNode ( rootNode , query ) ;
100
146
for ( const queryCapture of queryCaptures ) {
101
147
if ( queryCapture . name . charAt ( 0 ) == '_' ) {
102
148
// Ignore internal use captures
@@ -108,7 +154,7 @@ export const DocumentHighlightProvider: vscode.DocumentHighlightProvider = {
108
154
documentHighlights . push ( documentHighlight ) ;
109
155
}
110
156
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)}`);
112
158
return documentHighlights ;
113
159
}
114
160
} ;
0 commit comments