Skip to content

Commit 9716d8f

Browse files
committed
Tests for extend rules
1 parent f72b55b commit 9716d8f

File tree

4 files changed

+106
-20
lines changed

4 files changed

+106
-20
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,9 @@ class ScopeVisitor with sass.RecursiveStatementVisitor {
313313

314314
_addSymbol(
315315
name: name,
316-
kind: ReferenceKind.selector,
316+
kind: name.startsWith('%')
317+
? ReferenceKind.placeholderSelector
318+
: ReferenceKind.selector,
317319
symbolRange: symbolRange,
318320
nameRange: nameRange,
319321
offset: node.span.start.offset,

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

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@ ReferenceKind? getNodeReferenceKind(sass.AstNode node) {
3535
return ReferenceKind.function;
3636
} else if (node is sass.FunctionRule) {
3737
return ReferenceKind.function;
38+
} else if (node is sass.ExtendRule) {
39+
var selector = node.selector.asPlain;
40+
if (selector != null) {
41+
return selector.startsWith('%')
42+
? ReferenceKind.placeholderSelector
43+
: ReferenceKind.selector;
44+
}
3845
}
3946

4047
return null;
@@ -68,17 +75,15 @@ String? getNodeName(sass.AstNode node) {
6875
var placeholder = node;
6976
return placeholder.name;
7077
} else if (node is sass.MixinRule) {
71-
var mixin = node;
72-
return mixin.name;
78+
return node.name;
7379
} else if (node is sass.IncludeRule) {
74-
var mixin = node;
75-
return mixin.name;
80+
return node.name;
7681
} else if (node is sass.FunctionExpression) {
77-
var function = node;
78-
return function.name;
82+
return node.name;
7983
} else if (node is sass.FunctionRule) {
80-
var function = node;
81-
return function.name;
84+
return node.name;
85+
} else if (node is sass.ExtendRule) {
86+
return node.selector.asPlain;
8287
}
8388

8489
return null;

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
@@ -145,17 +145,6 @@ class NodeAtOffsetVisitor
145145
return super.visitIncludeRule(node) ?? _process(node);
146146
}
147147

148-
@override
149-
sass.AstNode? visitInterpolatedFunctionExpression(
150-
sass.InterpolatedFunctionExpression node) {
151-
return super.visitInterpolatedFunctionExpression(node) ?? _process(node);
152-
}
153-
154-
@override
155-
sass.AstNode? visitInterpolation(sass.Interpolation interpolation) {
156-
return super.visitInterpolation(interpolation) ?? _process(interpolation);
157-
}
158-
159148
@override
160149
sass.AstNode? visitListExpression(sass.ListExpression node) {
161150
return super.visitListExpression(node) ?? _process(node);

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

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,11 +294,101 @@ nav ul {
294294
setUp(() {
295295
ls.cache.clear();
296296
});
297+
298+
test('same document', () async {
299+
var document = fs.createDocument(r'''
300+
.theme {
301+
color: purple;
302+
}
303+
304+
.body {
305+
@extend .theme;
306+
}
307+
''', uri: 'styles.scss');
308+
309+
var result = await ls.goToDefinition(document, at(line: 5, char: 12));
310+
311+
expect(result, isNotNull);
312+
expect(result!.range, StartsAtLine(0));
313+
expect(result.range, StartsAtCharacter(0));
314+
expect(result.range, EndsAtLine(0));
315+
expect(result.range, EndsAtCharacter(6));
316+
});
317+
318+
test('different document', () async {
319+
fs.createDocument(r'''
320+
.theme
321+
color: purple
322+
''', uri: 'theme.sass');
323+
324+
var document = fs.createDocument(r'''
325+
@use "theme";
326+
327+
.body {
328+
@extend .theme;
329+
}
330+
''');
331+
332+
var result = await ls.goToDefinition(document, at(line: 3, char: 12));
333+
334+
expect(result, isNotNull);
335+
expect(result!.range, StartsAtLine(0));
336+
expect(result.range, StartsAtCharacter(0));
337+
expect(result.range, EndsAtLine(0));
338+
expect(result.range, EndsAtCharacter(6));
339+
340+
expect(result.uri.toString(), endsWith('theme.sass'));
341+
});
297342
});
298343

299344
group('@extended placeholder selector', () {
300345
setUp(() {
301346
ls.cache.clear();
302347
});
348+
349+
test('same document', () async {
350+
var document = fs.createDocument(r'''
351+
%theme {
352+
color: purple;
353+
}
354+
355+
.body {
356+
@extend %theme;
357+
}
358+
''', uri: 'styles.scss');
359+
360+
var result = await ls.goToDefinition(document, at(line: 5, char: 12));
361+
362+
expect(result, isNotNull);
363+
expect(result!.range, StartsAtLine(0));
364+
expect(result.range, StartsAtCharacter(0));
365+
expect(result.range, EndsAtLine(0));
366+
expect(result.range, EndsAtCharacter(6));
367+
});
368+
369+
test('different document', () async {
370+
fs.createDocument(r'''
371+
%theme
372+
color: purple
373+
''', uri: '_theme.sass');
374+
375+
var document = fs.createDocument(r'''
376+
@use "theme";
377+
378+
.body {
379+
@extend %theme;
380+
}
381+
''');
382+
383+
var result = await ls.goToDefinition(document, at(line: 3, char: 12));
384+
385+
expect(result, isNotNull);
386+
expect(result!.range, StartsAtLine(0));
387+
expect(result.range, StartsAtCharacter(0));
388+
expect(result.range, EndsAtLine(0));
389+
expect(result.range, EndsAtCharacter(6));
390+
391+
expect(result.uri.toString(), endsWith('_theme.sass'));
392+
});
303393
});
304394
}

0 commit comments

Comments
 (0)