Skip to content

Commit 6bb5b62

Browse files
committed
Test for go to definition
1 parent 7f98054 commit 6bb5b62

File tree

5 files changed

+39
-5
lines changed

5 files changed

+39
-5
lines changed

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,18 @@ import 'scope_visitor.dart';
99
class GoToDefinitionFeature extends LanguageFeature {
1010
GoToDefinitionFeature({required super.ls});
1111

12-
/// Find the definition of whatever is at [position] in [document] if possible.
13-
///
1412
/// Returns a Location with:
1513
///
1614
/// 1. The URI of the document containing the definition.
1715
/// 2. The selectionRange (or "nameRange") of the definition.
1816
///
19-
Future<lsp.Location?> findDefinition(
17+
Future<lsp.Location?> goToDefinition(
2018
TextDocument document, lsp.Position position) async {
2119
var stylesheet = ls.parseStylesheet(document);
2220

2321
// Find the node whose definition we're looking for.
2422
var offset = document.offsetAt(position);
23+
// TODO: you are here. Figure out why the search isn't working the way you think.
2524
var node = stylesheet.accept(NodeAtOffsetVisitor(offset));
2625
if (node == null) {
2726
return null;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class NodeAtOffsetVisitor implements sass.AstSearchVisitor<sass.AstNode> {
1818
}
1919
}
2020

21-
if (node.span.end.offset > _offset) {
21+
if (node.span.start.offset > _offset) {
2222
return _candidate;
2323
}
2424

pkgs/sass_language_services/lib/src/language_services.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:lsp_server/lsp_server.dart' as lsp;
22
import 'package:sass_api/sass_api.dart' as sass;
33
import 'package:sass_language_services/sass_language_services.dart';
4+
import 'package:sass_language_services/src/features/go_to_definition/go_to_definition_feature.dart';
45

56
import 'features/document_links/document_links_feature.dart';
67
import 'features/document_symbols/document_symbols_feature.dart';
@@ -17,6 +18,7 @@ class LanguageServices {
1718

1819
late final DocumentLinksFeature _documentLinks;
1920
late final DocumentSymbolsFeature _documentSymbols;
21+
late final GoToDefinitionFeature _goToDefinitionFeature;
2022
late final WorkspaceSymbolsFeature _workspaceSymbols;
2123

2224
LanguageServices({
@@ -25,6 +27,7 @@ class LanguageServices {
2527
}) : cache = LanguageServicesCache() {
2628
_documentLinks = DocumentLinksFeature(ls: this);
2729
_documentSymbols = DocumentSymbolsFeature(ls: this);
30+
_goToDefinitionFeature = GoToDefinitionFeature(ls: this);
2831
_workspaceSymbols = WorkspaceSymbolsFeature(ls: this);
2932
}
3033

@@ -45,6 +48,11 @@ class LanguageServices {
4548
return _workspaceSymbols.findWorkspaceSymbols(query);
4649
}
4750

51+
Future<lsp.Location?> goToDefinition(
52+
TextDocument document, lsp.Position position) {
53+
return _goToDefinitionFeature.goToDefinition(document, position);
54+
}
55+
4856
sass.Stylesheet parseStylesheet(TextDocument document) {
4957
return cache.getStylesheet(document);
5058
}

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,38 @@ import 'package:sass_language_services/sass_language_services.dart';
22
import 'package:test/test.dart';
33

44
import '../../memory_file_system.dart';
5+
import '../../position_utils.dart';
6+
import '../../range_matchers.dart';
57
import '../../test_client_capabilities.dart';
68

79
final fs = MemoryFileSystem();
810
final ls = LanguageServices(fs: fs, clientCapabilities: getCapabilities());
11+
912
void main() {
10-
group('selectors', () {
13+
group('sass variables', () {
1114
setUp(() {
1215
ls.cache.clear();
1316
});
1417

18+
test('in a different document', () async {
19+
fs.createDocument(r'$b: #000;', uri: 'colors.scss');
20+
21+
var document = fs.createDocument(r'''
22+
@use "colors";
23+
24+
.a {
25+
color: $b;
26+
}
27+
''');
28+
var result = await ls.goToDefinition(document, at(line: 3, char: 10));
29+
30+
expect(result, isNotNull);
31+
expect(result!.range, StartsAtLine(0));
32+
expect(result.range, EndsAtLine(0));
33+
expect(result.range, StartsAtCharacter(0));
34+
expect(result.range, EndsAtCharacter(2));
1535

36+
expect(result.uri.toString(), endsWith('colors.scss'));
37+
});
1638
});
1739
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import 'package:lsp_server/lsp_server.dart' as lsp;
2+
3+
lsp.Position at({required int line, required int char}) {
4+
return lsp.Position(character: char, line: line);
5+
}

0 commit comments

Comments
 (0)