refactor ContributionSorter to use new API

move CompletionTarget to public API
modify DartCompletionRequest to return completion target

R=brianwilkerson@google.com

Review URL: https://codereview.chromium.org//1347283005 .
This commit is contained in:
danrubel
2015-09-18 16:03:22 -04:00
parent 9ad1bf1f0e
commit d6051a53a0
11 changed files with 43 additions and 23 deletions
@@ -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.
@@ -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<CompletionSuggestion> 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<CompletionSuggestion> 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<CompletionSuggestion> suggestions) {
String typeName = type.name;
List<String> 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 ||
@@ -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);
}
@@ -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<CompletionSuggestion> suggestions);
}
@@ -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;
@@ -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';
@@ -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<CompletionSuggestion> suggestions) {
if (!enabled) {
throw 'unexpected sort';
}
}
@@ -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';
@@ -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';
@@ -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';