Skip to content

Commit 159ba9e

Browse files
committed
Tests for scope visitor
1 parent 9adec3b commit 159ba9e

File tree

2 files changed

+91
-47
lines changed

2 files changed

+91
-47
lines changed

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

Lines changed: 48 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import '../document_symbols/stylesheet_document_symbol.dart';
66
import 'scope.dart';
77

88
final deprecated = RegExp(r'///\s*@deprecated');
9+
final scopeStart = RegExp(r'[\{\n]');
910

1011
/// Builds scopes and a list of symbols in those scopes starting at [scope] (typically the global scope).
1112
class ScopeVisitor with sass.RecursiveStatementVisitor {
@@ -55,39 +56,38 @@ class ScopeVisitor with sass.RecursiveStatementVisitor {
5556

5657
@override
5758
void visitAtRule(node) {
58-
if (node.name.isPlain) {
59-
if (node.name.asPlain == 'font-face') {
59+
if (node.children != null) {
60+
var nameEndIndex = node.name.span.end.offset - node.span.start.offset;
61+
var scopeIndex = node.span.text.indexOf(scopeStart, nameEndIndex);
62+
63+
_addScope(
64+
offset: node.span.start.offset + scopeIndex,
65+
length: node.span.length - scopeIndex,
66+
);
67+
}
68+
69+
if (node.name.isPlain && node.name.asPlain!.startsWith('keyframes')) {
70+
var keyframesName = node.span.context.split(' ').elementAtOrNull(1);
71+
if (keyframesName != null) {
72+
var keyframesNameRange = lsp.Range(
73+
start: lsp.Position(
74+
line: node.name.span.start.line,
75+
character: node.name.span.end.column + 1,
76+
),
77+
end: lsp.Position(
78+
line: node.name.span.end.line,
79+
character: node.name.span.end.column + 1 + keyframesName.length,
80+
),
81+
);
82+
6083
_addSymbol(
61-
name: node.name.span.text,
62-
kind: ReferenceKind.atRule,
84+
name: keyframesName,
85+
kind: ReferenceKind.keyframe,
6386
symbolRange: toRange(node.span),
64-
nameRange: toRange(node.name.span),
87+
nameRange: keyframesNameRange,
6588
offset: node.span.start.offset,
6689
length: node.span.length,
6790
);
68-
} else if (node.name.asPlain!.startsWith('keyframes')) {
69-
var keyframesName = node.span.context.split(' ').elementAtOrNull(1);
70-
if (keyframesName != null) {
71-
var keyframesNameRange = lsp.Range(
72-
start: lsp.Position(
73-
line: node.name.span.start.line,
74-
character: node.name.span.end.column + 1,
75-
),
76-
end: lsp.Position(
77-
line: node.name.span.end.line,
78-
character: node.name.span.end.column + 1 + keyframesName.length,
79-
),
80-
);
81-
82-
_addSymbol(
83-
name: keyframesName,
84-
kind: ReferenceKind.keyframe,
85-
symbolRange: toRange(node.span),
86-
nameRange: keyframesNameRange,
87-
offset: node.span.start.offset,
88-
length: node.span.length,
89-
);
90-
}
9191
}
9292
}
9393

@@ -114,9 +114,10 @@ class ScopeVisitor with sass.RecursiveStatementVisitor {
114114

115115
@override
116116
void visitEachRule(sass.EachRule node) {
117+
var lengthSubtract = node.list.span.end.offset - node.span.start.offset;
117118
var scope = _addScope(
118-
offset: node.span.start.offset,
119-
length: node.span.length,
119+
offset: node.list.span.end.offset,
120+
length: node.span.length - lengthSubtract,
120121
);
121122

122123
if (scope != null) {
@@ -150,9 +151,11 @@ class ScopeVisitor with sass.RecursiveStatementVisitor {
150151

151152
@override
152153
void visitForRule(sass.ForRule node) {
154+
var toEndIndex = node.to.span.end.offset - node.span.start.offset;
155+
var scopeIndex = node.span.text.indexOf(scopeStart, toEndIndex);
153156
var scope = _addScope(
154-
offset: node.span.start.offset,
155-
length: node.span.length,
157+
offset: node.span.start.offset + scopeIndex,
158+
length: node.span.length - scopeIndex,
156159
);
157160

158161
if (scope != null) {
@@ -193,9 +196,11 @@ class ScopeVisitor with sass.RecursiveStatementVisitor {
193196
length: node.span.length,
194197
);
195198

199+
var argsEndIndex = node.arguments.span.end.offset - node.span.start.offset;
200+
var scopeIndex = node.span.text.indexOf(scopeStart, argsEndIndex);
196201
var scope = _addScope(
197-
offset: node.span.start.offset,
198-
length: node.span.length,
202+
offset: node.span.start.offset + scopeIndex,
203+
length: node.span.length - scopeIndex,
199204
);
200205

201206
if (scope != null) {
@@ -236,10 +241,13 @@ class ScopeVisitor with sass.RecursiveStatementVisitor {
236241
length: node.span.length,
237242
);
238243

244+
var argsEndIndex = node.arguments.span.end.offset - node.span.start.offset;
245+
var scopeIndex = node.span.text.indexOf(scopeStart, argsEndIndex);
239246
var scope = _addScope(
240-
offset: node.span.start.offset,
241-
length: node.span.length,
247+
offset: node.span.start.offset + scopeIndex,
248+
length: node.span.length - scopeIndex,
242249
);
250+
243251
if (scope != null) {
244252
for (var arg in node.arguments.arguments) {
245253
var range = toRange(arg.span);
@@ -341,9 +349,11 @@ class ScopeVisitor with sass.RecursiveStatementVisitor {
341349

342350
@override
343351
void visitWhileRule(sass.WhileRule node) {
352+
var lengthSubtract =
353+
node.condition.span.end.offset - node.span.start.offset;
344354
_addScope(
345-
offset: node.span.start.offset,
346-
length: node.span.length,
355+
offset: node.condition.span.end.offset,
356+
length: node.span.length - lengthSubtract,
347357
);
348358

349359
super.visitWhileRule(node);

pkgs/sass_language_services/test/features/go_to_definition/scoped_symbols_test.dart

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,21 @@ void main() {
6969
@each $i in 1, 2, 3 {
7070
@debug $i;
7171
}
72+
73+
@each $y in 3, 2, 1 {
74+
@debug $y;
75+
}
7276
''');
7377
var symbols = getSymbols(document);
7478

75-
expect(symbols.globalScope.children, hasLength(1));
79+
expect(symbols.globalScope.children, hasLength(2));
7680

77-
var [first] = symbols.globalScope.children;
81+
var [first, second] = symbols.globalScope.children;
7882
expect(first.offset, equals(20));
7983
expect(first.length, equals(16));
84+
85+
expect(second.offset, equals(58));
86+
expect(second.length, equals(16));
8087
});
8188

8289
test('for rules', () {
@@ -86,14 +93,23 @@ void main() {
8693
width: 2em * $i;
8794
}
8895
}
96+
97+
@for $y from 5 to 10 {
98+
.item-#{$y} {
99+
width: 1em * $y;
100+
}
101+
}
89102
''');
90103
var symbols = getSymbols(document);
91104

92-
expect(symbols.globalScope.children, hasLength(1));
105+
expect(symbols.globalScope.children, hasLength(2));
93106

94-
var [first] = symbols.globalScope.children;
107+
var [first, second] = symbols.globalScope.children;
95108
expect(first.offset, equals(20));
96109
expect(first.length, equals(44));
110+
111+
expect(second.offset, equals(87));
112+
expect(second.length, equals(44));
97113
});
98114

99115
test('function rules', () {
@@ -105,14 +121,25 @@ void main() {
105121
@return false;
106122
}
107123
}
124+
125+
@function is-odd($int) {
126+
@if $int % 2 != 0 {
127+
@return true;
128+
} @else {
129+
@return false;
130+
}
131+
}
108132
''');
109133
var symbols = getSymbols(document);
110134

111-
expect(symbols.globalScope.children, hasLength(1));
135+
expect(symbols.globalScope.children, hasLength(2));
112136

113-
var [first] = symbols.globalScope.children;
137+
var [first, second] = symbols.globalScope.children;
114138
expect(first.offset, equals(24));
115-
expect(first.length, equals(62));
139+
expect(first.length, equals(78));
140+
141+
expect(second.offset, equals(127));
142+
expect(second.length, equals(78));
116143
});
117144

118145
test('if else rules', () {
@@ -142,14 +169,21 @@ void main() {
142169
@mixin large-text {
143170
font-size: 20px;
144171
}
172+
173+
@mixin small-text {
174+
font-size: 12px;
175+
}
145176
''');
146177
var symbols = getSymbols(document);
147178

148-
expect(symbols.globalScope.children, hasLength(1));
179+
expect(symbols.globalScope.children, hasLength(2));
149180

150-
var [first] = symbols.globalScope.children;
181+
var [first, second] = symbols.globalScope.children;
151182
expect(first.offset, equals(18));
152183
expect(first.length, equals(22));
184+
185+
expect(second.offset, equals(60));
186+
expect(second.length, equals(22));
153187
});
154188

155189
test('while rules', () {

0 commit comments

Comments
 (0)