Clean up the return type of the contributors compute method

All of the contributors now contribute through the builder so the return
value was always an empty list.

Change-Id: I9e5746a7c7e2dc256a00c6091f6bf9d46331b617
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/150803
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Brian Wilkerson 2020-06-10 19:37:12 +00:00 committed by commit-bot@chromium.org
parent d1b0713e8b
commit 01f284c661
20 changed files with 58 additions and 110 deletions

View file

@ -13,7 +13,6 @@ import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
import 'package:analyzer_plugin/src/utilities/completion/optype.dart';
@ -22,11 +21,9 @@ export 'package:analyzer_plugin/utilities/completion/relevance.dart';
/// An object that contributes results for the `completion.getSuggestions`
/// request results.
abstract class DartCompletionContributor {
/// Return a [Future] that completes with a list of suggestions
/// for the given completion [request].
// TODO(brianwilkerson) When all of the suggestions are being built using the
// builder, change the return type to `Future<void>`.
Future<List<CompletionSuggestion>> computeSuggestions(
/// Return a [Future] that completes when the suggestions appropriate for the
/// given completion [request] have been added to the [builder].
Future<void> computeSuggestions(
DartCompletionRequest request, SuggestionBuilder builder);
}

View file

@ -4,8 +4,6 @@
import 'dart:async';
import 'package:analysis_server/src/protocol_server.dart'
hide Element, ElementKind;
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analysis_server/src/utilities/flutter.dart';
@ -29,11 +27,11 @@ class ArgListContributor extends DartCompletionContributor {
ArgumentList argumentList;
@override
Future<List<CompletionSuggestion>> computeSuggestions(
Future<void> computeSuggestions(
DartCompletionRequest request, SuggestionBuilder builder) async {
var executable = request.target.executableElement;
if (executable == null) {
return const <CompletionSuggestion>[];
return;
}
var node = request.target.containingNode;
if (node is ArgumentList) {
@ -43,7 +41,6 @@ class ArgListContributor extends DartCompletionContributor {
this.request = request;
this.builder = builder;
_addSuggestions(executable.parameters);
return const <CompletionSuggestion>[];
}
void _addDefaultParamSuggestions(Iterable<ParameterElement> parameters,

View file

@ -15,11 +15,11 @@ import 'package:analyzer/dart/element/element.dart';
/// when the completion is in a show or hide combinator of an import or export.
class CombinatorContributor extends DartCompletionContributor {
@override
Future<List<CompletionSuggestion>> computeSuggestions(
Future<void> computeSuggestions(
DartCompletionRequest request, SuggestionBuilder builder) async {
var node = request.target.containingNode;
if (node is! Combinator) {
return const <CompletionSuggestion>[];
return;
}
// Build the list of suggestions.
var directive = node.thisOrAncestorOfType<NamespaceDirective>();
@ -35,7 +35,6 @@ class CombinatorContributor extends DartCompletionContributor {
}
}
}
return const <CompletionSuggestion>[];
}
List<String> _getCombinatorNames(NamespaceDirective directive) {

View file

@ -184,14 +184,9 @@ class DartCompletionManager implements CompletionContributor {
var contributorTag =
'DartCompletionManager - ${contributor.runtimeType}';
performance.logStartTime(contributorTag);
var contributorSuggestions =
await contributor.computeSuggestions(dartRequest, builder);
await contributor.computeSuggestions(dartRequest, builder);
performance.logElapseTime(contributorTag);
request.checkAborted();
for (var newSuggestion in contributorSuggestions) {
addSuggestionToMap(newSuggestion);
}
}
for (var newSuggestion in builder.suggestions) {
addSuggestionToMap(newSuggestion);

View file

@ -4,8 +4,6 @@
import 'dart:async';
import 'package:analysis_server/src/protocol_server.dart'
show CompletionSuggestion;
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analyzer/dart/ast/ast.dart';
@ -23,13 +21,13 @@ class ExtensionMemberContributor extends DartCompletionContributor {
MemberSuggestionBuilder memberBuilder;
@override
Future<List<CompletionSuggestion>> computeSuggestions(
Future<void> computeSuggestions(
DartCompletionRequest request, SuggestionBuilder builder) async {
var containingLibrary = request.libraryElement;
// Gracefully degrade if the library could not be determined, such as with a
// detached part file or source change.
if (containingLibrary == null) {
return const <CompletionSuggestion>[];
return;
}
memberBuilder = MemberSuggestionBuilder(request, builder);
@ -63,24 +61,23 @@ class ExtensionMemberContributor extends DartCompletionContributor {
}
}
}
return const <CompletionSuggestion>[];
return;
}
if (expression.isSynthetic) {
return const <CompletionSuggestion>[];
return;
}
if (expression is Identifier) {
var elem = expression.staticElement;
if (elem is ClassElement) {
// Suggestions provided by StaticMemberContributor.
return const <CompletionSuggestion>[];
return;
} else if (elem is ExtensionElement) {
// Suggestions provided by StaticMemberContributor.
return const <CompletionSuggestion>[];
return;
} else if (elem is PrefixElement) {
// Suggestions provided by LibraryMemberContributor.
return const <CompletionSuggestion>[];
return;
}
}
if (expression is ExtensionOverride) {
@ -92,12 +89,11 @@ class ExtensionMemberContributor extends DartCompletionContributor {
// get to this point, but there's an NPE if we invoke
// `_resolveExtendedType` when `type` is `null`, so we guard against it
// to ensure that we can return the suggestions from other providers.
return const <CompletionSuggestion>[];
return;
}
_addExtensionMembers(containingLibrary, type);
expression.staticType;
}
return const <CompletionSuggestion>[];
}
void _addExtensionMembers(LibraryElement containingLibrary, DartType type) {

View file

@ -4,8 +4,6 @@
import 'dart:async';
import 'package:analysis_server/src/protocol_server.dart'
hide Element, ElementKind;
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analyzer/dart/ast/ast.dart';
@ -16,19 +14,19 @@ import 'package:analyzer/dart/ast/ast.dart';
/// expressions of the form `this.^` in a constructor's parameter list.
class FieldFormalContributor extends DartCompletionContributor {
@override
Future<List<CompletionSuggestion>> computeSuggestions(
Future<void> computeSuggestions(
DartCompletionRequest request, SuggestionBuilder builder) async {
var node = request.target.containingNode;
// TODO(brianwilkerson) We should suggest field formal parameters even if
// the user hasn't already typed the `this.` prefix, by including the
// prefix in the completion.
if (node is! FieldFormalParameter) {
return const <CompletionSuggestion>[];
return;
}
var constructor = node.thisOrAncestorOfType<ConstructorDeclaration>();
if (constructor == null) {
return const <CompletionSuggestion>[];
return;
}
// Compute the list of fields already referenced in the constructor.
@ -52,7 +50,7 @@ class FieldFormalContributor extends DartCompletionContributor {
var enclosingClass = constructor.thisOrAncestorOfType<ClassDeclaration>();
if (enclosingClass == null) {
return const <CompletionSuggestion>[];
return;
}
// Add suggestions for fields that are not already referenced.
@ -71,6 +69,5 @@ class FieldFormalContributor extends DartCompletionContributor {
}
}
}
return const <CompletionSuggestion>[];
}
}

View file

@ -4,8 +4,6 @@
import 'dart:async';
import 'package:analysis_server/src/protocol_server.dart'
show CompletionSuggestion;
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/local_library_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart'
@ -15,15 +13,15 @@ import 'package:analyzer/src/generated/resolver.dart';
/// A contributor for calculating suggestions for imported top level members.
class ImportedReferenceContributor extends DartCompletionContributor {
@override
Future<List<CompletionSuggestion>> computeSuggestions(
Future<void> computeSuggestions(
DartCompletionRequest request, SuggestionBuilder builder) async {
if (!request.includeIdentifiers) {
return const <CompletionSuggestion>[];
return;
}
var imports = request.libraryElement.imports;
if (imports == null) {
return const <CompletionSuggestion>[];
return;
}
// Traverse imports including dart:core
@ -34,7 +32,6 @@ class ImportedReferenceContributor extends DartCompletionContributor {
prefix: importElement.prefix?.name);
}
}
return const <CompletionSuggestion>[];
}
void _buildSuggestions(DartCompletionRequest request,

View file

@ -13,7 +13,6 @@ import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/src/dart/ast/token.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/src/utilities/completion/optype.dart';
const ASYNC_STAR = 'async*';
@ -29,14 +28,13 @@ const YIELD_STAR = 'yield*';
/// are valid at the completion point.
class KeywordContributor extends DartCompletionContributor {
@override
Future<List<CompletionSuggestion>> computeSuggestions(
Future<void> computeSuggestions(
DartCompletionRequest request, SuggestionBuilder builder) async {
// Don't suggest anything right after double or integer literals.
if (request.target.isDoubleOrIntLiteral()) {
return const <CompletionSuggestion>[];
return;
}
request.target.containingNode.accept(_KeywordVisitor(request, builder));
return const <CompletionSuggestion>[];
}
}

View file

@ -4,8 +4,6 @@
import 'dart:async';
import 'package:analysis_server/src/protocol_server.dart'
show CompletionSuggestion;
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/completion_manager.dart'
show DartCompletionRequestImpl;
@ -19,7 +17,7 @@ import 'package:analyzer_plugin/src/utilities/visitors/local_declaration_visitor
/// `continue` statements.
class LabelContributor extends DartCompletionContributor {
@override
Future<List<CompletionSuggestion>> computeSuggestions(
Future<void> computeSuggestions(
DartCompletionRequest request, SuggestionBuilder builder) async {
var optype = (request as DartCompletionRequestImpl).opType;
@ -33,7 +31,6 @@ class LabelContributor extends DartCompletionContributor {
.visit(request.target.containingNode);
}
}
return const <CompletionSuggestion>[];
}
}

View file

@ -4,21 +4,20 @@
import 'dart:async';
import 'package:analysis_server/src/protocol_server.dart'
show CompletionSuggestionKind;
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import '../../../protocol_server.dart'
show CompletionSuggestion, CompletionSuggestionKind;
/// A contributor that produces suggestions based on the members of a library
/// when the library was imported using a prefix. More concretely, this class
/// produces suggestions for expressions of the form `p.^`, where `p` is a
/// prefix.
class LibraryMemberContributor extends DartCompletionContributor {
@override
Future<List<CompletionSuggestion>> computeSuggestions(
Future<void> computeSuggestions(
DartCompletionRequest request, SuggestionBuilder builder) async {
// Determine if the target looks like a library prefix.
var targetId = request.dotTarget;
@ -31,15 +30,15 @@ class LibraryMemberContributor extends DartCompletionContributor {
if (containingLibrary != null) {
var imports = containingLibrary.imports;
if (imports != null) {
return _buildSuggestions(request, builder, elem, imports);
_buildSuggestions(request, builder, elem, imports);
return;
}
}
}
}
return const <CompletionSuggestion>[];
}
List<CompletionSuggestion> _buildSuggestions(
void _buildSuggestions(
DartCompletionRequest request,
SuggestionBuilder builder,
PrefixElement elem,
@ -83,6 +82,5 @@ class LibraryMemberContributor extends DartCompletionContributor {
}
}
}
return const <CompletionSuggestion>[];
}
}

View file

@ -4,8 +4,6 @@
import 'dart:async';
import 'package:analysis_server/src/protocol_server.dart'
show CompletionSuggestion;
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
@ -13,15 +11,15 @@ import 'package:analysis_server/src/services/completion/dart/suggestion_builder.
/// import directives.
class LibraryPrefixContributor extends DartCompletionContributor {
@override
Future<List<CompletionSuggestion>> computeSuggestions(
Future<void> computeSuggestions(
DartCompletionRequest request, SuggestionBuilder builder) async {
if (!request.includeIdentifiers) {
return const <CompletionSuggestion>[];
return;
}
var imports = request.libraryElement.imports;
if (imports == null) {
return const <CompletionSuggestion>[];
return;
}
for (var element in imports) {
@ -33,6 +31,5 @@ class LibraryPrefixContributor extends DartCompletionContributor {
}
}
}
return const <CompletionSuggestion>[];
}
}

View file

@ -5,7 +5,7 @@
import 'dart:async';
import 'package:analysis_server/src/protocol_server.dart'
show CompletionSuggestion, CompletionSuggestionKind;
show CompletionSuggestionKind;
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart'
show SuggestionBuilder;
@ -148,15 +148,15 @@ class LibraryElementSuggestionBuilder extends GeneralizingElementVisitor {
/// which the completion is requested.
class LocalLibraryContributor extends DartCompletionContributor {
@override
Future<List<CompletionSuggestion>> computeSuggestions(
Future<void> computeSuggestions(
DartCompletionRequest request, SuggestionBuilder builder) async {
if (!request.includeIdentifiers) {
return const <CompletionSuggestion>[];
return;
}
var libraryUnits = request.result.unit.declaredElement.library.units;
if (libraryUnits == null) {
return const <CompletionSuggestion>[];
return;
}
var visitor = LibraryElementSuggestionBuilder(request, builder);
@ -165,6 +165,5 @@ class LocalLibraryContributor extends DartCompletionContributor {
unit.accept(visitor);
}
}
return const <CompletionSuggestion>[];
}
}

View file

@ -5,7 +5,7 @@
import 'dart:async';
import 'package:analysis_server/src/protocol_server.dart'
show CompletionSuggestion, CompletionSuggestionKind;
show CompletionSuggestionKind;
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analysis_server/src/utilities/strings.dart';
@ -37,7 +37,7 @@ class LocalReferenceContributor extends DartCompletionContributor {
_VisibilityTracker visibilityTracker = _VisibilityTracker();
@override
Future<List<CompletionSuggestion>> computeSuggestions(
Future<void> computeSuggestions(
DartCompletionRequest request, SuggestionBuilder builder) async {
var opType = request.opType;
var node = request.target.containingNode;
@ -92,7 +92,6 @@ class LocalReferenceContributor extends DartCompletionContributor {
}
}
}
return const <CompletionSuggestion>[];
}
void _addSuggestionsForType(InterfaceType type, DartCompletionRequest request,

View file

@ -8,7 +8,6 @@ import 'package:analysis_server/src/provisional/completion/dart/completion_dart.
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
/// A contributor that produces suggestions based on the named constructors
/// defined on a given class. More concretely, this class produces suggestions
@ -16,13 +15,13 @@ import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
/// class.
class NamedConstructorContributor extends DartCompletionContributor {
@override
Future<List<CompletionSuggestion>> computeSuggestions(
Future<void> computeSuggestions(
DartCompletionRequest request, SuggestionBuilder builder) async {
var node = request.target.containingNode;
if (node is ConstructorName) {
var libraryElement = request.libraryElement;
if (libraryElement == null) {
return const <CompletionSuggestion>[];
return;
}
var typeName = node.type;
if (typeName != null) {
@ -35,7 +34,6 @@ class NamedConstructorContributor extends DartCompletionContributor {
}
}
}
return const <CompletionSuggestion>[];
}
void _buildSuggestions(

View file

@ -4,7 +4,6 @@
import 'dart:async';
import 'package:analysis_server/src/protocol_server.dart';
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analyzer/dart/ast/ast.dart';
@ -15,15 +14,15 @@ import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart'
/// inside a class declaration with templates for inherited members.
class OverrideContributor implements DartCompletionContributor {
@override
Future<List<CompletionSuggestion>> computeSuggestions(
Future<void> computeSuggestions(
DartCompletionRequest request, SuggestionBuilder builder) async {
var targetId = _getTargetId(request.target);
if (targetId == null) {
return const <CompletionSuggestion>[];
return;
}
var classDecl = targetId.thisOrAncestorOfType<ClassOrMixinDeclaration>();
if (classDecl == null) {
return const <CompletionSuggestion>[];
return;
}
var inheritance = InheritanceManager3();
@ -36,7 +35,6 @@ class OverrideContributor implements DartCompletionContributor {
_namesToOverride(classElem.librarySource.uri, interface);
// Build suggestions
var suggestions = <CompletionSuggestion>[];
for (var name in namesToOverride) {
var element = interfaceMap[name];
// Gracefully degrade if the overridden element has not been resolved.
@ -45,7 +43,6 @@ class OverrideContributor implements DartCompletionContributor {
await builder.suggestOverride(targetId, element, invokeSuper);
}
}
return suggestions;
}
/// If the target looks like a partial identifier inside a class declaration

View file

@ -4,8 +4,6 @@
import 'dart:async';
import 'package:analysis_server/src/protocol_server.dart'
show CompletionSuggestion;
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analyzer/dart/ast/ast.dart';
@ -17,7 +15,7 @@ import 'package:analyzer/dart/element/element.dart';
/// class, enum, or extension.
class StaticMemberContributor extends DartCompletionContributor {
@override
Future<List<CompletionSuggestion>> computeSuggestions(
Future<void> computeSuggestions(
DartCompletionRequest request, SuggestionBuilder builder) async {
var library = request.libraryElement;
if (library == null) {
@ -25,7 +23,7 @@ class StaticMemberContributor extends DartCompletionContributor {
// detached part file or source change.
// TODO(brianwilkerson) Consider testing for this before invoking _any_ of
// the contributors.
return const <CompletionSuggestion>[];
return;
}
bool isVisible(Element element) => element.isAccessibleIn(library);
var targetId = request.dotTarget;
@ -76,6 +74,5 @@ class StaticMemberContributor extends DartCompletionContributor {
}
}
}
return const <CompletionSuggestion>[];
}
}

View file

@ -5,8 +5,6 @@
import 'dart:async';
import 'dart:collection';
import 'package:analysis_server/src/protocol_server.dart'
show CompletionSuggestion;
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analyzer/dart/ast/ast.dart';
@ -21,13 +19,13 @@ import 'package:analyzer_plugin/src/utilities/visitors/local_declaration_visitor
/// instance of a type.
class TypeMemberContributor extends DartCompletionContributor {
@override
Future<List<CompletionSuggestion>> computeSuggestions(
Future<void> computeSuggestions(
DartCompletionRequest request, SuggestionBuilder builder) async {
var containingLibrary = request.libraryElement;
// Gracefully degrade if the library could not be determined, such as with a
// detached part file or source change.
if (containingLibrary == null) {
return const <CompletionSuggestion>[];
return;
}
// Recompute the target because resolution might have changed it.
@ -35,17 +33,17 @@ class TypeMemberContributor extends DartCompletionContributor {
if (expression == null ||
expression.isSynthetic ||
expression is ExtensionOverride) {
return const <CompletionSuggestion>[];
return;
}
if (expression is Identifier) {
var elem = expression.staticElement;
if (elem is ClassElement) {
// Suggestions provided by StaticMemberContributor.
return const <CompletionSuggestion>[];
return;
}
if (elem is PrefixElement) {
// Suggestions provided by LibraryMemberContributor.
return const <CompletionSuggestion>[];
return;
}
}
@ -96,8 +94,6 @@ class TypeMemberContributor extends DartCompletionContributor {
memberBuilder.buildSuggestions(type,
mixins: mixins, superclassConstraints: superclassConstraints);
}
return const <CompletionSuggestion>[];
}
}

View file

@ -5,8 +5,6 @@
import 'dart:async';
import 'dart:core';
import 'package:analysis_server/src/protocol_server.dart'
show CompletionSuggestion;
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analyzer/dart/ast/ast.dart';
@ -25,11 +23,10 @@ class UriContributor extends DartCompletionContributor {
static bool suggestFilePaths = true;
@override
Future<List<CompletionSuggestion>> computeSuggestions(
Future<void> computeSuggestions(
DartCompletionRequest request, SuggestionBuilder builder) async {
var visitor = _UriSuggestionBuilder(request, builder);
request.target.containingNode.accept(visitor);
return const <CompletionSuggestion>[];
}
}

View file

@ -4,8 +4,6 @@
import 'dart:async';
import 'package:analysis_server/src/protocol_server.dart'
show CompletionSuggestion;
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analysis_server/src/services/correction/name_suggestion.dart';
@ -16,7 +14,7 @@ import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart'
/// static type of the variable.
class VariableNameContributor extends DartCompletionContributor {
@override
Future<List<CompletionSuggestion>> computeSuggestions(
Future<void> computeSuggestions(
DartCompletionRequest request, SuggestionBuilder builder) async {
var opType = request.opType;
@ -65,7 +63,7 @@ class VariableNameContributor extends DartCompletionContributor {
}
}
if (strName == null) {
return const <CompletionSuggestion>[];
return;
}
var doIncludePrivateVersion =
@ -80,7 +78,6 @@ class VariableNameContributor extends DartCompletionContributor {
}
}
}
return const <CompletionSuggestion>[];
}
/// Given some [name], add a suggestion with the name (unless the name is

View file

@ -55,8 +55,8 @@ abstract class DartCompletionContributorTest
Future<List<CompletionSuggestion>> computeContributedSuggestions(
DartCompletionRequest request) async {
var builder = SuggestionBuilder(request);
var suggestions = await contributor.computeSuggestions(request, builder);
return [...suggestions, ...builder.suggestions];
await contributor.computeSuggestions(request, builder);
return builder.suggestions.toList();
}
DartCompletionContributor createContributor();