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 [];
-  }
-}