Skip to content

Commit 90b671a

Browse files
committed
Tests for mixins
1 parent 029393b commit 90b671a

File tree

4 files changed

+142
-88
lines changed

4 files changed

+142
-88
lines changed

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

Lines changed: 41 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -60,47 +60,6 @@ class ScopeVisitor with sass.RecursiveStatementVisitor {
6060
return null;
6161
}
6262

63-
@override
64-
void visitAtRule(node) {
65-
if (node.children != null) {
66-
var nameEndIndex = node.name.span.end.offset - node.span.start.offset;
67-
var scopeIndex =
68-
node.span.text.indexOf(openBracketOrNewline, nameEndIndex);
69-
70-
_addScope(
71-
offset: node.span.start.offset + scopeIndex,
72-
length: node.span.length - scopeIndex,
73-
);
74-
}
75-
76-
if (node.name.isPlain && node.name.asPlain!.startsWith('keyframes')) {
77-
var keyframesName = node.span.context.split(' ').elementAtOrNull(1);
78-
if (keyframesName != null) {
79-
var keyframesNameRange = lsp.Range(
80-
start: lsp.Position(
81-
line: node.name.span.start.line,
82-
character: node.name.span.end.column + 1,
83-
),
84-
end: lsp.Position(
85-
line: node.name.span.end.line,
86-
character: node.name.span.end.column + 1 + keyframesName.length,
87-
),
88-
);
89-
90-
_addSymbol(
91-
name: keyframesName,
92-
kind: ReferenceKind.keyframe,
93-
symbolRange: toRange(node.span),
94-
nameRange: keyframesNameRange,
95-
offset: node.span.start.offset,
96-
length: node.span.length,
97-
);
98-
}
99-
}
100-
101-
super.visitAtRule(node);
102-
}
103-
10463
@override
10564
void visitDeclaration(node) {
10665
var isCustomProperty =
@@ -312,43 +271,48 @@ class ScopeVisitor with sass.RecursiveStatementVisitor {
312271
try {
313272
var selectorList = sass.SelectorList.parse(node.selector.asPlain!);
314273
for (var complexSelector in selectorList.components) {
315-
for (var component in complexSelector.components) {
316-
var selector = component.selector;
317-
var name = selector.span.text;
318-
319-
// The selector span seems to be relative to node, not to the file.
320-
var nameRange = lsp.Range(
321-
start: lsp.Position(
322-
line: node.span.start.line + selector.span.start.line,
323-
character: node.span.start.column + selector.span.start.column,
324-
),
325-
end: lsp.Position(
326-
line: node.span.start.line + selector.span.end.line,
327-
character: node.span.start.column + selector.span.end.column,
328-
),
329-
);
330-
331-
// symbolRange: start position of selector's nameRange, end of stylerule (node.span.end).
332-
var symbolRange = lsp.Range(
333-
start: lsp.Position(
334-
line: nameRange.start.line,
335-
character: nameRange.start.character,
336-
),
337-
end: lsp.Position(
338-
line: node.span.end.line,
339-
character: node.span.end.column,
340-
),
341-
);
342-
343-
_addSymbol(
344-
name: name,
345-
kind: ReferenceKind.selector,
346-
symbolRange: symbolRange,
347-
nameRange: nameRange,
348-
offset: node.span.start.offset,
349-
length: node.span.length,
350-
);
274+
// we only want selectors that can be used in @extend
275+
if (complexSelector.components.isEmpty ||
276+
complexSelector.components.length > 1) {
277+
continue;
351278
}
279+
var component = complexSelector.components.first;
280+
281+
var selector = component.selector;
282+
var name = selector.span.text;
283+
284+
// The selector span seems to be relative to node, not to the file.
285+
var nameRange = lsp.Range(
286+
start: lsp.Position(
287+
line: node.span.start.line + selector.span.start.line,
288+
character: node.span.start.column + selector.span.start.column,
289+
),
290+
end: lsp.Position(
291+
line: node.span.start.line + selector.span.end.line,
292+
character: node.span.start.column + selector.span.end.column,
293+
),
294+
);
295+
296+
// symbolRange: start position of selector's nameRange, end of stylerule (node.span.end).
297+
var symbolRange = lsp.Range(
298+
start: lsp.Position(
299+
line: nameRange.start.line,
300+
character: nameRange.start.character,
301+
),
302+
end: lsp.Position(
303+
line: node.span.end.line,
304+
character: node.span.end.column,
305+
),
306+
);
307+
308+
_addSymbol(
309+
name: name,
310+
kind: ReferenceKind.selector,
311+
symbolRange: symbolRange,
312+
nameRange: nameRange,
313+
offset: node.span.start.offset,
314+
length: node.span.length,
315+
);
352316
}
353317

354318
_addScope(

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ ReferenceKind? getNodeReferenceKind(sass.AstNode node) {
3030
return ReferenceKind.placeholderSelector;
3131
} else if (node is sass.MixinRule) {
3232
return ReferenceKind.mixin;
33+
} else if (node is sass.IncludeRule) {
34+
return ReferenceKind.mixin;
3335
} else if (node is sass.FunctionExpression) {
3436
return ReferenceKind.function;
3537
} else if (node is sass.FunctionRule) {
@@ -69,6 +71,9 @@ String? getNodeName(sass.AstNode node) {
6971
} else if (node is sass.MixinRule) {
7072
var mixin = node;
7173
return mixin.name;
74+
} else if (node is sass.IncludeRule) {
75+
var mixin = node;
76+
return mixin.name;
7277
} else if (node is sass.FunctionExpression) {
7378
var function = node;
7479
return function.name;

pkgs/sass_language_services/lib/src/features/node_at_offset_visitor.dart

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,6 @@ class NodeAtOffsetVisitor
6060
return super.visitCallableDeclaration(node) ?? _process(node);
6161
}
6262

63-
@override
64-
sass.AstNode? visitChildren(List<sass.Statement> children) {
65-
for (var node in children) {
66-
var result = _process(node);
67-
if (result != null) {
68-
return result;
69-
}
70-
}
71-
return super.visitChildren(children);
72-
}
73-
7463
@override
7564
sass.AstNode? visitColorExpression(sass.ColorExpression node) {
7665
return super.visitColorExpression(node) ?? _process(node);

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

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,100 @@ $b: blue
9292
expect(result, isNull);
9393
});
9494
});
95+
96+
group('mixins', () {
97+
setUp(() {
98+
ls.cache.clear();
99+
});
100+
101+
test('in the same document', () async {
102+
var document = fs.createDocument(r'''
103+
=reset-list
104+
margin: 0
105+
padding: 0
106+
list-style: none
107+
108+
=horizontal-list
109+
+reset-list
110+
111+
li
112+
display: inline-block
113+
margin:
114+
left: -2px
115+
right: 2em
116+
117+
nav ul
118+
+horizontal-list
119+
120+
''', uri: 'styles.sass');
121+
var result = await ls.goToDefinition(document, at(line: 6, char: 4));
122+
123+
expect(result, isNotNull);
124+
expect(result!.range, StartsAtLine(0));
125+
expect(result.range, EndsAtLine(0));
126+
expect(result.range, StartsAtCharacter(1));
127+
expect(result.range, EndsAtCharacter(11));
128+
129+
expect(result.uri.toString(), endsWith('styles.sass'));
130+
});
131+
132+
test('in a different document', () async {
133+
fs.createDocument(r'''
134+
=reset-list
135+
margin: 0
136+
padding: 0
137+
list-style: none
138+
139+
=horizontal-list
140+
+reset-list
141+
142+
li
143+
display: inline-block
144+
margin:
145+
left: -2px
146+
right: 2em
147+
''', uri: 'list.sass');
148+
149+
var document = fs.createDocument(r'''
150+
@use "list";
151+
152+
nav ul {
153+
@include horizontal-list;
154+
}
155+
''');
156+
var result = await ls.goToDefinition(document, at(line: 3, char: 12));
157+
158+
expect(result, isNotNull);
159+
expect(result!.range, StartsAtLine(5));
160+
expect(result.range, EndsAtLine(5));
161+
expect(result.range, StartsAtCharacter(1));
162+
expect(result.range, EndsAtCharacter(16));
163+
164+
expect(result.uri.toString(), endsWith('list.sass'));
165+
});
166+
});
167+
168+
group('sass functions', () {
169+
setUp(() {
170+
ls.cache.clear();
171+
});
172+
});
173+
174+
group('css variables', () {
175+
setUp(() {
176+
ls.cache.clear();
177+
});
178+
});
179+
180+
group('@extended CSS class', () {
181+
setUp(() {
182+
ls.cache.clear();
183+
});
184+
});
185+
186+
group('@extended placeholder selector', () {
187+
setUp(() {
188+
ls.cache.clear();
189+
});
190+
});
95191
}

0 commit comments

Comments
 (0)