Skip to content

Commit b1ef888

Browse files
committed
Have findInWorkspace return visited documents
In case the feature can use it to avoid duplicate work
1 parent b9a6fbc commit b1ef888

File tree

2 files changed

+37
-18
lines changed

2 files changed

+37
-18
lines changed

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ class GoToDefinitionFeature extends LanguageFeature {
109109
}
110110
}
111111

112-
var definition =
112+
var result =
113113
await findInWorkspace<(StylesheetDocumentSymbol, lsp.Location)>(
114114
lazy: true,
115115
initialDocument: initialDocument,
@@ -158,6 +158,9 @@ class GoToDefinitionFeature extends LanguageFeature {
158158
},
159159
);
160160

161+
var definition = result.result;
162+
var visited = result.visited;
163+
161164
if (definition != null && definition.isNotEmpty) {
162165
var symbol = definition.first.$1;
163166
var location = definition.first.$2;
@@ -168,11 +171,19 @@ class GoToDefinitionFeature extends LanguageFeature {
168171
);
169172
}
170173

171-
// Fall back to "@import-style" lookup on the whole workspace.
174+
// Fall back to "@import-style" lookup on the rest of the workspace.
172175
for (var document in ls.cache.getDocuments()) {
176+
if (visited.contains(document.uri.toString())) {
177+
continue;
178+
}
179+
173180
var stylesheet = ls.parseStylesheet(document);
174-
var symbols = ScopedSymbols(stylesheet,
175-
document.languageId == 'sass' ? Dialect.indented : Dialect.scss);
181+
var symbols = ls.cache.getDocumentSymbols(document) ??
182+
ScopedSymbols(
183+
stylesheet,
184+
document.languageId == 'sass' ? Dialect.indented : Dialect.scss,
185+
);
186+
ls.cache.setDocumentSymbols(document, symbols);
176187

177188
for (var kind in kinds) {
178189
var symbol = symbols.globalScope.getSymbol(

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

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@ import 'dart:math';
33
import '../../sass_language_services.dart';
44
import '../utils/uri_utils.dart';
55

6+
class WorkspaceResult<T> {
7+
final List<T>? result;
8+
final Set<String> visited;
9+
10+
WorkspaceResult(this.result, this.visited);
11+
}
12+
613
abstract class LanguageFeature {
714
late final LanguageServices ls;
815

@@ -11,7 +18,7 @@ abstract class LanguageFeature {
1118
/// Helper to do some kind of lookup for the import tree of [initialDocument].
1219
///
1320
/// The [callback] is called for each document in the import tree. Documents will only get visited once.
14-
Future<List<T>?> findInWorkspace<T>(
21+
Future<WorkspaceResult<T>> findInWorkspace<T>(
1522
{required Future<List<T>?> Function({
1623
required TextDocument document,
1724
required String prefix,
@@ -37,7 +44,7 @@ abstract class LanguageFeature {
3744
);
3845
}
3946

40-
Future<List<T>?> _findInWorkspace<T>(
47+
Future<WorkspaceResult<T>> _findInWorkspace<T>(
4148
{required Future<List<T>?> Function({
4249
required TextDocument document,
4350
required String prefix,
@@ -57,19 +64,20 @@ abstract class LanguageFeature {
5764
bool lazy = false,
5865
int depth = 0}) async {
5966
if (visited.contains(currentDocument.uri.toString())) {
60-
return Future.value([]);
67+
return Future.value(WorkspaceResult([], visited));
6168
}
6269

6370
var result = await callback(
64-
document: currentDocument,
65-
prefix: accumulatedPrefix,
66-
hiddenMixinsAndFunctions: hiddenMixinsAndFunctions,
67-
hiddenVariables: hiddenVariables,
68-
shownMixinsAndFunctions: shownMixinsAndFunctions,
69-
shownVariables: shownVariables);
71+
document: currentDocument,
72+
prefix: accumulatedPrefix,
73+
hiddenMixinsAndFunctions: hiddenMixinsAndFunctions,
74+
hiddenVariables: hiddenVariables,
75+
shownMixinsAndFunctions: shownMixinsAndFunctions,
76+
shownVariables: shownVariables,
77+
);
7078

7179
if (lazy && result != null) {
72-
return result;
80+
return WorkspaceResult(result, visited);
7381
}
7482

7583
visited.add(currentDocument.uri.toString());
@@ -90,7 +98,7 @@ abstract class LanguageFeature {
9098
});
9199

92100
if (links.isEmpty) {
93-
return null;
101+
return WorkspaceResult([], visited);
94102
}
95103

96104
var linksResult = <T>[];
@@ -143,12 +151,12 @@ abstract class LanguageFeature {
143151
depth: depth + 1,
144152
);
145153

146-
if (linkResult != null) {
147-
linksResult.addAll(linkResult);
154+
if (linkResult.result != null) {
155+
linksResult.addAll(linkResult.result!);
148156
}
149157
}
150158

151-
return linksResult;
159+
return WorkspaceResult(linksResult, visited);
152160
}
153161

154162
Future<TextDocument> getTextDocument(Uri uri) async {

0 commit comments

Comments
 (0)