diff --git a/pkg/analysis_server/lib/completion/completion_dart.dart b/pkg/analysis_server/lib/completion/completion_dart.dart index 669b2efe441..1ddd5a095be 100644 --- a/pkg/analysis_server/lib/completion/completion_dart.dart +++ b/pkg/analysis_server/lib/completion/completion_dart.dart @@ -9,6 +9,7 @@ import 'package:analysis_server/src/protocol.dart'; import 'package:analyzer/src/generated/ast.dart'; import 'package:analyzer/src/generated/engine.dart'; import 'package:analyzer/src/generated/source.dart'; +import 'package:analysis_server/completion/dart/completion_target.dart'; /** * An object used to produce completions for a specific error within a Dart @@ -78,7 +79,7 @@ abstract class DartCompletionRequest extends CompletionRequest { * Return the completion target. This determines what part of the parse tree * will receive the newly inserted text. */ - //CompletionTarget get target; + CompletionTarget get target; /** * Information about the types of suggestions that should be included. diff --git a/pkg/analysis_server/lib/src/services/completion/completion_target.dart b/pkg/analysis_server/lib/completion/dart/completion_target.dart similarity index 100% rename from pkg/analysis_server/lib/src/services/completion/completion_target.dart rename to pkg/analysis_server/lib/completion/dart/completion_target.dart diff --git a/pkg/analysis_server/lib/src/services/completion/common_usage_computer.dart b/pkg/analysis_server/lib/src/services/completion/common_usage_computer.dart index 047a1fbe9bf..2b391ca7ea4 100644 --- a/pkg/analysis_server/lib/src/services/completion/common_usage_computer.dart +++ b/pkg/analysis_server/lib/src/services/completion/common_usage_computer.dart @@ -4,11 +4,13 @@ library services.completion.computer.dart.relevance; +import 'package:analysis_server/completion/completion_dart.dart'; import 'package:analysis_server/src/protocol_server.dart' as protocol; import 'package:analysis_server/src/protocol_server.dart' show CompletionSuggestion, CompletionSuggestionKind; import 'package:analysis_server/src/services/completion/contribution_sorter.dart'; -import 'package:analysis_server/src/services/completion/dart_completion_manager.dart'; +import 'package:analysis_server/src/services/completion/dart_completion_manager.dart' + show DART_RELEVANCE_COMMON_USAGE; import 'package:analyzer/src/generated/ast.dart'; import 'package:analyzer/src/generated/element.dart'; @@ -31,8 +33,9 @@ class CommonUsageComputer implements ContributionSorter { CommonUsageComputer([this.selectorRelevance = defaultSelectorRelevance]); @override - void sort(DartCompletionRequest request) { - _update(request); + void sort(DartCompletionRequest request, + Iterable suggestions) { + _update(request, suggestions); } /** @@ -40,7 +43,8 @@ class CommonUsageComputer implements ContributionSorter { * The compilation unit and completion node * in the given completion context may not be resolved. */ - void _update(DartCompletionRequest request) { + void _update(DartCompletionRequest request, + Iterable suggestions) { var visitor = new _BestTypeVisitor(request.target.entity); DartType type = request.target.containingNode.accept(visitor); if (type != null) { @@ -48,7 +52,7 @@ class CommonUsageComputer implements ContributionSorter { if (typeElem != null) { LibraryElement libElem = typeElem.library; if (libElem != null) { - _updateInvocationRelevance(request, type, libElem); + _updateInvocationRelevance(request, type, libElem, suggestions); } } } @@ -58,12 +62,12 @@ class CommonUsageComputer implements ContributionSorter { * Adjusts the relevance of all method suggestions based upon the given * target type and library. */ - void _updateInvocationRelevance( - DartCompletionRequest request, DartType type, LibraryElement libElem) { + void _updateInvocationRelevance(DartCompletionRequest request, DartType type, + LibraryElement libElem, Iterable suggestions) { String typeName = type.name; List selectors = selectorRelevance['${libElem.name}.${typeName}']; if (selectors != null) { - for (CompletionSuggestion suggestion in request.suggestions) { + for (CompletionSuggestion suggestion in suggestions) { protocol.Element element = suggestion.element; if (element != null && (element.kind == protocol.ElementKind.CONSTRUCTOR || diff --git a/pkg/analysis_server/lib/src/services/completion/completion_dart.dart b/pkg/analysis_server/lib/src/services/completion/completion_dart.dart index 526d69d283d..430429525bf 100644 --- a/pkg/analysis_server/lib/src/services/completion/completion_dart.dart +++ b/pkg/analysis_server/lib/src/services/completion/completion_dart.dart @@ -6,6 +6,7 @@ library analysis_server.src.services.completion.completion_dart; import 'package:analysis_server/completion/completion_core.dart'; import 'package:analysis_server/completion/completion_dart.dart'; +import 'package:analysis_server/completion/dart/completion_target.dart'; import 'package:analysis_server/src/services/completion/completion_core.dart'; import 'package:analyzer/src/generated/ast.dart'; @@ -24,11 +25,17 @@ class DartCompletionRequestImpl extends CompletionRequestImpl */ final bool isResolved; + /** + * The completion target. This determines what part of the parse tree + * will receive the newly inserted text. + */ + final CompletionTarget target; + /** * Initialize a newly created completion request based on the given arguments. */ DartCompletionRequestImpl( - CompletionRequest request, this.unit, this.isResolved) + CompletionRequest request, this.unit, this.isResolved, this.target) : super(request.context, request.resourceProvider, request.source, request.offset); } diff --git a/pkg/analysis_server/lib/src/services/completion/contribution_sorter.dart b/pkg/analysis_server/lib/src/services/completion/contribution_sorter.dart index a702f66921c..737a8378270 100644 --- a/pkg/analysis_server/lib/src/services/completion/contribution_sorter.dart +++ b/pkg/analysis_server/lib/src/services/completion/contribution_sorter.dart @@ -4,8 +4,8 @@ library services.completion.sorter; +import 'package:analysis_server/completion/completion_dart.dart'; import 'package:analysis_server/src/protocol.dart'; -import 'package:analysis_server/src/services/completion/dart_completion_manager.dart'; /** * The abstract class `ContributionSorter` defines the behavior of objects @@ -21,5 +21,6 @@ abstract class ContributionSorter { * in the given completion context may not be resolved. * This method should execute quickly and not block. */ - void sort(DartCompletionRequest request); + void sort(DartCompletionRequest request, + Iterable suggestions); } diff --git a/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart index 5dad398eb59..ae177f28833 100644 --- a/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart +++ b/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart @@ -9,13 +9,13 @@ import 'dart:async'; import 'package:analysis_server/completion/completion_core.dart' show CompletionRequest; import 'package:analysis_server/completion/completion_dart.dart' as newApi; +import 'package:analysis_server/completion/dart/completion_target.dart'; import 'package:analysis_server/src/analysis_server.dart'; import 'package:analysis_server/src/protocol.dart'; import 'package:analysis_server/src/services/completion/arglist_contributor.dart'; import 'package:analysis_server/src/services/completion/combinator_contributor.dart'; import 'package:analysis_server/src/services/completion/common_usage_computer.dart'; import 'package:analysis_server/src/services/completion/completion_manager.dart'; -import 'package:analysis_server/src/services/completion/completion_target.dart'; import 'package:analysis_server/src/services/completion/contribution_sorter.dart'; import 'package:analysis_server/src/services/completion/dart_completion_cache.dart'; import 'package:analysis_server/src/services/completion/imported_reference_contributor.dart'; @@ -180,7 +180,8 @@ class DartCompletionManager extends CompletionManager { return c.computeFast(request); }); }); - contributionSorter.sort(request); + contributionSorter.sort( + new OldRequestWrapper(request), request.suggestions); sendResults(request, todo.isEmpty); return todo; }); @@ -218,7 +219,8 @@ class DartCompletionManager extends CompletionManager { performance.logElapseTime(completeTag); bool last = --count == 0; if (changed || last) { - contributionSorter.sort(request); + contributionSorter.sort( + new OldRequestWrapper(request), request.suggestions); sendResults(request, last); } }); @@ -482,6 +484,9 @@ class OldRequestWrapper implements newApi.DartCompletionRequest { @override Source get source => request.source; + @override + CompletionTarget get target => request.target; + @override CompilationUnit get unit => request.unit; diff --git a/pkg/analysis_server/lib/src/services/completion/optype.dart b/pkg/analysis_server/lib/src/services/completion/optype.dart index 02c89bf0436..5a04322fbad 100644 --- a/pkg/analysis_server/lib/src/services/completion/optype.dart +++ b/pkg/analysis_server/lib/src/services/completion/optype.dart @@ -4,7 +4,7 @@ library services.completion.dart.optype; -import 'package:analysis_server/src/services/completion/completion_target.dart'; +import 'package:analysis_server/completion/dart/completion_target.dart'; import 'package:analyzer/src/generated/ast.dart'; import 'package:analyzer/src/generated/scanner.dart'; diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart index 57736362155..1202ef3317f 100644 --- a/pkg/analysis_server/test/domain_completion_test.dart +++ b/pkg/analysis_server/test/domain_completion_test.dart @@ -8,6 +8,7 @@ import 'dart:async'; import 'package:analysis_server/completion/completion_core.dart' show CompletionRequest, CompletionResult; +import 'package:analysis_server/completion/completion_dart.dart' as newApi; import 'package:analysis_server/src/analysis_server.dart'; import 'package:analysis_server/src/channel/channel.dart'; import 'package:analysis_server/src/constants.dart'; @@ -481,7 +482,7 @@ class CompletionTest extends AbstractAnalysisTest { expect(suggestions.any((s) => s.relevance == DART_RELEVANCE_COMMON_USAGE), isFalse); DartCompletionManager.defaultContributionSorter = originalSorter; - expect(mockSorter.count, 2); + mockSorter.enabled = false; }); } @@ -715,11 +716,12 @@ class MockContext implements AnalysisContext { } class MockRelevancySorter implements ContributionSorter { - int count = 0; + bool enabled = true; @override - void sort(DartCompletionRequest request) { - if (++count > 2) { + void sort(newApi.DartCompletionRequest request, + List suggestions) { + if (!enabled) { throw 'unexpected sort'; } } diff --git a/pkg/analysis_server/test/services/completion/completion_target_test.dart b/pkg/analysis_server/test/services/completion/completion_target_test.dart index 35bd5dafbc2..6d0e52f30d0 100644 --- a/pkg/analysis_server/test/services/completion/completion_target_test.dart +++ b/pkg/analysis_server/test/services/completion/completion_target_test.dart @@ -4,7 +4,7 @@ library test.services.completion.target; -import 'package:analysis_server/src/services/completion/completion_target.dart'; +import 'package:analysis_server/completion/dart/completion_target.dart'; import 'package:analyzer/src/generated/ast.dart'; import 'package:analyzer/src/generated/source.dart'; import 'package:test_reflective_loader/test_reflective_loader.dart'; diff --git a/pkg/analysis_server/test/services/completion/completion_test_util.dart b/pkg/analysis_server/test/services/completion/completion_test_util.dart index 2e357d67c5c..7cfdffd84cc 100644 --- a/pkg/analysis_server/test/services/completion/completion_test_util.dart +++ b/pkg/analysis_server/test/services/completion/completion_test_util.dart @@ -12,7 +12,7 @@ import 'package:analysis_server/src/protocol.dart' as protocol import 'package:analysis_server/src/protocol.dart' hide Element, ElementKind; import 'package:analysis_server/src/services/completion/common_usage_computer.dart'; import 'package:analysis_server/src/services/completion/completion_manager.dart'; -import 'package:analysis_server/src/services/completion/completion_target.dart'; +import 'package:analysis_server/completion/dart/completion_target.dart'; import 'package:analysis_server/src/services/completion/dart_completion_cache.dart'; import 'package:analysis_server/src/services/completion/dart_completion_manager.dart'; import 'package:analysis_server/src/services/completion/imported_reference_contributor.dart'; diff --git a/pkg/analysis_server/test/services/completion/optype_test.dart b/pkg/analysis_server/test/services/completion/optype_test.dart index efd355e5af3..e2c654cf20b 100644 --- a/pkg/analysis_server/test/services/completion/optype_test.dart +++ b/pkg/analysis_server/test/services/completion/optype_test.dart @@ -4,7 +4,7 @@ library test.services.completion.contributor.dart.optype; -import 'package:analysis_server/src/services/completion/completion_target.dart'; +import 'package:analysis_server/completion/dart/completion_target.dart'; import 'package:analysis_server/src/services/completion/optype.dart'; import 'package:analyzer/src/generated/ast.dart'; import 'package:analyzer/src/generated/engine.dart';