mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 03:27:43 +00:00
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:
parent
c49a626957
commit
f6621463b2
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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');
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue