Skip to content

Commit 7140762

Browse files
committed
Refactor Node at offset visitor
Trying to reduce time spent in the visitor
1 parent b1ef888 commit 7140762

File tree

3 files changed

+70
-60
lines changed

3 files changed

+70
-60
lines changed

pkgs/sass_language_services/lib/src/features/document_highlights/document_highlights_feature.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ class DocumentHighlightsFeature extends LanguageFeature {
1515
List<lsp.DocumentHighlight> findDocumentHighlights(
1616
TextDocument document, lsp.Position position) {
1717
var stylesheet = ls.parseStylesheet(document);
18+
1819
// Find the node whose definition we're looking for.
1920
var offset = document.offsetAt(position);
20-
var visitor = NodeAtOffsetVisitor(offset);
21-
var node = stylesheet.accept(visitor);
21+
var node = getNodeAtOffset(stylesheet, offset);
2222
if (node == null || node is sass.Stylesheet) {
2323
return [];
2424
}

pkgs/sass_language_services/lib/src/features/go_to_definition/go_to_definition_feature.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ class GoToDefinitionFeature extends LanguageFeature {
2929

3030
// Find the node whose definition we're looking for.
3131
var offset = document.offsetAt(position);
32-
var visitor = NodeAtOffsetVisitor(offset);
33-
var node = stylesheet.accept(visitor);
32+
var node = getNodeAtOffset(stylesheet, offset);
3433
if (node == null) {
3534
return null;
3635
}
Lines changed: 67 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,269 +1,280 @@
11
import 'package:sass_api/sass_api.dart' as sass;
22

3+
sass.AstNode? getNodeAtOffset(sass.ParentStatement node, int offset) {
4+
if (node.span.start.offset > offset || offset > node.span.end.offset) {
5+
return null;
6+
}
7+
var visitor = NodeAtOffsetVisitor(offset);
8+
var result = node.accept(visitor);
9+
// The visitor might have reached the end of the syntax tree,
10+
// in which case result is null. We still might have a candidate.
11+
return result ?? visitor.candidate;
12+
}
13+
314
class NodeAtOffsetVisitor
415
with
516
sass.StatementSearchVisitor<sass.AstNode>,
617
sass.AstSearchVisitor<sass.AstNode> {
7-
sass.AstNode? _candidate;
18+
sass.AstNode? candidate;
819
final int _offset;
920

1021
/// Finds the node with the shortest span at [offset].
1122
NodeAtOffsetVisitor(int offset) : _offset = offset;
1223

1324
sass.AstNode? _process(sass.AstNode node) {
14-
var spanContainsOffset =
25+
var containsOffset =
1526
node.span.start.offset <= _offset && node.span.end.offset >= _offset;
1627

17-
if (spanContainsOffset) {
18-
if (_candidate == null) {
19-
_candidate = node;
20-
} else if (node.span.length <= _candidate!.span.length) {
21-
_candidate = node;
28+
if (containsOffset) {
29+
if (candidate == null) {
30+
candidate = node;
31+
} else if (node.span.length <= candidate!.span.length) {
32+
candidate = node;
2233
}
2334
}
2435

25-
if (node.span.start.offset > _offset || node is sass.Stylesheet) {
26-
return _candidate;
36+
if (node.span.start.offset > _offset) {
37+
return candidate;
2738
}
2839

2940
return null;
3041
}
3142

3243
@override
3344
sass.AstNode? visitArgumentInvocation(sass.ArgumentInvocation invocation) {
34-
return super.visitArgumentInvocation(invocation) ?? _process(invocation);
45+
return _process(invocation) ?? super.visitArgumentInvocation(invocation);
3546
}
3647

3748
@override
3849
sass.AstNode? visitAtRootRule(sass.AtRootRule node) {
39-
return super.visitAtRootRule(node) ?? _process(node);
50+
return _process(node) ?? super.visitAtRootRule(node);
4051
}
4152

4253
@override
4354
sass.AstNode? visitAtRule(sass.AtRule node) {
44-
return super.visitAtRule(node) ?? _process(node);
55+
return _process(node) ?? super.visitAtRule(node);
4556
}
4657

4758
@override
4859
sass.AstNode? visitBinaryOperationExpression(
4960
sass.BinaryOperationExpression node) {
50-
return super.visitBinaryOperationExpression(node) ?? _process(node);
61+
return _process(node) ?? super.visitBinaryOperationExpression(node);
5162
}
5263

5364
@override
5465
sass.AstNode? visitBooleanExpression(sass.BooleanExpression node) {
55-
return super.visitBooleanExpression(node) ?? _process(node);
66+
return _process(node) ?? super.visitBooleanExpression(node);
5667
}
5768

5869
@override
5970
sass.AstNode? visitCallableDeclaration(sass.CallableDeclaration node) {
60-
return super.visitCallableDeclaration(node) ?? _process(node);
71+
return _process(node) ?? super.visitCallableDeclaration(node);
6172
}
6273

6374
@override
6475
sass.AstNode? visitColorExpression(sass.ColorExpression node) {
65-
return super.visitColorExpression(node) ?? _process(node);
76+
return _process(node) ?? super.visitColorExpression(node);
6677
}
6778

6879
@override
6980
sass.AstNode? visitContentBlock(sass.ContentBlock node) {
70-
return super.visitContentBlock(node) ?? _process(node);
81+
return _process(node) ?? super.visitContentBlock(node);
7182
}
7283

7384
@override
7485
sass.AstNode? visitContentRule(sass.ContentRule node) {
75-
return super.visitContentRule(node) ?? _process(node);
86+
return _process(node) ?? super.visitContentRule(node);
7687
}
7788

7889
@override
7990
sass.AstNode? visitDebugRule(sass.DebugRule node) {
80-
return super.visitDebugRule(node) ?? _process(node);
91+
return _process(node) ?? super.visitDebugRule(node);
8192
}
8293

8394
@override
8495
sass.AstNode? visitDeclaration(sass.Declaration node) {
85-
return super.visitDeclaration(node) ?? _process(node);
96+
return _process(node) ?? super.visitDeclaration(node);
8697
}
8798

8899
@override
89100
sass.AstNode? visitEachRule(sass.EachRule node) {
90-
return super.visitEachRule(node) ?? _process(node);
101+
return _process(node) ?? super.visitEachRule(node);
91102
}
92103

93104
@override
94105
sass.AstNode? visitErrorRule(sass.ErrorRule node) {
95-
return super.visitErrorRule(node) ?? _process(node);
106+
return _process(node) ?? super.visitErrorRule(node);
96107
}
97108

98109
@override
99110
sass.AstNode? visitExpression(sass.Expression expression) {
100-
return super.visitExpression(expression) ?? _process(expression);
111+
return _process(expression) ?? super.visitExpression(expression);
101112
}
102113

103114
@override
104115
sass.AstNode? visitExtendRule(sass.ExtendRule node) {
105-
return super.visitExtendRule(node) ?? _process(node);
116+
return _process(node) ?? super.visitExtendRule(node);
106117
}
107118

108119
@override
109120
sass.AstNode? visitForRule(sass.ForRule node) {
110-
return super.visitForRule(node) ?? _process(node);
121+
return _process(node) ?? super.visitForRule(node);
111122
}
112123

113124
@override
114125
sass.AstNode? visitForwardRule(sass.ForwardRule node) {
115-
return super.visitForwardRule(node) ?? _process(node);
126+
return _process(node) ?? super.visitForwardRule(node);
116127
}
117128

118129
@override
119130
sass.AstNode? visitFunctionExpression(sass.FunctionExpression node) {
120-
return super.visitFunctionExpression(node) ?? _process(node);
131+
return _process(node) ?? super.visitFunctionExpression(node);
121132
}
122133

123134
@override
124135
sass.AstNode? visitFunctionRule(sass.FunctionRule node) {
125-
return super.visitFunctionRule(node) ?? _process(node);
136+
return _process(node) ?? super.visitFunctionRule(node);
126137
}
127138

128139
@override
129140
sass.AstNode? visitIfExpression(sass.IfExpression node) {
130-
return super.visitIfExpression(node) ?? _process(node);
141+
return _process(node) ?? super.visitIfExpression(node);
131142
}
132143

133144
@override
134145
sass.AstNode? visitIfRule(sass.IfRule node) {
135-
return super.visitIfRule(node) ?? _process(node);
146+
return _process(node) ?? super.visitIfRule(node);
136147
}
137148

138149
@override
139150
sass.AstNode? visitImportRule(sass.ImportRule node) {
140-
return super.visitImportRule(node) ?? _process(node);
151+
return _process(node) ?? super.visitImportRule(node);
141152
}
142153

143154
@override
144155
sass.AstNode? visitIncludeRule(sass.IncludeRule node) {
145-
return super.visitIncludeRule(node) ?? _process(node);
156+
return _process(node) ?? super.visitIncludeRule(node);
146157
}
147158

148159
@override
149160
sass.AstNode? visitListExpression(sass.ListExpression node) {
150-
return super.visitListExpression(node) ?? _process(node);
161+
return _process(node) ?? super.visitListExpression(node);
151162
}
152163

153164
@override
154165
sass.AstNode? visitLoudComment(sass.LoudComment node) {
155-
return super.visitLoudComment(node) ?? _process(node);
166+
return _process(node) ?? super.visitLoudComment(node);
156167
}
157168

158169
@override
159170
sass.AstNode? visitMapExpression(sass.MapExpression node) {
160-
return super.visitMapExpression(node) ?? _process(node);
171+
return _process(node) ?? super.visitMapExpression(node);
161172
}
162173

163174
@override
164175
sass.AstNode? visitMediaRule(sass.MediaRule node) {
165-
return super.visitMediaRule(node) ?? _process(node);
176+
return _process(node) ?? super.visitMediaRule(node);
166177
}
167178

168179
@override
169180
sass.AstNode? visitMixinRule(sass.MixinRule node) {
170-
return super.visitMixinRule(node) ?? _process(node);
181+
return _process(node) ?? super.visitMixinRule(node);
171182
}
172183

173184
@override
174185
sass.AstNode? visitNullExpression(sass.NullExpression node) {
175-
return super.visitNullExpression(node) ?? _process(node);
186+
return _process(node) ?? super.visitNullExpression(node);
176187
}
177188

178189
@override
179190
sass.AstNode? visitNumberExpression(sass.NumberExpression node) {
180-
return super.visitNumberExpression(node) ?? _process(node);
191+
return _process(node) ?? super.visitNumberExpression(node);
181192
}
182193

183194
@override
184195
sass.AstNode? visitParenthesizedExpression(
185196
sass.ParenthesizedExpression node) {
186-
return super.visitParenthesizedExpression(node) ?? _process(node);
197+
return _process(node) ?? super.visitParenthesizedExpression(node);
187198
}
188199

189200
@override
190201
sass.AstNode? visitReturnRule(sass.ReturnRule node) {
191-
return super.visitReturnRule(node) ?? _process(node);
202+
return _process(node) ?? super.visitReturnRule(node);
192203
}
193204

194205
@override
195206
sass.AstNode? visitSelectorExpression(sass.SelectorExpression node) {
196-
return super.visitSelectorExpression(node) ?? _process(node);
207+
return _process(node) ?? super.visitSelectorExpression(node);
197208
}
198209

199210
@override
200211
sass.AstNode? visitSilentComment(sass.SilentComment node) {
201-
return super.visitSilentComment(node) ?? _process(node);
212+
return _process(node) ?? super.visitSilentComment(node);
202213
}
203214

204215
@override
205216
sass.AstNode? visitStringExpression(sass.StringExpression node) {
206-
return super.visitStringExpression(node) ?? _process(node);
217+
return _process(node) ?? super.visitStringExpression(node);
207218
}
208219

209220
@override
210221
sass.AstNode? visitStyleRule(sass.StyleRule node) {
211-
return super.visitStyleRule(node) ?? _process(node);
222+
return _process(node) ?? super.visitStyleRule(node);
212223
}
213224

214225
@override
215226
sass.AstNode? visitStylesheet(sass.Stylesheet node) {
216-
return super.visitStylesheet(node) ?? _process(node);
227+
return _process(node) ?? super.visitStylesheet(node);
217228
}
218229

219230
@override
220231
sass.AstNode? visitSupportsCondition(sass.SupportsCondition condition) {
221-
return super.visitSupportsCondition(condition) ?? _process(condition);
232+
return _process(condition) ?? super.visitSupportsCondition(condition);
222233
}
223234

224235
@override
225236
sass.AstNode? visitSupportsExpression(sass.SupportsExpression node) {
226-
return super.visitSupportsExpression(node) ?? _process(node);
237+
return _process(node) ?? super.visitSupportsExpression(node);
227238
}
228239

229240
@override
230241
sass.AstNode? visitSupportsRule(sass.SupportsRule node) {
231-
return super.visitSupportsRule(node) ?? _process(node);
242+
return _process(node) ?? super.visitSupportsRule(node);
232243
}
233244

234245
@override
235246
sass.AstNode? visitUnaryOperationExpression(
236247
sass.UnaryOperationExpression node) {
237-
return super.visitUnaryOperationExpression(node) ?? _process(node);
248+
return _process(node) ?? super.visitUnaryOperationExpression(node);
238249
}
239250

240251
@override
241252
sass.AstNode? visitUseRule(sass.UseRule node) {
242-
return super.visitUseRule(node) ?? _process(node);
253+
return _process(node) ?? super.visitUseRule(node);
243254
}
244255

245256
@override
246257
sass.AstNode? visitValueExpression(sass.ValueExpression node) {
247-
return super.visitValueExpression(node) ?? _process(node);
258+
return _process(node) ?? super.visitValueExpression(node);
248259
}
249260

250261
@override
251262
sass.AstNode? visitVariableDeclaration(sass.VariableDeclaration node) {
252-
return super.visitVariableDeclaration(node) ?? _process(node);
263+
return _process(node) ?? super.visitVariableDeclaration(node);
253264
}
254265

255266
@override
256267
sass.AstNode? visitVariableExpression(sass.VariableExpression node) {
257-
return super.visitVariableExpression(node) ?? _process(node);
268+
return _process(node) ?? super.visitVariableExpression(node);
258269
}
259270

260271
@override
261272
sass.AstNode? visitWarnRule(sass.WarnRule node) {
262-
return super.visitWarnRule(node) ?? _process(node);
273+
return _process(node) ?? super.visitWarnRule(node);
263274
}
264275

265276
@override
266277
sass.AstNode? visitWhileRule(sass.WhileRule node) {
267-
return super.visitWhileRule(node) ?? _process(node);
278+
return _process(node) ?? super.visitWhileRule(node);
268279
}
269280
}

0 commit comments

Comments
 (0)