diff --git a/pkg/analysis_server/analyzer_use_new_elements.txt b/pkg/analysis_server/analyzer_use_new_elements.txt index 9bd361616c4..3602baeebff 100644 --- a/pkg/analysis_server/analyzer_use_new_elements.txt +++ b/pkg/analysis_server/analyzer_use_new_elements.txt @@ -29,7 +29,6 @@ lib/src/search/element_references.dart lib/src/search/type_hierarchy.dart lib/src/services/completion/dart/completion_manager.dart lib/src/services/completion/dart/declaration_helper.dart -lib/src/services/completion/dart/feature_computer.dart lib/src/services/completion/dart/identifier_helper.dart lib/src/services/completion/dart/in_scope_completion_pass.dart lib/src/services/completion/dart/not_imported_completion_pass.dart diff --git a/pkg/analysis_server/lib/src/services/completion/dart/candidate_suggestion.dart b/pkg/analysis_server/lib/src/services/completion/dart/candidate_suggestion.dart index 101f6a2c57e..7e2c27b9edd 100644 --- a/pkg/analysis_server/lib/src/services/completion/dart/candidate_suggestion.dart +++ b/pkg/analysis_server/lib/src/services/completion/dart/candidate_suggestion.dart @@ -679,7 +679,7 @@ mixin MemberSuggestion implements ElementBasedSuggestion { var declaringClass = element.enclosingElement2; var referencingInterface = this.referencingInterface; if (referencingInterface != null && declaringClass is InterfaceElement2) { - inheritanceDistance = featureComputer.inheritanceDistanceFeature2( + inheritanceDistance = featureComputer.inheritanceDistanceFeature( referencingInterface, declaringClass, ); diff --git a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart index 2e4ac40570c..bb056ae37fe 100644 --- a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart +++ b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart @@ -16,7 +16,6 @@ import 'package:analysis_server/src/utilities/extensions/element.dart'; import 'package:analysis_server/src/utilities/extensions/numeric.dart'; import 'package:analyzer/dart/ast/token.dart'; import 'package:analyzer/dart/ast/visitor.dart'; -import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/dart/element/type_provider.dart'; @@ -24,7 +23,6 @@ import 'package:analyzer/dart/element/type_system.dart'; import 'package:analyzer/src/dart/ast/ast.dart'; import 'package:analyzer/src/dart/element/extensions.dart'; import 'package:analyzer/src/dart/element/inheritance_manager3.dart'; -import 'package:analyzer/src/utilities/extensions/element.dart'; import 'package:analyzer/src/utilities/extensions/object.dart'; import 'package:analyzer_plugin/utilities/range_factory.dart'; @@ -190,19 +188,19 @@ class FeatureComputer { /// setters are always mapped into a different kind: FIELD for getters and /// setters declared in a class or extension, and TOP_LEVEL_VARIABLE for /// top-level getters and setters. - protocol.ElementKind computeElementKind(Element element) { - if (element is LibraryElement) { + protocol.ElementKind computeElementKind(Element2 element) { + if (element is LibraryElement2) { return protocol.ElementKind.PREFIX; - } else if (element is EnumElement) { + } else if (element is EnumElement2) { return protocol.ElementKind.ENUM; - } else if (element is MixinElement) { + } else if (element is MixinElement2) { return protocol.ElementKind.MIXIN; - } else if (element is ClassElement) { + } else if (element is ClassElement2) { return protocol.ElementKind.CLASS; - } else if (element is FieldElement && element.isEnumConstant) { + } else if (element is FieldElement2 && element.isEnumConstant) { return protocol.ElementKind.ENUM_CONSTANT; - } else if (element is PropertyAccessorElement) { - var variable = element.variable2; + } else if (element is PropertyAccessorElement2) { + var variable = element.variable3; if (variable == null) { return protocol.ElementKind.UNKNOWN; } @@ -333,31 +331,6 @@ class FeatureComputer { /// completing at the given [completionLocation]. If a [distance] is given it /// will be used to provide finer-grained relevance scores. double elementKindFeature( - Element element, - String? completionLocation, { - double? distance, - }) { - if (completionLocation == null) { - return 0.0; - } - var locationTable = elementKindRelevance[completionLocation]; - if (locationTable == null) { - return 0.0; - } - var range = locationTable[computeElementKind(element)]; - if (range == null) { - return 0.0; - } - if (distance == null) { - return range.middle; - } - return range.conditionalProbability(distance); - } - - /// Return the value of the _element kind_ feature for the [element] when - /// completing at the given [completionLocation]. If a [distance] is given it - /// will be used to provide finer-grained relevance scores. - double elementKindFeature2( Element2 element, String? completionLocation, { double? distance, @@ -379,13 +352,8 @@ class FeatureComputer { return range.conditionalProbability(distance); } - /// Return the value of the _has deprecated_ feature for the given [element]. - double hasDeprecatedFeature(Element element) { - return element.hasOrInheritsDeprecated ? -1.0 : 0.0; - } - // Return the value of the _has deprecated_ feature for the given [element]. - double hasDeprecatedFeature2(Element2 element) { + double hasDeprecatedFeature(Element2 element) { return element.hasOrInheritsDeprecated ? -1.0 : 0.0; } @@ -396,21 +364,6 @@ class FeatureComputer { /// supertype if the two types are not the same. Return `-1` if the [subclass] /// is not a subclass of the [superclass]. int inheritanceDistance( - InterfaceElement subclass, - InterfaceElement superclass, - ) { - // This method is only visible for the metrics computation and might be made - // private at some future date. - return _inheritanceDistance(subclass.asElement2, superclass.asElement2, {}); - } - - /// Return the inheritance distance between the [subclass] and the - /// [superclass]. We define the inheritance distance between two types to be - /// zero if the two types are the same and the minimum number of edges that - /// must be traversed in the type graph to get from the subtype to the - /// supertype if the two types are not the same. Return `-1` if the [subclass] - /// is not a subclass of the [superclass]. - int inheritanceDistance2( InterfaceElement2 subclass, InterfaceElement2 superclass, ) { @@ -423,21 +376,6 @@ class FeatureComputer { /// defined in the [superclass] that is being accessed through an expression /// whose static type is the [subclass]. double inheritanceDistanceFeature( - InterfaceElement subclass, - InterfaceElement superclass, - ) { - var distance = _inheritanceDistance( - subclass.asElement2, - superclass.asElement2, - {}, - ); - return distanceToPercent(distance); - } - - /// Return the value of the _inheritance distance_ feature for a member - /// defined in the [superclass] that is being accessed through an expression - /// whose static type is the [subclass]. - double inheritanceDistanceFeature2( InterfaceElement2 subclass, InterfaceElement2 superclass, ) { @@ -446,24 +384,7 @@ class FeatureComputer { } /// Return the value of the _is constant_ feature for the given [element]. - double isConstantFeature(Element element) { - if (element is ConstructorElement && element.isConst) { - return 1.0; - } else if (element is FieldElement && element.isStatic && element.isConst) { - return 1.0; - } else if (element is TopLevelVariableElement && element.isConst) { - return 1.0; - } else if (element is PropertyAccessorElement && element.isSynthetic) { - var variable = element.variable2; - if (variable != null && variable.isStatic && variable.isConst) { - return 1.0; - } - } - return 0.0; - } - - /// Return the value of the _is constant_ feature for the given [element]. - double isConstantFeature2(Element2 element) { + double isConstantFeature(Element2 element) { if (element is ConstructorElement2 && element.isConst) { return 1.0; } else if (element is FieldElement2 && @@ -491,7 +412,7 @@ class FeatureComputer { // override of `noSuchMethod`. return 0.0; } - return proposedMemberName == FunctionElement.NO_SUCH_METHOD_METHOD_NAME + return proposedMemberName == MethodElement2.NO_SUCH_METHOD_METHOD_NAME ? -1.0 : 0.0; } @@ -612,7 +533,7 @@ class _ContextTypeVisitor extends SimpleAstVisitor { if (range .endStart(node.leftParenthesis, node.rightParenthesis) .contains(offset)) { - var parameters = node.functionType?.parameters; + var parameters = node.functionType?.formalParameters; if (parameters == null) { return null; } @@ -637,14 +558,14 @@ class _ContextTypeVisitor extends SimpleAstVisitor { } if (argument.contains(offset)) { if (offset >= argument.name.end) { - return argument.staticParameterElement?.type; + return argument.element2?.type; } return null; } } else { if (previousArgument == null || previousArgument.end < offset) { if (offset <= argument.end) { - return argument.staticParameterElement?.type; + return argument.correspondingParameter?.type; } } previousArgument = argument; @@ -717,7 +638,7 @@ class _ContextTypeVisitor extends SimpleAstVisitor { @override DartType? visitBinaryExpression(BinaryExpression node) { if (node.operator.end <= offset) { - return node.rightOperand.staticParameterElement?.type; + return node.rightOperand.correspondingParameter?.type; } return _visitParent(node); } @@ -742,8 +663,8 @@ class _ContextTypeVisitor extends SimpleAstVisitor { @override DartType? visitConstructorFieldInitializer(ConstructorFieldInitializer node) { if (node.equals.end <= offset) { - var element = node.fieldName.staticElement; - if (element is FieldElement) { + var element = node.fieldName.element; + if (element is FieldElement2) { return element.type; } } @@ -764,7 +685,7 @@ class _ContextTypeVisitor extends SimpleAstVisitor { DartType? visitDefaultFormalParameter(DefaultFormalParameter node) { var separator = node.separator; if (separator != null && separator.end <= offset) { - return node.parameter.declaredElement?.type; + return node.parameter.declaredFragment?.element.type; } return null; } @@ -1073,7 +994,7 @@ parent3: ${node.parent?.parent?.parent} @override DartType? visitPostfixExpression(PostfixExpression node) { - return node.operand.staticParameterElement?.type; + return node.operand.correspondingParameter?.type; } @override @@ -1083,7 +1004,7 @@ parent3: ${node.parent?.parent?.parent} @override DartType? visitPrefixExpression(PrefixExpression node) { - return node.operand.staticParameterElement?.type; + return node.operand.correspondingParameter?.type; } @override @@ -1305,17 +1226,17 @@ parent3: ${node.parent?.parent?.parent} // TODO(brianwilkerson): Replace with `patternTypeSchema` (on AST) where // possible. pattern = pattern.unParenthesized; - Element? element; + Element2? element; if (pattern is AssignedVariablePattern) { - element = pattern.element; + element = pattern.element2; } else if (pattern is DeclaredVariablePattern) { - element = pattern.declaredElement; + element = pattern.declaredElement2; // } else if (pattern is RecordPattern) { // pattern.fields.map((e) => _requiredTypeOfPattern(e.pattern)).toList(); } else if (pattern is ListPattern) { return pattern.requiredType; } - if (element is VariableElement) { + if (element is VariableElement2) { return element.type; } return null; @@ -1337,19 +1258,14 @@ parent3: ${node.parent?.parent?.parent} if (type is! InterfaceType) { return null; } - var declaredElement2 = (field.root as CompilationUnit).declaredElement; - var uri = declaredElement2?.source.uri; - if (uri == null) { - return null; - } + var declaredElement2 = field.element2?.library2; + var uri = declaredElement2?.uri; var manager = InheritanceManager3(); - var member = manager.getMember(type, Name(uri, name)); - if (member is PropertyAccessorElement) { - if (member.isGetter) { - return member.type.returnType; - } - } else if (member is MethodElement) { - return member.type; + var member = manager.getMember3(type, Name(uri, name)); + if (member is GetterElement) { + return member.returnType; + } else if (member is MethodElement2) { + return member.returnType; } return null; } @@ -1421,7 +1337,7 @@ extension on ArgumentList { FunctionType? get functionType { var parent = this.parent; if (parent is InstanceCreationExpression) { - return parent.constructorName.staticElement?.type; + return parent.constructorName.element?.type; } else if (parent is MethodInvocation) { var type = parent.staticInvokeType; if (type is FunctionType) { diff --git a/pkg/analysis_server/lib/src/services/completion/dart/relevance_computer.dart b/pkg/analysis_server/lib/src/services/completion/dart/relevance_computer.dart index af1b2320b53..d6d33225730 100644 --- a/pkg/analysis_server/lib/src/services/completion/dart/relevance_computer.dart +++ b/pkg/analysis_server/lib/src/services/completion/dart/relevance_computer.dart @@ -78,9 +78,9 @@ class RelevanceComputer { element, distance: inheritanceDistance, ); - var hasDeprecated = featureComputer.hasDeprecatedFeature2(element); + var hasDeprecated = featureComputer.hasDeprecatedFeature(element); var isConstant = - preferConstants ? featureComputer.isConstantFeature2(element) : 0.0; + preferConstants ? featureComputer.isConstantFeature(element) : 0.0; var startsWithDollar = featureComputer.startsWithDollarFeature( element.displayName, ); @@ -353,9 +353,9 @@ class RelevanceComputer { elementType, ); var elementKind = _computeElementKind(element); - var hasDeprecated = featureComputer.hasDeprecatedFeature2(element); + var hasDeprecated = featureComputer.hasDeprecatedFeature(element); var isConstant = - preferConstants ? featureComputer.isConstantFeature2(element) : 0.0; + preferConstants ? featureComputer.isConstantFeature(element) : 0.0; return computeScore( contextType: contextType, elementKind: elementKind, @@ -380,9 +380,9 @@ class RelevanceComputer { elementType, ); var elementKind = _computeElementKind2(element); - var hasDeprecated = featureComputer.hasDeprecatedFeature2(element); + var hasDeprecated = featureComputer.hasDeprecatedFeature(element); var isConstant = - preferConstants ? featureComputer.isConstantFeature2(element) : 0.0; + preferConstants ? featureComputer.isConstantFeature(element) : 0.0; return computeScore( contextType: contextType, elementKind: elementKind, @@ -406,9 +406,9 @@ class RelevanceComputer { type, ); var elementKind = _computeElementKind(accessor, distance: distance); - var hasDeprecated = featureComputer.hasDeprecatedFeature2(accessor); + var hasDeprecated = featureComputer.hasDeprecatedFeature(accessor); var isConstant = - preferConstants ? featureComputer.isConstantFeature2(accessor) : 0.0; + preferConstants ? featureComputer.isConstantFeature(accessor) : 0.0; return computeScore( contextType: contextType, elementKind: elementKind, @@ -439,7 +439,7 @@ class RelevanceComputer { /// the completion context. double _computeElementKind(Element2 element, {double? distance}) { var location = completionLocation; - var elementKind = featureComputer.elementKindFeature2( + var elementKind = featureComputer.elementKindFeature( element, location, distance: distance, @@ -461,7 +461,7 @@ class RelevanceComputer { /// the completion context. double _computeElementKind2(Element2 element, {double? distance}) { var location = completionLocation; - var elementKind = featureComputer.elementKindFeature2( + var elementKind = featureComputer.elementKindFeature( element, location, distance: distance, @@ -510,7 +510,7 @@ class RelevanceComputer { ); var elementKind = _computeElementKind(element); var isConstant = - preferConstants ? featureComputer.isConstantFeature2(element) : 0.0; + preferConstants ? featureComputer.isConstantFeature(element) : 0.0; return computeScore( contextType: contextType, elementKind: elementKind, @@ -555,7 +555,7 @@ class RelevanceComputer { distance: localVariableDistance, ); var isConstant = - preferConstants ? featureComputer.isConstantFeature2(element) : 0.0; + preferConstants ? featureComputer.isConstantFeature(element) : 0.0; return computeScore( contextType: contextType, elementKind: elementKind, @@ -578,9 +578,9 @@ class RelevanceComputer { method, distance: inheritanceDistance, ); - var hasDeprecated = featureComputer.hasDeprecatedFeature2(method); + var hasDeprecated = featureComputer.hasDeprecatedFeature(method); var isConstant = - preferConstants ? featureComputer.isConstantFeature2(method) : 0.0; + preferConstants ? featureComputer.isConstantFeature(method) : 0.0; var isNoSuchMethod = featureComputer.isNoSuchMethodFeature( _containingMemberName, method.displayName, @@ -698,7 +698,7 @@ class RelevanceComputer { int _computeTypeParameterRelevance(TypeParameterElement2 parameter) { var elementKind = _computeElementKind(parameter); var isConstant = - preferConstants ? featureComputer.isConstantFeature2(parameter) : 0.0; + preferConstants ? featureComputer.isConstantFeature(parameter) : 0.0; return computeScore(elementKind: elementKind, isConstant: isConstant); } diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart index e5ce51dc15b..bf8309a77ba 100644 --- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart +++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart @@ -296,9 +296,9 @@ class SuggestionBuilder { field, distance: inheritanceDistance, ); - var hasDeprecated = featureComputer.hasDeprecatedFeature2(field); + var hasDeprecated = featureComputer.hasDeprecatedFeature(field); var isConstant = - _preferConstants ? featureComputer.isConstantFeature2(field) : 0.0; + _preferConstants ? featureComputer.isConstantFeature(field) : 0.0; var startsWithDollar = featureComputer.startsWithDollarFeature( field.name3 ?? '', ); @@ -342,7 +342,7 @@ class SuggestionBuilder { var elementKind = _computeElementKind(element); var isConstant = _preferConstants - ? request.featureComputer.isConstantFeature2(element) + ? request.featureComputer.isConstantFeature(element) : 0.0; relevance ??= relevanceComputer.computeScore( contextType: contextType, @@ -420,9 +420,9 @@ class SuggestionBuilder { getter, distance: inheritanceDistance, ); - var hasDeprecated = featureComputer.hasDeprecatedFeature2(getter); + var hasDeprecated = featureComputer.hasDeprecatedFeature(getter); var isConstant = - _preferConstants ? featureComputer.isConstantFeature2(getter) : 0.0; + _preferConstants ? featureComputer.isConstantFeature(getter) : 0.0; var startsWithDollar = featureComputer.startsWithDollarFeature( getter.displayName, ); @@ -606,7 +606,7 @@ class SuggestionBuilder { ); var isConstant = _preferConstants - ? request.featureComputer.isConstantFeature2(element) + ? request.featureComputer.isConstantFeature(element) : 0.0; relevance ??= relevanceComputer.computeScore( contextType: contextType, @@ -645,9 +645,9 @@ class SuggestionBuilder { method, distance: inheritanceDistance, ); - var hasDeprecated = featureComputer.hasDeprecatedFeature2(method); + var hasDeprecated = featureComputer.hasDeprecatedFeature(method); var isConstant = - _preferConstants ? featureComputer.isConstantFeature2(method) : 0.0; + _preferConstants ? featureComputer.isConstantFeature(method) : 0.0; var isNoSuchMethod = featureComputer.isNoSuchMethodFeature( _containingMemberName, method.displayName, @@ -965,9 +965,9 @@ class SuggestionBuilder { setter, distance: inheritanceDistance, ); - var hasDeprecated = featureComputer.hasDeprecatedFeature2(setter); + var hasDeprecated = featureComputer.hasDeprecatedFeature(setter); var isConstant = - _preferConstants ? featureComputer.isConstantFeature2(setter) : 0.0; + _preferConstants ? featureComputer.isConstantFeature(setter) : 0.0; var startsWithDollar = featureComputer.startsWithDollarFeature( setter.displayName, ); @@ -1128,9 +1128,9 @@ class SuggestionBuilder { type, ); var elementKind = _computeElementKind(getter); - var hasDeprecated = featureComputer.hasDeprecatedFeature2(getter); + var hasDeprecated = featureComputer.hasDeprecatedFeature(getter); var isConstant = - _preferConstants ? featureComputer.isConstantFeature2(getter) : 0.0; + _preferConstants ? featureComputer.isConstantFeature(getter) : 0.0; var startsWithDollar = featureComputer.startsWithDollarFeature( getter.displayName, ); @@ -1180,9 +1180,9 @@ class SuggestionBuilder { type, ); var elementKind = _computeElementKind(setter); - var hasDeprecated = featureComputer.hasDeprecatedFeature2(setter); + var hasDeprecated = featureComputer.hasDeprecatedFeature(setter); var isConstant = - _preferConstants ? featureComputer.isConstantFeature2(setter) : 0.0; + _preferConstants ? featureComputer.isConstantFeature(setter) : 0.0; var startsWithDollar = featureComputer.startsWithDollarFeature( setter.displayName, ); @@ -1270,7 +1270,7 @@ class SuggestionBuilder { var elementKind = _computeElementKind(parameter); var isConstant = _preferConstants - ? request.featureComputer.isConstantFeature2(parameter) + ? request.featureComputer.isConstantFeature(parameter) : 0.0; relevance ??= relevanceComputer.computeScore( elementKind: elementKind, @@ -1362,7 +1362,7 @@ class SuggestionBuilder { /// the completion context. double _computeElementKind(Element2 element, {double? distance}) { var location = request.opType.completionLocation; - var elementKind = request.featureComputer.elementKindFeature2( + var elementKind = request.featureComputer.elementKindFeature( element, location, distance: distance, diff --git a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart index 5a537f6b347..331ce255048 100644 --- a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart +++ b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart @@ -1851,7 +1851,7 @@ class RelevanceDataCollector extends RecursiveAstVisitor { } var superclassDepth = getSuperclassDepth(); - var interfaceDepth = featureComputer.inheritanceDistance2( + var interfaceDepth = featureComputer.inheritanceDistance( targetClass, memberClass, ); @@ -2079,12 +2079,12 @@ class RelevanceDataCollector extends RecursiveAstVisitor { int distance; if (parameterType.element3 == typeProvider.futureOrElement2) { var typeArgument = parameterType.typeArguments[0]; - distance = featureComputer.inheritanceDistance2( + distance = featureComputer.inheritanceDistance( argumentType.element3, typeProvider.futureElement2, ); if (typeArgument is InterfaceType) { - var argDistance = featureComputer.inheritanceDistance2( + var argDistance = featureComputer.inheritanceDistance( argumentType.element3, typeArgument.element3, ); @@ -2093,7 +2093,7 @@ class RelevanceDataCollector extends RecursiveAstVisitor { } } } else { - distance = featureComputer.inheritanceDistance2( + distance = featureComputer.inheritanceDistance( argumentType.element3, parameterType.element3, ); diff --git a/pkg/analyzer/lib/dart/element/element2.dart b/pkg/analyzer/lib/dart/element/element2.dart index c8b1fa2224e..f6f53625099 100644 --- a/pkg/analyzer/lib/dart/element/element2.dart +++ b/pkg/analyzer/lib/dart/element/element2.dart @@ -1887,6 +1887,10 @@ abstract class MethodElement2 implements ExecutableElement2 { /// instances to be invoked as if they were a function. static final String CALL_METHOD_NAME = "call"; + /// The name of the method that will be invoked if an attempt is made to + /// invoke an undefined method on an object. + static final String NO_SUCH_METHOD_METHOD_NAME = "noSuchMethod"; + @override MethodElement2 get baseElement;