More progress on converting LocalReferenceContributor

Change-Id: Idf4b0051504ad020d17e4f1733ca7036aadddf18
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/145665
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Jaime Wren <jwren@google.com>
This commit is contained in:
Brian Wilkerson 2020-05-01 14:44:13 +00:00 committed by commit-bot@chromium.org
parent c49a626957
commit f6621463b2
5 changed files with 112 additions and 78 deletions

View file

@ -299,49 +299,22 @@ class _LocalVisitor extends LocalDeclarationVisitor {
if ((opType.includeReturnValueSuggestions ||
opType.includeVoidReturnSuggestions) &&
(!opType.inStaticMethodBody || declaration.isStatic)) {
// var method = declaration.declaredElement;
// // TODO(brianwilkerson) Use request.featureComputer.inheritanceDistance to
// // compute the inheritance distance.
// var inheritanceDistance = -1.0;
// builder.suggestMethod(method, inheritanceDistance: inheritanceDistance, kind: _defaultKind);
protocol.ElementKind elemKind;
FormalParameterList param;
var typeName = declaration.returnType;
var relevance = DART_RELEVANCE_DEFAULT;
if (declaration.isGetter) {
elemKind = protocol.ElementKind.GETTER;
param = null;
relevance = DART_RELEVANCE_LOCAL_ACCESSOR;
} else if (declaration.isSetter) {
if (!opType.includeVoidReturnSuggestions) {
return;
}
elemKind = protocol.ElementKind.SETTER;
typeName = NO_RETURN_TYPE;
relevance = DART_RELEVANCE_LOCAL_ACCESSOR;
} else {
if (!opType.includeVoidReturnSuggestions && _isVoid(typeName)) {
return;
}
elemKind = protocol.ElementKind.METHOD;
param = declaration.parameters;
relevance = DART_RELEVANCE_LOCAL_METHOD;
var element = declaration.declaredElement;
var inheritanceDistance = -1.0;
var enclosingClass = request.target.containingNode
.thisOrAncestorOfType<ClassDeclaration>();
if (enclosingClass != null) {
inheritanceDistance = request.featureComputer
.inheritanceDistanceFeature(
enclosingClass.declaredElement, element.enclosingElement);
}
if (useNewRelevance) {
relevance = _relevanceForType(declaration.declaredElement.returnType);
if (element is MethodElement) {
builder.suggestMethod(element,
inheritanceDistance: inheritanceDistance, kind: _defaultKind);
} else if (element is PropertyAccessorElement) {
builder.suggestAccessor(element,
inheritanceDistance: inheritanceDistance);
}
_addLocalSuggestion_includeReturnValueSuggestions(
declaration.declaredElement,
declaration.name,
typeName,
elemKind,
isAbstract: declaration.isAbstract,
isDeprecated: isDeprecated(declaration),
classDecl: declaration.parent,
param: param,
relevance: relevance,
type: declaration.declaredElement.type,
);
}
}
@ -378,23 +351,8 @@ class _LocalVisitor extends LocalDeclarationVisitor {
VariableDeclarationList varList, VariableDeclaration varDecl) {
if (opType.includeReturnValueSuggestions) {
var variableElement = varDecl.declaredElement;
// builder.suggestTopLevelPropertyAccessor((variableElement as TopLevelVariableElement).getter);
var variableType = variableElement.type;
int relevance;
if (useNewRelevance) {
relevance = _relevanceForType(variableType);
} else {
relevance = DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE;
}
_addLocalSuggestion_includeReturnValueSuggestions(
variableElement,
varDecl.name,
varList.type,
protocol.ElementKind.TOP_LEVEL_VARIABLE,
isDeprecated: isDeprecated(varList) || isDeprecated(varDecl),
relevance: relevance,
type: variableType,
);
builder.suggestTopLevelPropertyAccessor(
(variableElement as TopLevelVariableElement).getter);
}
}

View file

@ -392,6 +392,13 @@ class SuggestionBuilder {
superMatches: superMatches);
} else {
relevance = _computeOldMemberRelevance(accessor);
if (request.opType.includeReturnValueSuggestions) {
relevance =
request.opType.returnValueSuggestionsFilter(type, relevance);
}
if (relevance == null) {
return;
}
}
_add(createSuggestion(request, accessor, relevance: relevance));
}
@ -630,6 +637,13 @@ class SuggestionBuilder {
} else {
relevance = _computeOldMemberRelevance(method,
containingMethodName: containingMemberName);
if (request.opType.includeReturnValueSuggestions) {
relevance = request.opType
.returnValueSuggestionsFilter(method.returnType, relevance);
}
if (relevance == null) {
return;
}
}
var suggestion =
@ -705,9 +719,13 @@ class SuggestionBuilder {
} else if (accessor.hasOrInheritsDeprecated) {
relevance = DART_RELEVANCE_LOW;
} else {
relevance = variable.library == request.libraryElement
? DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE
: DART_RELEVANCE_DEFAULT;
var type =
accessor.isGetter ? accessor.returnType : accessor.parameters[0].type;
relevance = _computeOldMemberRelevance(variable);
relevance = request.opType.returnValueSuggestionsFilter(type, relevance);
if (relevance == null) {
return;
}
}
_add(createSuggestion(request, variable, kind: kind, relevance: relevance));
@ -775,6 +793,23 @@ class SuggestionBuilder {
// https://github.com/dart-lang/sdk/issues/27303
return DART_RELEVANCE_LOW;
}
if (!member.name.startsWith('_') &&
member.library == request.libraryElement) {
// Locally declared elements sometimes have a special relevance.
if (member is PropertyAccessorElement) {
return DART_RELEVANCE_LOCAL_ACCESSOR;
} else if (member is FieldElement) {
return DART_RELEVANCE_LOCAL_FIELD;
} else if (member is FunctionElement) {
return DART_RELEVANCE_LOCAL_FUNCTION;
} else if (member is MethodElement) {
return DART_RELEVANCE_LOCAL_METHOD;
} else if (member is TopLevelVariableElement) {
return DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE;
} else if (member is LocalVariableElement) {
return DART_RELEVANCE_LOCAL_VARIABLE;
}
}
return DART_RELEVANCE_DEFAULT;
}

View file

@ -540,7 +540,8 @@ class B extends A {
return getSuggestions().then((_) {
expect(replacementOffset, equals(completionOffset));
expect(replacementLength, equals(0));
assertHasResult(CompletionSuggestionKind.INVOCATION, 'm');
assertHasResult(CompletionSuggestionKind.INVOCATION, 'm',
relevance: DART_RELEVANCE_LOCAL_METHOD);
});
}
@ -569,7 +570,8 @@ class B extends A {
return getSuggestions().then((_) {
expect(replacementOffset, equals(completionOffset));
expect(replacementLength, equals(0));
assertHasResult(CompletionSuggestionKind.INVOCATION, 'b');
assertHasResult(CompletionSuggestionKind.INVOCATION, 'b',
relevance: DART_RELEVANCE_LOCAL_METHOD);
});
}
@ -601,7 +603,8 @@ class B extends A {
return getSuggestions().then((_) {
expect(replacementOffset, equals(completionOffset));
expect(replacementLength, equals(0));
assertHasResult(CompletionSuggestionKind.INVOCATION, 'b');
assertHasResult(CompletionSuggestionKind.INVOCATION, 'b',
relevance: DART_RELEVANCE_LOCAL_METHOD);
});
}
@ -611,7 +614,7 @@ class A { var isVisible;}
main(A p) { var v1 = p.is^; }''');
await getSuggestions();
assertHasResult(CompletionSuggestionKind.INVOCATION, 'isVisible',
relevance: DART_RELEVANCE_DEFAULT);
relevance: DART_RELEVANCE_LOCAL_ACCESSOR);
}
Future<void> test_keyword() {
@ -674,8 +677,7 @@ class B extends A {
return getSuggestions().then((_) {
expect(replacementOffset, equals(completionOffset));
expect(replacementLength, equals(0));
assertHasResult(CompletionSuggestionKind.INVOCATION, 'm',
relevance: DART_RELEVANCE_LOCAL_METHOD);
assertHasResult(CompletionSuggestionKind.INVOCATION, 'm');
});
}
@ -741,8 +743,7 @@ class B extends A {m() {^}}
return getSuggestions().then((_) {
expect(replacementOffset, equals(completionOffset));
expect(replacementLength, equals(0));
assertHasResult(CompletionSuggestionKind.INVOCATION, 'm',
relevance: DART_RELEVANCE_LOCAL_METHOD);
assertHasResult(CompletionSuggestionKind.INVOCATION, 'm');
});
}

View file

@ -108,7 +108,8 @@ main() {
});
expect(replacementOffset, equals(completionOffset));
expect(replacementLength, equals(0));
assertHasResult(CompletionSuggestionKind.INVOCATION, 'g1');
assertHasResult(CompletionSuggestionKind.INVOCATION, 'g1',
relevance: DART_RELEVANCE_LOCAL_ACCESSOR);
assertHasResult(CompletionSuggestionKind.INVOCATION, 'g2',
relevance: DART_RELEVANCE_COMMON_USAGE);
assertNoResult('Future');
@ -124,7 +125,8 @@ main() {
});
expect(replacementOffset, equals(completionOffset));
expect(replacementLength, equals(0));
assertHasResult(CompletionSuggestionKind.INVOCATION, 's1');
assertHasResult(CompletionSuggestionKind.INVOCATION, 's1',
relevance: DART_RELEVANCE_LOCAL_ACCESSOR);
assertHasResult(CompletionSuggestionKind.INVOCATION, 's2',
relevance: DART_RELEVANCE_COMMON_USAGE);
assertNoResult('Future');

View file

@ -3739,7 +3739,16 @@ class B extends A {
Future<void> test_MethodDeclaration_body_getters() async {
// Block BlockFunctionBody MethodDeclaration
addTestSource('class A {@deprecated X get f => 0; Z a() {^} get _g => 1;}');
addTestSource('''
class A {
@deprecated
X get f => 0;
Z a() {^}
get _g => 1;
}
class X {}
class Z {}
''');
await computeSuggestions();
expect(replacementOffset, completionOffset);
@ -3804,7 +3813,15 @@ class A extends B {
Future<void> test_MethodDeclaration_members() async {
// Block BlockFunctionBody MethodDeclaration
addTestSource('class A {@deprecated X f; Z _a() {^} var _g;}');
addTestSource('''
class A {
@deprecated X f;
Z _a() {^}
var _g;
}
class X {}
class Z {}
''');
await computeSuggestions();
expect(replacementOffset, completionOffset);
@ -3835,13 +3852,22 @@ class A extends B {
Future<void> test_MethodDeclaration_members_private() async {
// Block BlockFunctionBody MethodDeclaration
addTestSource('class A {@deprecated X f; Z _a() {_^} var _g;}');
addTestSource('''
class A {
@deprecated
X f;
Z _a() {_^}
var _g;
}
class X {}
class Z {}
''');
await computeSuggestions();
expect(replacementOffset, completionOffset - 1);
expect(replacementLength, 1);
var methodA = assertSuggestMethod('_a', 'A', 'Z',
relevance: DART_RELEVANCE_LOCAL_METHOD);
var methodA =
assertSuggestMethod('_a', 'A', 'Z', relevance: DART_RELEVANCE_DEFAULT);
if (methodA != null) {
expect(methodA.element.isDeprecated, isFalse);
expect(methodA.element.isPrivate, isTrue);
@ -3867,7 +3893,14 @@ class A extends B {
Future<void> test_MethodDeclaration_parameters_named() async {
// Block BlockFunctionBody MethodDeclaration
addTestSource('class A {@deprecated Z a(X x, _, b, {y: boo}) {^}}');
addTestSource('''
class A {
@deprecated
Z a(X x, _, b, {y: boo}) {^}
}
class X {}
class Z {}
''');
await computeSuggestions();
expect(replacementOffset, completionOffset);
@ -3890,7 +3923,12 @@ class A extends B {
addTestSource('''
foo() { }
void bar() { }
class A {Z a(X x, [int y=1]) {^}}''');
class A {
Z a(X x, [int y=1]) {^}
}
class X {}
class Z {}
''');
await computeSuggestions();
expect(replacementOffset, completionOffset);