Skip to content

Commit b1fd5d7

Browse files
committed
Completion provider
1 parent 2a9b497 commit b1fd5d7

File tree

3 files changed

+73
-26
lines changed

3 files changed

+73
-26
lines changed

pkgs/sass_language_server/lib/src/language_server.dart

+40-1
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,25 @@ class LanguageServer {
157157
);
158158

159159
var serverCapabilities = ServerCapabilities(
160+
completionProvider: CompletionOptions(
161+
resolveProvider: false,
162+
triggerCharacters: [
163+
// For SassDoc annotation completion
164+
"@",
165+
"/",
166+
// For @use completion
167+
'"',
168+
"'",
169+
// For placeholder completion
170+
"%",
171+
// For namespaced completions
172+
".",
173+
// For property values
174+
":",
175+
// For custom properties
176+
"-",
177+
],
178+
),
160179
definitionProvider: Either2.t1(true),
161180
documentHighlightProvider: Either2.t1(true),
162181
documentLinkProvider: DocumentLinkOptions(resolveProvider: false),
@@ -327,6 +346,26 @@ class LanguageServer {
327346
_connection.peer
328347
.registerMethod('textDocument/documentSymbol', onDocumentSymbol);
329348

349+
_connection.onCompletion((params) async {
350+
try {
351+
var document = _documents.get(params.textDocument.uri);
352+
if (document == null) {
353+
return CompletionList(isIncomplete: true, items: []);
354+
}
355+
356+
var configuration = _getLanguageConfiguration(document);
357+
if (configuration.completion.enabled) {
358+
var result = await _ls.doComplete(document, params.position);
359+
return result;
360+
} else {
361+
return CompletionList(isIncomplete: true, items: []);
362+
}
363+
} on Exception catch (e) {
364+
_log.debug(e.toString());
365+
return CompletionList(isIncomplete: true, items: []);
366+
}
367+
});
368+
330369
_connection.onHover((params) async {
331370
try {
332371
var document = _documents.get(params.textDocument.uri);
@@ -337,7 +376,7 @@ class LanguageServer {
337376

338377
var configuration = _getLanguageConfiguration(document);
339378
if (configuration.hover.enabled) {
340-
var result = await _ls.hover(document, params.position);
379+
var result = await _ls.doHover(document, params.position);
341380
return result ?? Hover(contents: Either2.t2(""));
342381
} else {
343382
return Hover(contents: Either2.t2(""));

pkgs/sass_language_services/lib/src/language_services.dart

+12-4
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/completion/completion_feature.dart';
45
import 'package:sass_language_services/src/features/document_highlights/document_highlights_feature.dart';
56
import 'package:sass_language_services/src/features/find_references/find_references_feature.dart';
67
import 'package:sass_language_services/src/features/folding_ranges/folding_ranges_feature.dart';
@@ -22,6 +23,7 @@ class LanguageServices {
2223
LanguageServerConfiguration configuration =
2324
LanguageServerConfiguration.create(null);
2425

26+
late final CompletionFeature _completion;
2527
late final DocumentHighlightsFeature _documentHighlights;
2628
late final DocumentLinksFeature _documentLinks;
2729
late final DocumentSymbolsFeature _documentSymbols;
@@ -37,6 +39,7 @@ class LanguageServices {
3739
required this.clientCapabilities,
3840
required this.fs,
3941
}) : cache = LanguageServicesCache() {
42+
_completion = CompletionFeature(ls: this);
4043
_documentHighlights = DocumentHighlightsFeature(ls: this);
4144
_documentLinks = DocumentLinksFeature(ls: this);
4245
_documentSymbols = DocumentSymbolsFeature(ls: this);
@@ -53,6 +56,15 @@ class LanguageServices {
5356
this.configuration = configuration;
5457
}
5558

59+
Future<lsp.CompletionList> doComplete(
60+
TextDocument document, lsp.Position position) {
61+
return _completion.doComplete(document, position);
62+
}
63+
64+
Future<lsp.Hover?> doHover(TextDocument document, lsp.Position position) {
65+
return _hover.doHover(document, position);
66+
}
67+
5668
List<lsp.DocumentHighlight> findDocumentHighlights(
5769
TextDocument document, lsp.Position position) {
5870
return _documentHighlights.findDocumentHighlights(document, position);
@@ -90,10 +102,6 @@ class LanguageServices {
90102
return _goToDefinition.goToDefinition(document, position);
91103
}
92104

93-
Future<lsp.Hover?> hover(TextDocument document, lsp.Position position) {
94-
return _hover.doHover(document, position);
95-
}
96-
97105
sass.Stylesheet parseStylesheet(TextDocument document) {
98106
return cache.getStylesheet(document);
99107
}

pkgs/sass_language_services/test/features/hover/hover_test.dart

+21-21
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ nav {
4646
}
4747
}
4848
''');
49-
var result = await ls.hover(document, at(line: 1, char: 5));
49+
var result = await ls.doHover(document, at(line: 1, char: 5));
5050

5151
expect(result, isNotNull);
5252
expect(getContents(result), contains('nav ul'));
@@ -60,7 +60,7 @@ nav {
6060
padding: 0;
6161
}
6262
''');
63-
var result = await ls.hover(document, at(line: 0, char: 2));
63+
var result = await ls.doHover(document, at(line: 0, char: 2));
6464

6565
expect(result, isNotNull);
6666
expect(getContents(result), contains(':has(.foo)'));
@@ -74,7 +74,7 @@ nav {
7474
padding: 0;
7575
}
7676
''');
77-
var result = await ls.hover(document, at(line: 0, char: 2));
77+
var result = await ls.doHover(document, at(line: 0, char: 2));
7878

7979
expect(result, isNotNull);
8080
expect(getContents(result), contains(':has(#bar)'));
@@ -94,7 +94,7 @@ nav {
9494
padding: 0;
9595
}
9696
''');
97-
var result = await ls.hover(document, at(line: 1, char: 3));
97+
var result = await ls.doHover(document, at(line: 1, char: 3));
9898

9999
expect(result, isNotNull);
100100
expect(getContents(result), contains('margin'));
@@ -115,7 +115,7 @@ nav {
115115
}
116116
}
117117
''');
118-
var result = await ls.hover(document, at(line: 1, char: 5));
118+
var result = await ls.doHover(document, at(line: 1, char: 5));
119119

120120
expect(result, isNotNull);
121121
expect(getContents(result), contains('.button--primary'));
@@ -133,7 +133,7 @@ nav {
133133
}
134134
}
135135
''');
136-
var result = await ls.hover(document, at(line: 2, char: 10));
136+
var result = await ls.doHover(document, at(line: 2, char: 10));
137137

138138
expect(result, isNotNull);
139139
expect(getContents(result), contains('.button--primary::hover'));
@@ -155,7 +155,7 @@ nav {
155155
}
156156
}
157157
''');
158-
var result = await ls.hover(document, at(line: 6, char: 10));
158+
var result = await ls.doHover(document, at(line: 6, char: 10));
159159

160160
expect(result, isNotNull);
161161
expect(getContents(result),
@@ -175,7 +175,7 @@ nav {
175175
}
176176
''');
177177

178-
var result = await ls.hover(document, at(line: 3, char: 24));
178+
var result = await ls.doHover(document, at(line: 3, char: 24));
179179

180180
expect(result, isNotNull);
181181
expect(
@@ -200,7 +200,7 @@ $_button-border-width: rem(1px);
200200
}
201201
''');
202202

203-
var result = await ls.hover(document, at(line: 3, char: 23));
203+
var result = await ls.doHover(document, at(line: 3, char: 23));
204204

205205
expect(result, isNotNull);
206206
expect(getContents(result), contains(r'$_button-border-width: rem(1px)'));
@@ -223,7 +223,7 @@ $border-width: rem(1px);
223223
}
224224
''');
225225

226-
var result = await ls.hover(document, at(line: 3, char: 23));
226+
var result = await ls.doHover(document, at(line: 3, char: 23));
227227

228228
expect(result, isNotNull);
229229
expect(getContents(result), contains(r'$button-border-width: rem(1px)'));
@@ -246,7 +246,7 @@ $border-width: rem(1px);
246246
}
247247
''');
248248

249-
var result = await ls.hover(document, at(line: 5, char: 14));
249+
var result = await ls.doHover(document, at(line: 5, char: 14));
250250

251251
expect(result, isNotNull);
252252
expect(getContents(result), contains(r'@function getPrimary()'));
@@ -261,7 +261,7 @@ $border-width: rem(1px);
261261
@debug compare($b: 2);
262262
''');
263263

