Elements. Migrate OverrideHelper.

Change-Id: I645d901fd0655c33c0c147c2b08a67b4791e6186
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/394360
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/analyzer_use_new_elements.txt b/pkg/analysis_server/analyzer_use_new_elements.txt
index 69e7efb..c6a47ab 100644
--- a/pkg/analysis_server/analyzer_use_new_elements.txt
+++ b/pkg/analysis_server/analyzer_use_new_elements.txt
@@ -42,7 +42,6 @@
 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
-lib/src/services/completion/dart/override_helper.dart
 lib/src/services/completion/dart/relevance_computer.dart
 lib/src/services/completion/dart/suggestion_builder.dart
 lib/src/services/completion/dart/utilities.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 772776c..f9e14cd 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
@@ -10,8 +10,10 @@
 import 'package:analyzer/dart/ast/ast.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/source/source_range.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
 
 /// Information about a code completion suggestion that might or might not be
 /// sent to the client (that is, one that is a candidate for being sent).
@@ -797,12 +799,12 @@
   /// Initialize a newly created candidate suggestion to suggest the [element]
   /// by inserting the [shouldInvokeSuper].
   OverrideSuggestion({
-    required this.element,
+    required ExecutableElement2 element,
     required this.shouldInvokeSuper,
     required this.skipAt,
     required this.replacementRange,
     required super.matcherScore,
-  });
+  }) : element = element.asElement;
 
   @override
   String get completion =>
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 b6f5f56..e675878 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
@@ -407,11 +407,7 @@
   ) {
     // This method is only visible for the metrics computation and might be made
     // private at some future date.
-    return _inheritanceDistance(
-      subclass.asElement2 as InterfaceElement2?,
-      superclass.asElement2 as InterfaceElement2,
-      {},
-    );
+    return _inheritanceDistance(subclass.asElement2, superclass.asElement2, {});
   }
 
   /// Return the inheritance distance between the [subclass] and the
