Elements. Migrate src/error/inheritance_override.dart Change-Id: I8080c6dd961ad92c983c3b53cd048bbbe31f822b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/416020 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Reviewed-by: Phil Quitslund <pquitslund@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart index 9b9e2d5..53f82e3 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart
@@ -42,7 +42,7 @@ return; } var signatures = [ - ...InheritanceOverrideVerifier.missingOverrides2(targetDeclaration), + ...InheritanceOverrideVerifier.missingOverrides(targetDeclaration), ...InheritanceOverrideVerifier.missingMustBeOverridden(targetDeclaration), ]; // Sort by name, getters before setters.
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart index cee871f..8897d53 100644 --- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart +++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -185,7 +185,7 @@ ExecutableElement2OrMember? getInherited4( InterfaceElement2 element, Name name) { element as InterfaceElementImpl2; // TODO(scheglov): remove cast - var oldElement = getInheritedMap2(element.asElement)[name]; + var oldElement = getInherited2(element.asElement, name); return oldElement?.asElement2; } @@ -757,8 +757,7 @@ return MapEntry(key, result); }); - var implemented2 = implemented.map<Name, ExecutableElement2>( - (key, value) => MapEntry(key, value.asElement2)); + var implemented2 = implemented.mapValue((value) => value.asElement2); var namedCandidates2 = namedCandidates.map<Name, List<ExecutableElement2>>( (key, value) => MapEntry(key, value.map((e) => e.asElement2).toList())); @@ -968,8 +967,7 @@ } } - var implemented2 = implemented.map<Name, ExecutableElement2>( - (key, value) => MapEntry(key, value.asElement2)); + var implemented2 = implemented.mapValue((value) => value.asElement2); return Interface._( map: implemented, @@ -1033,15 +1031,13 @@ var implemented = <Name, ExecutableElementOrMember>{}; _addImplemented(implemented, fragment, element); - var implemented2 = implemented.map<Name, ExecutableElement2>( - (key, value) => MapEntry(key, value.asElement2)); + var implemented2 = implemented.mapValue((value) => value.asElement2); var interfaceCandidates2 = interfaceCandidates.map<Name, List<ExecutableElement2>>((key, value) => MapEntry(key, value.map((e) => e.asElement2).toList())); - var superInterface2 = superInterface.map<Name, ExecutableElement2>( - (key, value) => MapEntry(key, value.asElement2)); + var superInterface2 = superInterface.mapValue((value) => value.asElement2); return Interface._( map: interface, @@ -1295,7 +1291,7 @@ final Map<Name, ExecutableElementOrMember> implemented; /// The map of names to their concrete implementations. - final Map<Name, ExecutableElement2> implemented2; + final Map<Name, ExecutableElement2OrMember> implemented2; /// The set of names that are `noSuchMethod` forwarders in [implemented]. final Set<Name> noSuchMethodForwarders;
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart index c065651..0b92cf2 100644 --- a/pkg/analyzer/lib/src/error/inheritance_override.dart +++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -2,12 +2,9 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -// ignore_for_file: analyzer_use_new_elements - import 'package:analyzer/dart/analysis/features.dart'; import 'package:analyzer/dart/ast/syntactic_entity.dart'; import 'package:analyzer/dart/ast/token.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'; @@ -26,7 +23,7 @@ import 'package:analyzer/src/utilities/extensions/element.dart'; final _missingMustBeOverridden = Expando<List<ExecutableElement2>>(); -final _missingOverrides = Expando<List<ExecutableElement>>(); +final _missingOverrides = Expando<List<ExecutableElement2OrMember>>(); class InheritanceOverrideVerifier { final TypeSystemImpl _typeSystem; @@ -133,25 +130,18 @@ } } - /// Returns [Element] members that are in the interface of the + /// Returns [ExecutableElement2] members that are in the interface of the /// given class with `@mustBeOverridden`, but don't have implementations. static List<ExecutableElement2> missingMustBeOverridden( NamedCompilationUnitMember node) { return _missingMustBeOverridden[node.name] ?? const []; } - /// Returns [ExecutableElement] members that are in the interface of the - /// given class, but don't have concrete implementations. - static List<ExecutableElement> missingOverrides( - NamedCompilationUnitMember node) { - return _missingOverrides[node.name] ?? const []; - } - /// Returns [ExecutableElement2] members that are in the interface of the /// given class, but don't have concrete implementations. - static List<ExecutableElement2> missingOverrides2( + static List<ExecutableElement2> missingOverrides( NamedCompilationUnitMember node) { - return _missingOverrides[node.name].asElement2; + return _missingOverrides[node.name] ?? const []; } } @@ -263,7 +253,7 @@ field.name, libraryUri, fieldElement.getter?.asElement2); _checkDeclaredMember( field.name, libraryUri, fieldElement.setter?.asElement2); - if (!member.isStatic && firstFragment is! EnumElement) { + if (!member.isStatic && firstFragment is! EnumElementImpl) { _checkIllegalEnumValuesDeclaration(field.name); } if (!member.isStatic) { @@ -282,7 +272,7 @@ if (!(member.isStatic || member.isAbstract || member.isSetter)) { _checkIllegalConcreteEnumMemberDeclaration(member.name); } - if (!member.isStatic && firstFragment is! EnumElement) { + if (!member.isStatic && firstFragment is! EnumElementImpl) { _checkIllegalEnumValuesDeclaration(member.name); } } @@ -298,26 +288,26 @@ if (firstFragment is ClassElementImpl && !firstFragment.isAbstract || firstFragment is EnumElementImpl) { - List<ExecutableElement>? inheritedAbstract; + List<ExecutableElement2OrMember>? inheritedAbstract; for (var name in interface.map.keys) { if (!name.isAccessibleFor(libraryUri)) { continue; } - var interfaceElement = interface.map[name]!; - var concreteElement = interface.implemented[name]; + var interfaceElement = interface.map[name]!.asElement2; + var concreteElement = interface.implemented2[name]; // No concrete implementation of the name. if (concreteElement == null) { if (_reportConcreteClassWithAbstractMember(name.name)) { continue; } - if (_isNotImplementedInConcreteSuperClass(firstFragment, name)) { + if (_isNotImplementedInConcreteSuperClass(name)) { continue; } // We already reported ILLEGAL_ENUM_VALUES_INHERITANCE. - if (firstFragment is EnumElement && + if (firstFragment is EnumElementImpl && const {'values', 'values='}.contains(name.name)) { continue; } @@ -348,13 +338,12 @@ // overriding method. The classNameNode is always wrong. CorrectOverrideHelper( typeSystem: typeSystem, - thisMember: concreteElement.asElement2, + thisMember: concreteElement, ).verify( - superMember: interfaceElement.asElement2, + superMember: interfaceElement, errorReporter: reporter, errorNode: classNameToken, - errorCode: concreteElement is PropertyAccessorElementOrMember && - concreteElement.isSetter + errorCode: concreteElement is SetterElement2OrMember ? CompileTimeErrorCode.INVALID_IMPLEMENTATION_OVERRIDE_SETTER : CompileTimeErrorCode.INVALID_IMPLEMENTATION_OVERRIDE, ); @@ -541,7 +530,7 @@ )) { hasError = true; } - if (classElement is EnumElement && _checkMixinOfEnum(namedType)) { + if (classElement is EnumElementImpl && _checkMixinOfEnum(namedType)) { hasError = true; } } @@ -558,7 +547,7 @@ /// [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_IMPLEMENTS], /// [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_ON], /// [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_WITH]. - bool _checkForRecursiveInterfaceInheritance(InterfaceElement2 element, + bool _checkForRecursiveInterfaceInheritance(InterfaceElementImpl2 element, [List<InterfaceElement2>? path]) { path ??= <InterfaceElement2>[]; @@ -616,7 +605,7 @@ } } - if (element is MixinElement2) { + if (element is MixinElementImpl2) { for (var type in element.superclassConstraints) { if (_checkForRecursiveInterfaceInheritance(type.element3, path)) { return true; @@ -656,7 +645,7 @@ // We ignore mixins because they don't inherit and members. // But to support `super.foo()` invocations we put members from superclass // constraints into the `superImplemented` bucket, the same we look below. - if (classElement is MixinElement) { + if (classElement is MixinElementImpl) { return; } @@ -665,17 +654,19 @@ void checkSingle( String memberName, - bool Function(ClassElement enclosingClass) filter, + bool Function(ClassElement2 enclosingClass) filter, ) { var member = concreteMap[Name(libraryUri, memberName)]; if (member != null) { - var enclosingClass = member.enclosingElement3 as InterfaceElement; - if (enclosingClass is! ClassElement || filter(enclosingClass)) { - reporter.atToken( - classNameToken, - CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE, - arguments: [memberName, enclosingClass.name], - ); + var enclosingClass = member.asElement2.enclosingElement2; + if (enclosingClass != null) { + if (enclosingClass is! ClassElement2 || filter(enclosingClass)) { + reporter.atToken( + classNameToken, + CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE, + arguments: [memberName, enclosingClass.name3!], + ); + } } } } @@ -697,12 +688,12 @@ void _checkIllegalEnumValuesInheritance() { if (implementsDartCoreEnum) { - var getter = inheritance.getInherited2( - classElement, + var getter = inheritance.getInherited4( + classElement.asElement2, Name(libraryUri, 'values'), ); - var setter = inheritance.getInherited2( - classElement, + var setter = inheritance.getInherited4( + classElement.asElement2, Name(libraryUri, 'values='), ); var inherited = getter ?? setter; @@ -710,7 +701,7 @@ reporter.atToken( classNameToken, CompileTimeErrorCode.ILLEGAL_ENUM_VALUES_INHERITANCE, - arguments: [inherited.enclosingElement3.name!], + arguments: [inherited.enclosingElement2!.name3!], ); } } @@ -742,20 +733,20 @@ /// Return the error code that should be used when the given class [element] /// references itself directly. ErrorCode _getRecursiveErrorCode(InterfaceElement2 element) { - if (element.supertype?.element3.asElement == classElement) { + if (element.supertype?.element3 == classElement.asElement2) { return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_EXTENDS; } if (element is MixinElement2) { for (var type in element.superclassConstraints) { - if (type.element3.asElement == classElement) { + if (type.element3 == classElement.asElement2) { return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_ON; } } } for (var type in element.mixins) { - if (type.element3.asElement == classElement) { + if (type.element3 == classElement.asElement2) { return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_WITH; } } @@ -764,9 +755,8 @@ } /// If [name] is not implemented in the extended concrete class, the - /// issue should be fixed there, and then [element] will not have it too. + /// issue should be fixed there, and then [classElement] will not have it too. bool _isNotImplementedInConcreteSuperClass( - InterfaceElement element, Name name, ) { var superElement = classElement.supertype?.element3; @@ -787,7 +777,7 @@ if (memberName == name) { reporter.atNode( member, - classElement is EnumElement + classElement.asElement2 is EnumElement2 ? CompileTimeErrorCode.ENUM_WITH_ABSTRACT_MEMBER : CompileTimeErrorCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, arguments: [displayName, classElement.name], @@ -832,13 +822,13 @@ CompileTimeErrorCode.INCONSISTENT_INHERITANCE_GETTER_AND_METHOD, arguments: [ name.name, - conflict.getter.enclosingElement3.name!, - conflict.method.enclosingElement3.name! + conflict.getter2.enclosingElement2!.name3!, + conflict.method2.enclosingElement2!.name3! ], ); } else if (conflict is CandidatesConflict) { - var candidatesStr = conflict.candidates.map((candidate) { - var className = candidate.enclosingElement3.name; + var candidatesStr = conflict.candidates2.map((candidate) { + var className = candidate.enclosingElement2!.name3; var typeStr = candidate.type.getDisplayString(); return '$className.${name.name} ($typeStr)'; }).join(', '); @@ -853,7 +843,8 @@ } } - void _reportInheritedAbstractMembers(List<ExecutableElement>? elements) { + void _reportInheritedAbstractMembers( + List<ExecutableElement2OrMember>? elements) { if (elements == null) { return; } @@ -862,18 +853,15 @@ var descriptions = <String>[]; for (var element in elements) { - var prefix = ''; - if (element is PropertyAccessorElement) { - if (element.isGetter) { - prefix = 'getter '; - } else { - prefix = 'setter '; - } - } + var prefix = switch (element) { + GetterElement() => 'getter ', + SetterElement() => 'setter ', + _ => '', + }; var elementName = element.displayName; - var enclosingElement = element.enclosingElement3; - var enclosingName = enclosingElement.displayName; + var enclosingElement = element.enclosingElement2!; + var enclosingName = enclosingElement.displayString2(); var description = "$prefix$enclosingName.$elementName"; descriptions.add(description); @@ -957,7 +945,7 @@ } var noSuchMethodDeclaration = - classElement.getMethod2(FunctionElement.NO_SUCH_METHOD_METHOD_NAME); + classElement.getMethod2(MethodElement2.NO_SUCH_METHOD_METHOD_NAME); if (noSuchMethodDeclaration != null && !noSuchMethodDeclaration.isAbstract) { return; @@ -1055,9 +1043,3 @@ } } } - -extension on List<ExecutableElement>? { - List<ExecutableElement2> get asElement2 { - return this?.map((element) => element.asElement2).toList() ?? const []; - } -}