264-
var result = await ls.hover(document, at(line: 4, char: 9));
264+
var result = await ls.doHover(document, at(line: 4, char: 9));
265265

266266
expect(result, isNotNull);
267267
expect(getContents(result), contains(r'@function compare($a: 1, $b)'));
@@ -280,7 +280,7 @@ $border-width: rem(1px);
280280
@debug core.compare($b: 2);
281281
''');
282282

283-
var result = await ls.hover(document, at(line: 2, char: 9));
283+
var result = await ls.doHover(document, at(line: 2, char: 9));
284284

285285
expect(result, isNotNull);
286286
expect(getContents(result), contains(r'@function compare($a: 1, $b)'));
@@ -303,7 +303,7 @@ $border-width: rem(1px);
303303
@debug core.math-compare($b: 2);
304304
''');
305305

306-
var result = await ls.hover(document, at(line: 2, char: 19));
306+
var result = await ls.doHover(document, at(line: 2, char: 19));
307307

308308
expect(result, isNotNull);
309309
expect(
@@ -327,7 +327,7 @@ $border-width: rem(1px);
327327
}
328328
''');
329329

330-
var result = await ls.hover(document, at(line: 5, char: 14));
330+
var result = await ls.doHover(document, at(line: 5, char: 14));
331331

332332
expect(result, isNotNull);
333333
expect(getContents(result), contains(r'@mixin primary'));
@@ -344,7 +344,7 @@ $border-width: rem(1px);
344344
}
345345
''');
346346