@@ -437,8 +433,8 @@
     InterfaceElement superclass,
   ) {
     var distance = _inheritanceDistance(
-      subclass.asElement2 as InterfaceElement2,
-      superclass.asElement2 as InterfaceElement2,
+      subclass.asElement2,
+      superclass.asElement2,
       {},
     );
     return distanceToPercent(distance);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart b/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart
index 9116a92..fb1ba09 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart
@@ -29,6 +29,7 @@
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/utilities/extensions/ast.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
 import 'package:analyzer/src/utilities/extensions/flutter.dart';
 
 /// A completion pass that will create candidate suggestions based on the
@@ -3896,7 +3897,7 @@
     }
     if (suggestOverrides && element != null) {
       overrideHelper.computeOverridesFor(
-        interfaceElement: element,
+        interfaceElement: element.asElement2,
         replacementRange: SourceRange(offset, 0),
         skipAt: skipAt,
       );
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/override_helper.dart b/pkg/analysis_server/lib/src/services/completion/dart/override_helper.dart
index 9d9bab1..ec7c675 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/override_helper.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/override_helper.dart
@@ -7,7 +7,7 @@
 import 'package:analysis_server/src/services/completion/dart/candidate_suggestion.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_state.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_collector.dart';
-import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 
@@ -29,14 +29,14 @@
     : inheritanceManager = state.request.inheritanceManager;
 
   void computeOverridesFor({
-    required InterfaceElement interfaceElement,
+    required InterfaceElement2 interfaceElement,
     required SourceRange replacementRange,
     required bool skipAt,
   }) {
-    var interface = inheritanceManager.getInterface(interfaceElement);
-    var interfaceMap = interface.map;
+    var interface = inheritanceManager.getInterface2(interfaceElement);
+    var interfaceMap = interface.map2;
     var namesToOverride = _namesToOverride(
-      interfaceElement.librarySource.uri,
+      interfaceElement.library2.firstFragment.source.uri,
       interface,
     );
 
@@ -73,21 +73,21 @@
   }
 
   /// Checks if the [element] has the `@nonVirtual` annotation.
-  bool _hasNonVirtualAnnotation(ExecutableElement element) {
-    if (element is PropertyAccessorElement && element.isSynthetic) {
-      var variable = element.variable2;
-      if (variable != null && variable.hasNonVirtual) {
+  bool _hasNonVirtualAnnotation(ExecutableElement2 element) {
+    if (element is GetterElement && element.isSynthetic) {
+      var variable = element.variable3;
+      if (variable != null && variable.metadata2.hasNonVirtual) {
         return true;
       }
     }
-    return element.hasNonVirtual;
+    return element.metadata2.hasNonVirtual;
   }
 
   /// Return the list of names that belong to the [interface] of a class, but
   /// are not yet declared in the class.
   List<Name> _namesToOverride(Uri libraryUri, Interface interface) {
     var namesToOverride = <Name>[];
-    for (var name in interface.map.keys) {
+    for (var name in interface.map2.keys) {
       if (name.isAccessibleFor(libraryUri)) {
         // TODO(brianwilkerson): When the user is typing the name of an
         //  inherited member, the map will contain a key matching the current
@@ -95,7 +95,7 @@
         //  declaration consists of a single identifier), and that identifier
         //  matches the name of an overridden member, then the override should
         //  still be suggested.
-        if (!interface.declared.containsKey(name)) {
+        if (!interface.declared2.containsKey(name)) {
           namesToOverride.add(name);
         }
       }
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 7e6c7ea..74c06d8 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -8596,8 +8596,9 @@
 
   @experimental
   @override
-  ExecutableElement2? get element =>
-      staticElement?.asElement2 as ExecutableElement2?;
+  ExecutableElement2? get element {
+    return staticElement?.asElement2;
+  }
 
   @override
   Token get endToken => _argumentList.endToken;
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
index 37fe1f5..8ccd980 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -354,7 +354,7 @@
       forMixinIndex: forMixinIndex,
       forSuper: forSuper,
     );
-    return element?.asElement2 as ExecutableElement2?;
+    return element?.asElement2;
   }
 
   /// Returns the member with the given [name].
@@ -384,7 +384,7 @@
       forMixinIndex: forMixinIndex,
       forSuper: forSuper,
     );
-    return oldElement?.asElement2 as ExecutableElement2?;
+    return oldElement?.asElement2;
   }
 
   /// Returns all members of mixins, superclasses, and interfaces that a member
@@ -401,7 +401,7 @@
     if (elements == null) {
       return null;
     }
-    return elements.map((fragment) => fragment.asExecutableElement2).toList();
+    return elements.map((fragment) => fragment.asElement2).toList();
   }
 
   /// Return all members of mixins, superclasses, and interfaces that a member
@@ -419,9 +419,7 @@
       InterfaceElement2 element, Name name) {
     var interface = getInterface2(element);
     var fragments = interface.overridden[name];
-    return fragments
-        ?.map((fragment) => fragment.asElement2 as ExecutableElement2)
-        .toList();
+    return fragments?.map((fragment) => fragment.asElement2).toList();
   }
 
   /// Remove interfaces for classes defined in specified libraries.
@@ -920,8 +918,7 @@
     var uniqueRedeclared2 = <Name, List<ExecutableElement2>>{};
     for (var entry in redeclared.entries) {
       var name = entry.key;
-      var fragments =
-          entry.value.map((fragment) => fragment.asExecutableElement2);
+      var fragments = entry.value.map((fragment) => fragment.asElement2);
       if (fragments.length == 1) {
         uniqueRedeclared2[name] = fragments.toFixedList();
       } else {
@@ -1284,8 +1281,7 @@
   /// The map of names to their signature in the interface.
   @experimental
   Map<Name, ExecutableElement2> get map2 {
-    return map
-        .map((name, element) => MapEntry(name, element.asExecutableElement2));
+    return map.map((name, element) => MapEntry(name, element.asElement2));
   }
 
   /// Return `true` if the [name] is implemented in the supertype.
@@ -1435,11 +1431,3 @@
         other.name == name;
   }
 }
-
-extension on ExecutableElement {
-  ExecutableElement2 get asExecutableElement2 => switch (this) {
-        ExecutableFragment(:var element) => element,
-        ExecutableMember member => member,
-        _ => throw UnsupportedError('Unsupported type: $runtimeType'),
-      };
-}
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 57edf2c..397244a 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -312,8 +312,7 @@
       .nonNulls
       .toList();
 
-  ExecutableElement2 get _element2 =>
-      declaration.asElement2 as ExecutableElement2;
+  ExecutableElement2 get _element2 => declaration.asElement2;
 
   @override
   void appendTo(ElementDisplayStringBuilder builder) {
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index 27db4a3..73b4f36 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -1091,9 +1091,6 @@
 
 extension on List<ExecutableElement>? {
   List<ExecutableElement2> get asElement2 {
-    return this
-            ?.map((element) => element.asElement2 as ExecutableElement2)
-            .toList() ??
-        const [];
+    return this?.map((element) => element.asElement2).toList() ?? const [];
   }
 }
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart
index 821366d..4ed918e 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/element.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -168,6 +168,22 @@
   }
 }
 
+extension ExecutableElement2Extension on ExecutableElement2 {
+  ExecutableElement get asElement {
+    return firstFragment as ExecutableElement;
+  }
+}
+
+extension ExecutableElementExtension on ExecutableElement {
+  ExecutableElement2 get asElement2 {
+    return switch (this) {
+      ExecutableFragment(:var element) => element,
+      ExecutableMember member => member,
+      _ => throw UnsupportedError('Unsupported type: $runtimeType'),
+    };
+  }
+}
+
 extension FormalParameterExtension on FormalParameterElement {
   void appendToWithoutDelimiters(
     StringBuffer buffer, {
@@ -189,6 +205,12 @@
   }
 }
 
+extension InterfaceElementExtension on InterfaceElement {
+  InterfaceElement2 get asElement2 {
+    return (this as InterfaceElementImpl).element;
+  }
+}
+
 extension LibraryFragmentExtension on LibraryFragment {
   /// Returns a list containing this library fragment and all of its enclosing
   /// fragments.