Skip to content

Commit f16663a

Browse files
bwilkersoncommit-bot@chromium.org
authored and
commit-bot@chromium.org
committed
Convert LocalReferenceContributor to use SuggestionBuilder
Change-Id: I1065b6294b315abcf60b9e743a9c6961a3080978 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/147047 Reviewed-by: Jaime Wren <jwren@google.com> Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
1 parent 7cbd5f6 commit f16663a

File tree

5 files changed

+141
-239
lines changed

5 files changed

+141
-239
lines changed

pkg/analysis_server/lib/src/cider/completion.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:analysis_server/src/services/completion/completion_core.dart';
99
import 'package:analysis_server/src/services/completion/completion_performance.dart';
1010
import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
1111
import 'package:analysis_server/src/services/completion/dart/local_library_contributor.dart';
12+
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
1213
import 'package:analysis_server/src/services/completion/filtering/fuzzy_matcher.dart';
1314
import 'package:analyzer/dart/ast/ast.dart';
1415
import 'package:analyzer/dart/element/element.dart' show LibraryElement;
@@ -188,12 +189,14 @@ class CiderCompletionComputer {
188189
/// Compute all unprefixed suggestions for all elements exported from
189190
/// the library.
190191
List<CompletionSuggestion> _librarySuggestions(LibraryElement element) {
191-
var visitor = LibraryElementSuggestionBuilder(_dartCompletionRequest, '');
192+
var suggestionBuilder = SuggestionBuilder(_dartCompletionRequest);
193+
var visitor = LibraryElementSuggestionBuilder(
194+
_dartCompletionRequest, suggestionBuilder);
192195
var exportMap = element.exportNamespace.definedNames;
193196
for (var definedElement in exportMap.values) {
194197
definedElement.accept(visitor);
195198
}
196-
return visitor.suggestions;
199+
return visitor.suggestions..addAll(suggestionBuilder.suggestions);
197200
}
198201
}
199202

pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,10 @@ class ImportedReferenceContributor extends DartCompletionContributor {
3636
var libraryElement = importElement.importedLibrary;
3737
if (libraryElement != null) {
3838
final newSuggestions = _buildSuggestions(
39-
request, importElement.namespace,
39+
request, builder, importElement.namespace,
4040
prefix: importElement.prefix?.name);
41+
// TODO(brianwilkerson) Remove this filtering after every suggestion is
42+
// being generated via SuggestionBuilder.
4143
for (var suggestion in newSuggestions) {
4244
// Filter out multiply-exported elements (like Future and Stream).
4345
if (seenElements.add(suggestion.element)) {
@@ -49,10 +51,10 @@ class ImportedReferenceContributor extends DartCompletionContributor {
4951
return suggestions;
5052
}
5153

52-
List<CompletionSuggestion> _buildSuggestions(
53-
DartCompletionRequest request, Namespace namespace,
54+
List<CompletionSuggestion> _buildSuggestions(DartCompletionRequest request,
55+
SuggestionBuilder builder, Namespace namespace,
5456
{String prefix}) {
55-
var visitor = LibraryElementSuggestionBuilder(request, prefix);
57+
var visitor = LibraryElementSuggestionBuilder(request, builder, prefix);
5658
for (var elem in namespace.definedNames.values) {
5759
elem.accept(visitor);
5860
}

pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart

Lines changed: 34 additions & 159 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,16 @@
44

55
import 'dart:async';
66

7+
import 'package:analysis_server/src/protocol_server.dart'
8+
show CompletionSuggestion, CompletionSuggestionKind;
79
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
8-
import 'package:analysis_server/src/services/completion/dart/feature_computer.dart';
910
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart'
10-
show createSuggestion, ElementSuggestionBuilder, SuggestionBuilder;
11-
import 'package:analyzer/dart/analysis/features.dart';
11+
show ElementSuggestionBuilder, SuggestionBuilder;
1212
import 'package:analyzer/dart/element/element.dart';
13-
import 'package:analyzer/dart/element/nullability_suffix.dart';
1413
import 'package:analyzer/dart/element/type.dart';
1514
import 'package:analyzer/dart/element/visitor.dart';
1615
import 'package:analyzer_plugin/src/utilities/completion/optype.dart';
1716

18-
import '../../../protocol_server.dart'
19-
show CompletionSuggestion, CompletionSuggestionKind;
20-
2117
/// A visitor for building suggestions based upon the elements defined by
2218
/// a source file contained in the same library but not the same as
2319
/// the source in which the completions are being requested.
@@ -26,7 +22,9 @@ class LibraryElementSuggestionBuilder extends GeneralizingElementVisitor
2622
@override
2723
final DartCompletionRequest request;
2824

29-
final OpType optype;
25+
final SuggestionBuilder builder;
26+
27+
final OpType opType;
3028

3129
DartType contextType;
3230

@@ -38,65 +36,31 @@ class LibraryElementSuggestionBuilder extends GeneralizingElementVisitor
3836
/// The set of libraries that have been, or are currently being, visited.
3937
final Set<LibraryElement> visitedLibraries = <LibraryElement>{};
4038

41-
LibraryElementSuggestionBuilder(this.request, [this.prefix])
42-
: optype = request.opType {
39+
LibraryElementSuggestionBuilder(this.request, this.builder, [this.prefix])
40+
: opType = request.opType {
4341
contextType = request.featureComputer
4442
.computeContextType(request.target.containingNode);
4543
kind = request.target.isFunctionalArgument()
4644
? CompletionSuggestionKind.IDENTIFIER
47-
: optype.suggestKind;
45+
: opType.suggestKind;
4846
}
4947

5048
@override
5149
LibraryElement get containingLibrary => request.libraryElement;
5250

5351
@override
5452
void visitClassElement(ClassElement element) {
55-
if (optype.includeTypeNameSuggestions) {
56-
// if includeTypeNameSuggestions, then use the filter
57-
int relevance;
58-
if (request.useNewRelevance) {
59-
relevance = _relevanceForType(element.thisType);
60-
} else if (element.hasDeprecated) {
61-
relevance = DART_RELEVANCE_LOW;
62-
} else {
63-
relevance = optype.typeNameSuggestionsFilter(
64-
_instantiateClassElement(element), DART_RELEVANCE_DEFAULT);
65-
}
66-
if (relevance != null) {
67-
addSuggestion(element, prefix: prefix, relevance: relevance);
68-
}
53+
if (opType.includeTypeNameSuggestions) {
54+
builder.suggestClass(element, kind: kind, prefix: prefix);
6955
}
70-
if (optype.includeConstructorSuggestions) {
71-
int relevance;
72-
if (request.useNewRelevance) {
73-
relevance = _relevanceForType(element.thisType);
74-
} else if (element.hasDeprecated) {
75-
relevance = DART_RELEVANCE_LOW;
76-
} else {
77-
relevance = optype.returnValueSuggestionsFilter(
78-
_instantiateClassElement(element), DART_RELEVANCE_DEFAULT);
79-
}
80-
_addConstructorSuggestions(element, relevance);
56+
if (opType.includeConstructorSuggestions) {
57+
_addConstructorSuggestions(element);
8158
}
82-
if (optype.includeReturnValueSuggestions) {
59+
if (opType.includeReturnValueSuggestions) {
8360
if (element.isEnum) {
84-
var enumName = element.displayName;
85-
int relevance;
86-
if (request.useNewRelevance) {
87-
relevance = _relevanceForType(element.thisType);
88-
} else if (element.hasDeprecated) {
89-
relevance = DART_RELEVANCE_LOW;
90-
} else {
91-
relevance = optype.returnValueSuggestionsFilter(
92-
_instantiateClassElement(element), DART_RELEVANCE_DEFAULT);
93-
}
9461
for (var field in element.fields) {
9562
if (field.isEnumConstant) {
96-
addSuggestion(field,
97-
prefix: prefix,
98-
relevance: relevance,
99-
elementCompletion: '$enumName.${field.name}');
63+
builder.suggestEnumConstant(field, prefix: prefix);
10064
}
10165
}
10266
}
@@ -115,15 +79,8 @@ class LibraryElementSuggestionBuilder extends GeneralizingElementVisitor
11579

11680
@override
11781
void visitExtensionElement(ExtensionElement element) {
118-
if (optype.includeReturnValueSuggestions) {
119-
int relevance;
120-
if (request.useNewRelevance) {
121-
relevance = _relevanceForType(element.extendedType);
122-
} else {
123-
relevance =
124-
element.hasDeprecated ? DART_RELEVANCE_LOW : DART_RELEVANCE_DEFAULT;
125-
}
126-
addSuggestion(element, prefix: prefix, relevance: relevance);
82+
if (opType.includeReturnValueSuggestions) {
83+
builder.suggestExtension(element, kind: kind, prefix: prefix);
12784
}
12885
element.visitChildren(this);
12986
}
@@ -138,43 +95,21 @@ class LibraryElementSuggestionBuilder extends GeneralizingElementVisitor
13895
return;
13996
}
14097
var returnType = element.returnType;
141-
int relevance;
142-
if (request.useNewRelevance) {
143-
relevance = _relevanceForType(returnType);
144-
} else {
145-
relevance = element.hasDeprecated
146-
? DART_RELEVANCE_LOW
147-
: (element.library == containingLibrary
148-
? DART_RELEVANCE_LOCAL_FUNCTION
149-
: DART_RELEVANCE_DEFAULT);
150-
}
15198
if (returnType != null && returnType.isVoid) {
152-
if (optype.includeVoidReturnSuggestions) {
153-
addSuggestion(element, prefix: prefix, relevance: relevance);
99+
if (opType.includeVoidReturnSuggestions) {
100+
builder.suggestTopLevelFunction(element, kind: kind, prefix: prefix);
154101
}
155102
} else {
156-
if (optype.includeReturnValueSuggestions) {
157-
addSuggestion(element, prefix: prefix, relevance: relevance);
103+
if (opType.includeReturnValueSuggestions) {
104+
builder.suggestTopLevelFunction(element, kind: kind, prefix: prefix);
158105
}
159106
}
160107
}
161108

162109
@override
163110
void visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
164-
if (optype.includeTypeNameSuggestions) {
165-
int relevance;
166-
if (request.useNewRelevance) {
167-
// TODO(brianwilkerson) Figure out whether there are any features that
168-
// ought to be used here and what the right default value is.
169-
relevance = 400;
170-
} else {
171-
relevance = element.hasDeprecated
172-
? DART_RELEVANCE_LOW
173-
: (element.library == containingLibrary
174-
? DART_RELEVANCE_LOCAL_FUNCTION
175-
: DART_RELEVANCE_DEFAULT);
176-
}
177-
addSuggestion(element, prefix: prefix, relevance: relevance);
111+
if (opType.includeTypeNameSuggestions) {
112+
builder.suggestFunctionTypeAlias(element, prefix: prefix);
178113
}
179114
}
180115

@@ -187,96 +122,36 @@ class LibraryElementSuggestionBuilder extends GeneralizingElementVisitor
187122

188123
@override
189124
void visitPropertyAccessorElement(PropertyAccessorElement element) {
190-
if (optype.includeReturnValueSuggestions) {
191-
int relevance;
192-
if (request.useNewRelevance) {
193-
relevance = _relevanceForType(element.returnType);
194-
} else if (element.hasDeprecated) {
195-
relevance = DART_RELEVANCE_LOW;
125+
if (opType.includeReturnValueSuggestions) {
126+
if (element.enclosingElement is ClassElement) {
127+
// TODO(brianwilkerson) Verify that we cannot reach this point and
128+
// remove the dead code.
129+
builder.suggestAccessor(element, inheritanceDistance: -1.0);
196130
} else {
197-
if (element.library == containingLibrary) {
198-
if (element.enclosingElement is ClassElement) {
199-
relevance = DART_RELEVANCE_LOCAL_FIELD;
200-
} else {
201-
relevance = DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE;
202-
}
203-
} else {
204-
relevance = DART_RELEVANCE_DEFAULT;
205-
}
131+
builder.suggestTopLevelPropertyAccessor(element, prefix: prefix);
206132
}
207-
addSuggestion(element, prefix: prefix, relevance: relevance);
208133
}
209134
}
210135

211136
@override
212137
void visitTopLevelVariableElement(TopLevelVariableElement element) {
213-
if (optype.includeReturnValueSuggestions) {
214-
int relevance;
215-
if (request.useNewRelevance) {
216-
relevance = _relevanceForType(element.type);
217-
} else {
218-
relevance = element.hasDeprecated
219-
? DART_RELEVANCE_LOW
220-
: (element.library == containingLibrary
221-
? DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE
222-
: DART_RELEVANCE_DEFAULT);
223-
}
224-
addSuggestion(element, prefix: prefix, relevance: relevance);
138+
if (opType.includeReturnValueSuggestions && !element.isSynthetic) {
139+
builder.suggestTopLevelVariable(element, prefix: prefix);
225140
}
226141
}
227142

228143
/// Add constructor suggestions for the given class.
229-
void _addConstructorSuggestions(ClassElement classElem, int relevance) {
230-
var className = classElem.name;
144+
void _addConstructorSuggestions(ClassElement classElem) {
231145
for (var constructor in classElem.constructors) {
232146
if (constructor.isPrivate) {
233147
continue;
234148
}
235149
if (classElem.isAbstract && !constructor.isFactory) {
236150
continue;
237151
}
238-
239-
var completion = constructor.displayName;
240-
completion = completion.isNotEmpty ? '$className.$completion' : className;
241-
if (prefix != null && prefix.isNotEmpty) {
242-
completion = '$prefix.$completion';
243-
}
244-
var suggestion = createSuggestion(request, constructor,
245-
completion: completion, relevance: relevance);
246-
if (suggestion != null) {
247-
suggestion.selectionOffset = suggestion.completion.length;
248-
suggestions.add(suggestion);
249-
}
152+
builder.suggestConstructor(constructor, kind: kind, prefix: prefix);
250153
}
251154
}
252-
253-
InterfaceType _instantiateClassElement(ClassElement element) {
254-
var typeParameters = element.typeParameters;
255-
var typeArguments = const <DartType>[];
256-
if (typeParameters.isNotEmpty) {
257-
var typeProvider = request.libraryElement.typeProvider;
258-
typeArguments = typeParameters.map((t) {
259-
return typeProvider.dynamicType;
260-
}).toList();
261-
}
262-
263-
var nullabilitySuffix = request.featureSet.isEnabled(Feature.non_nullable)
264-
? NullabilitySuffix.none
265-
: NullabilitySuffix.star;
266-
267-
return element.instantiate(
268-
typeArguments: typeArguments,
269-
nullabilitySuffix: nullabilitySuffix,
270-
);
271-
}
272-
273-
int _relevanceForType(DartType elementType) {
274-
var contextTypeFeature =
275-
request.featureComputer.contextTypeFeature(contextType, elementType);
276-
// TODO(brianwilkerson) Figure out whether there are other features that
277-
// ought to be used here and what the right default value is.
278-
return toRelevance(contextTypeFeature, 800);
279-
}
280155
}
281156

282157
/// A contributor that produces suggestions based on the top level members in
@@ -295,7 +170,7 @@ class LocalLibraryContributor extends DartCompletionContributor {
295170
return const <CompletionSuggestion>[];
296171
}
297172

298-
var visitor = LibraryElementSuggestionBuilder(request);
173+
var visitor = LibraryElementSuggestionBuilder(request, builder);
299174
for (var unit in libraryUnits) {
300175
if (unit != null && unit.source != request.source) {
301176
unit.accept(visitor);

0 commit comments

Comments
 (0)