347-
var result = await ls.hover(document, at(line: 5, char: 14));
347+
var result = await ls.doHover(document, at(line: 5, char: 14));
348348

349349
expect(result, isNotNull);
350350
expect(getContents(result), contains(r'@mixin theme($base: green)'));
@@ -365,7 +365,7 @@ $border-width: rem(1px);
365365
}
366366
''');
367367

368-
var result = await ls.hover(document, at(line: 3, char: 19));
368+
var result = await ls.doHover(document, at(line: 3, char: 19));
369369

370370
expect(result, isNotNull);
371371
expect(getContents(result), contains(r'@mixin theme($base: green)'));
@@ -390,7 +390,7 @@ $border-width: rem(1px);
390390
}
391391
''');
392392

393-
var result = await ls.hover(document, at(line: 3, char: 19));
393+
var result = await ls.doHover(document, at(line: 3, char: 19));
394394

395395
expect(result, isNotNull);
396396
expect(
@@ -410,7 +410,7 @@ $border-width: rem(1px);
410410
@debug math.$pi;
411411
''');
412412

413-
var result = await ls.hover(document, at(line: 2, char: 14));
413+
var result = await ls.doHover(document, at(line: 2, char: 14));
414414
expect(result, isNotNull);
415415
expect(getContents(result), contains('π'));
416416
expect(getContents(result), contains('sass-lang.com'));
@@ -423,7 +423,7 @@ $border-width: rem(1px);
423423
@debug math.ceil(4);
424424
''');
425425

426-
var result = await ls.hover(document, at(line: 2, char: 14));
426+
var result = await ls.doHover(document, at(line: 2, char: 14));
427427
expect(result, isNotNull);
428428
expect(getContents(result),
429429
contains('Rounds up to the nearest whole number'));
@@ -437,7 +437,7 @@ $border-width: rem(1px);
437437
$_id: string.unique-id();
438438
''');
439439

440-
var result = await ls.hover(document, at(line: 2, char: 14));
440+
var result = await ls.doHover(document, at(line: 2, char: 14));
441441
expect(result, isNotNull);
442442
expect(getContents(result),
443443
contains('Returns a randomly-generated unquoted string'));

0 commit comments

Comments
 (0)