Elements. Deprecate InterfaceTypeImpl.element

Change-Id: Iff7d90a8d614a6069ec7f13810c8bd6600cfcc1f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/418919
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/api.txt b/pkg/analyzer/api.txt
index b358b26..d1ae6d3 100644
--- a/pkg/analyzer/api.txt
+++ b/pkg/analyzer/api.txt
@@ -3080,7 +3080,7 @@
     new (constructor: DirectiveUri Function())
   DirectiveUriWithLibrary (class extends DirectiveUriWithSource):
     new (constructor: DirectiveUriWithLibrary Function())
-    library (getter: LibraryElement)
+    library (getter: LibraryElement, deprecated)
     library2 (getter: LibraryElement2)
   DirectiveUriWithRelativeUri (class extends DirectiveUriWithRelativeUriString):
     new (constructor: DirectiveUriWithRelativeUri Function())
@@ -3097,7 +3097,7 @@
     unit (getter: CompilationUnitElement, deprecated)
   Element (class extends Object implements AnalysisTarget):
     new (constructor: Element Function())
-    children (getter: List<Element>)
+    children (getter: List<Element>, deprecated)
     context (getter: AnalysisContext@2)
     declaration (getter: Element?)
     displayName (getter: String)
@@ -3135,7 +3135,7 @@
     isPublic (getter: bool)
     isSynthetic (getter: bool)
     kind (getter: ElementKind)
-    library (getter: LibraryElement?)
+    library (getter: LibraryElement?, deprecated)
     location (getter: ElementLocation?)
     metadata (getter: List<ElementAnnotation>)
     name (getter: String?)
@@ -3148,7 +3148,7 @@
     accept (method: T? Function<T>(ElementVisitor<T>), deprecated)
     getDisplayString (method: String Function({bool multiline, bool withNullability}))
     getExtendedDisplayName (method: String Function(String?))
-    isAccessibleIn (method: bool Function(LibraryElement))
+    isAccessibleIn (method: bool Function(LibraryElement), deprecated)
     thisOrAncestorMatching (method: E? Function<E extends Element>(bool Function(Element)), deprecated)
     thisOrAncestorMatching3 (method: E? Function<E extends Element>(bool Function(Element)), deprecated)
     thisOrAncestorOfType (method: E? Function<E extends Element>(), deprecated)
@@ -3369,7 +3369,7 @@
     new (constructor: LabelElement Function())
     enclosingElement3 (getter: ExecutableElement, deprecated)
     name (getter: String)
-  LibraryElement (class extends Object implements _ExistingElement):
+  LibraryElement (class extends Object implements _ExistingElement, deprecated):
     new (constructor: LibraryElement Function())
     definingCompilationUnit (getter: CompilationUnitElement, deprecated)
     enclosingElement3 (getter: Null)
@@ -3520,7 +3520,7 @@
     new (constructor: TypeParameterizedElement Function())
     isSimplyBounded (getter: bool)
     typeParameters (getter: List<TypeParameterElement>, deprecated)
-  UndefinedElement (class extends Object implements Element):
+  UndefinedElement (class extends Object implements Element, deprecated):
     new (constructor: UndefinedElement Function())
   UriReferencedElement (class extends Object implements _ExistingElement):
     new (constructor: UriReferencedElement Function())
@@ -3541,7 +3541,7 @@
   _ExistingElement (class extends Object implements Element):
     new (constructor: _ExistingElement Function())
     declaration (getter: Element)
-    library (getter: LibraryElement)
+    library (getter: LibraryElement, deprecated)
     librarySource (getter: Source)
     source (getter: Source)
 package:analyzer/dart/element/element2.dart:
@@ -5260,7 +5260,7 @@
     new (constructor: ConstantEvaluationTarget Function())
     context (getter: AnalysisContext@2)
     isConstantEvaluated (getter: bool)
-    library (getter: LibraryElement?)
+    library (getter: LibraryElement?, deprecated)
     library2 (getter: LibraryElement2?)
 package:analyzer/src/dart/resolver/scope.dart:
   Namespace (class extends Object):
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index b36de84..dd1bbd6 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -22,6 +22,7 @@
 /// children of the element representing the class.
 ///
 /// Every complete element structure is rooted by an instance of the class
+// ignore:deprecated_member_use_from_same_package
 /// [LibraryElement]. A library element represents a single Dart library. Every
 /// library is defined by one or more compilation units (the library and all of
 /// its parts). The compilation units are represented by the class
@@ -338,11 +339,12 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class DirectiveUri {}
 
-/// [DirectiveUriWithSource] that references a [LibraryElement].
+/// [DirectiveUriWithSource] that references a [LibraryElement2].
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class DirectiveUriWithLibrary extends DirectiveUriWithSource {
   /// The library referenced by the [source].
+  @Deprecated('Use library2 instead')
   LibraryElement get library;
 
   /// The library referenced by the [source].
@@ -414,6 +416,7 @@
   /// A list of this element's children.
   ///
   /// There is no guarantee of the order in which the children will be included.
+  @Deprecated('Use Element2 instead')
   List<Element> get children;
 
   /// The analysis context in which this element is defined.
@@ -566,6 +569,7 @@
   /// This will be the element itself if it is a library element. This will be
   /// `null` if this element is [MultiplyDefinedElement2] that is not contained
   /// in a library.
+  @Deprecated('Use Element2 instead')
   LibraryElement? get library;
 
   /// The location of this element in the element model.
@@ -668,6 +672,7 @@
   /// A declaration <i>m</i> is accessible to a library <i>L</i> if <i>m</i> is
   /// declared in <i>L</i> or if <i>m</i> is public.
   /// </blockquote>
+  @Deprecated('Use Element2 instead')
   bool isAccessibleIn(LibraryElement library);
 
   /// Returns either this element or the most immediate ancestor of this element
@@ -1648,6 +1653,7 @@
 /// A library.
 ///
 /// Clients may not extend, implement or mix-in this class.
+@Deprecated('Use LibraryElement2 instead')
 abstract class LibraryElement implements _ExistingElement {
   /// The compilation unit that defines this library.
   @Deprecated(elementModelDeprecationMsg)
@@ -2304,6 +2310,7 @@
 /// elements do not make sense and will return useless results.
 ///
 /// Clients may not extend, implement or mix-in this class.
+@Deprecated('Not used anymore')
 abstract class UndefinedElement implements Element {}
 
 /// An element included into a library using some URI.
@@ -2382,6 +2389,7 @@
   @override
   Element get declaration;
 
+  @Deprecated('Use Element2 instead')
   @override
   LibraryElement get library;
 
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index e442855..5a3cf7b 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -2,8 +2,6 @@
 // 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 'dart:collection';
 
 import 'package:_fe_analyzer_shared/src/base/analyzer_public_api.dart';
@@ -535,6 +533,7 @@
   bool get isConstantEvaluated;
 
   /// The library with this constant.
+  @Deprecated('Use library2 instead')
   LibraryElement? get library;
 
   /// The library with this constant.
@@ -3171,7 +3170,7 @@
     var superclass = definingType.superclass;
     if (superclass != null && !superclass.isDartCoreObject) {
       var superConstructor = superclass
-          .lookUpConstructor2(superName, _constructor.library.asElement2)
+          .lookUpConstructor2(superName, _constructor.library)
           ?.asElement;
       if (superConstructor == null) {
         return null;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 2fb2110..f40a949 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -188,34 +188,7 @@
 
   @override
   bool get hasNonFinalField {
-    var classesToVisit = <InterfaceElementImpl>[];
-    var visitedClasses = <InterfaceElementImpl>{};
-    classesToVisit.add(this);
-    while (classesToVisit.isNotEmpty) {
-      var currentElement = classesToVisit.removeAt(0);
-      if (visitedClasses.add(currentElement)) {
-        // check fields
-        for (var field in currentElement.fields) {
-          if (!field.isFinal &&
-              !field.isConst &&
-              !field.isStatic &&
-              !field.isSynthetic) {
-            return true;
-          }
-        }
-        // check mixins
-        for (var mixinType in currentElement.mixins) {
-          classesToVisit.add(mixinType.element);
-        }
-        // check super
-        var supertype = currentElement.supertype;
-        if (supertype != null) {
-          classesToVisit.add(supertype.element);
-        }
-      }
-    }
-    // not found
-    return false;
+    return element.hasNonFinalField;
   }
 
   @override
@@ -249,42 +222,6 @@
     return name == 'Record' && library.isDartCore;
   }
 
-  bool get isEnumLike {
-    // Must be a concrete class.
-    if (isAbstract) {
-      return false;
-    }
-
-    // With only private non-factory constructors.
-    for (var constructor in constructors) {
-      if (constructor.isPublic || constructor.isFactory) {
-        return false;
-      }
-    }
-
-    // With 2+ static const fields with the type of this class.
-    var numberOfElements = 0;
-    for (var field in fields) {
-      if (field.isStatic && field.isConst && field.type == thisType) {
-        numberOfElements++;
-      }
-    }
-    if (numberOfElements < 2) {
-      return false;
-    }
-
-    // No subclasses in the library.
-    for (var unit in library.units) {
-      for (var class_ in unit.classes) {
-        if (class_.supertype?.element == this) {
-          return false;
-        }
-      }
-    }
-
-    return true;
-  }
-
   @override
   bool get isExhaustive => isSealed;
 
@@ -378,6 +315,7 @@
     builder.writeClassElement(this);
   }
 
+  @Deprecated('Use ClassElement2 instead')
   @override
   bool isExtendableIn(LibraryElement library) {
     if (library == this.library) {
@@ -386,6 +324,7 @@
     return !isInterface && !isFinal && !isSealed;
   }
 
+  @Deprecated('Use ClassElement2 instead')
   @override
   bool isImplementableIn(LibraryElement library) {
     if (library == this.library) {
@@ -394,6 +333,7 @@
     return !isBase && !isFinal && !isSealed;
   }
 
+  @Deprecated('Use ClassElement2 instead')
   @override
   bool isMixableIn(LibraryElement library) {
     if (library == this.library) {
@@ -424,10 +364,11 @@
     // Assign to break a possible infinite recursion during computing.
     _constructors = const <ConstructorElementImpl>[];
 
-    var superElement = superType.element as ClassElementImpl;
+    var superElement2 = superType.element3 as ClassElementImpl2;
+    var superElement = superElement2.firstFragment;
 
     var constructorsToForward = superElement.constructors
-        .where((constructor) => constructor.isAccessibleIn(library))
+        .where((constructor) => constructor.asElement2.isAccessibleIn2(library))
         .where((constructor) => !constructor.isFactory);
 
     // Figure out the type parameter substitution we need to perform in order
@@ -447,7 +388,7 @@
         Substitution.fromPairs(superClassParameters, argumentTypes);
 
     bool typeHasInstanceVariables(InterfaceTypeImpl type) =>
-        type.element.fields.any((e) => !e.isSynthetic);
+        type.element3.fields2.any((e) => !e.isSynthetic);
 
     // Now create an implicit constructor for every constructor found above,
     // substituting type parameters as appropriate.
@@ -620,7 +561,37 @@
   }
 
   @override
-  bool get hasNonFinalField => firstFragment.hasNonFinalField;
+  @override
+  bool get hasNonFinalField {
+    var classesToVisit = <InterfaceElementImpl2>[];
+    var visitedClasses = <InterfaceElementImpl2>{};
+    classesToVisit.add(this);
+    while (classesToVisit.isNotEmpty) {
+      var currentElement = classesToVisit.removeAt(0);
+      if (visitedClasses.add(currentElement)) {
+        // check fields
+        for (var field in currentElement.fields2) {
+          if (!field.isFinal &&
+              !field.isConst &&
+              !field.isStatic &&
+              !field.isSynthetic) {
+            return true;
+          }
+        }
+        // check mixins
+        for (var mixinType in currentElement.mixins) {
+          classesToVisit.add(mixinType.element3);
+        }
+        // check super
+        var supertype = currentElement.supertype;
+        if (supertype != null) {
+          classesToVisit.add(supertype.element3);
+        }
+      }
+    }
+    // not found
+    return false;
+  }
 
   @override
   bool get isAbstract => firstFragment.isAbstract;
@@ -702,16 +673,30 @@
   }
 
   @override
-  bool isExtendableIn2(LibraryElement2 library) =>
-      firstFragment.isExtendableIn(library as LibraryElement);
+  bool isExtendableIn2(LibraryElement2 library) {
+    if (library == library2) {
+      return true;
+    }
+    return !isInterface && !isFinal && !isSealed;
+  }
 
   @override
-  bool isImplementableIn2(LibraryElement2 library) =>
-      firstFragment.isImplementableIn(library as LibraryElement);
+  bool isImplementableIn2(LibraryElement2 library) {
+    if (library == library2) {
+      return true;
+    }
+    return !isBase && !isFinal && !isSealed;
+  }
 
   @override
-  bool isMixableIn2(LibraryElement2 library) =>
-      firstFragment.isMixableIn(library as LibraryElement);
+  bool isMixableIn2(LibraryElement2 library) {
+    if (library == library2) {
+      return true;
+    } else if (library2.featureSet.isEnabled(Feature.class_modifiers)) {
+      return isMixinClass && !isInterface && !isFinal && !isSealed;
+    }
+    return true;
+  }
 }
 
 abstract class ClassOrMixinElementImpl extends InterfaceElementImpl {
@@ -829,6 +814,7 @@
     _accessors = accessors;
   }
 
+  @Deprecated('Use Element2 instead')
   @override
   List<Element> get children => [
         ...super.children,
@@ -846,7 +832,19 @@
       ];
 
   @override
-  List<Fragment> get children3 => children.whereType<Fragment>().toList();
+  List<Fragment> get children3 {
+    return [
+      ...accessors,
+      ...classes,
+      ...enums,
+      ...extensions,
+      ...extensionTypes,
+      ...functions,
+      ...mixins,
+      ...typeAliases,
+      ...topLevelVariables,
+    ];
+  }
 
   @override
   List<ClassElementImpl> get classes {
@@ -2596,6 +2594,7 @@
     reference?.element = this;
   }
 
+  @Deprecated('Use Element2 instead')
   @override
   List<Element> get children => const [];
 
@@ -3117,6 +3116,7 @@
   /// Return `true` if this element has the given [modifier] associated with it.
   bool hasModifier(Modifier modifier) => _modifiers[modifier];
 
+  @Deprecated('Use Element2 instead')
   @override
   bool isAccessibleIn(LibraryElement library) {
     if (Identifier.isPrivateName(name!)) {
@@ -3631,6 +3631,7 @@
   /// [offset].
   ExecutableElementImpl(String super.name, super.offset, {super.reference});
 
+  @Deprecated('Use Element2 instead')
   @override
   List<Element> get children => [
         ...super.children,
@@ -3639,6 +3640,12 @@
       ];
 
   @override
+  List<Fragment> get children3 => [
+        ...typeParameters,
+        ...parameters,
+      ];
+
+  @override
   ExecutableElementImpl get declaration => this;
 
   @override
@@ -3878,6 +3885,7 @@
   /// element.
   ExtensionElementImpl(super.name, super.nameOffset);
 
+  @Deprecated('Use Element2 instead')
   @override
   List<Element> get children => [
         ...super.children,
@@ -3888,6 +3896,14 @@
       ];
 
   @override
+  List<Fragment> get children3 => [
+        ...accessors,
+        ...fields,
+        ...methods,
+        ...typeParameters,
+      ];
+
+  @override
   String get displayName => name ?? '';
 
   @override
@@ -5241,6 +5257,7 @@
   GenericFunctionTypeElementImpl.forOffset(int nameOffset)
       : super("", nameOffset);
 
+  @Deprecated('Use Element2 instead')
   @override
   List<Element> get children => [
         ...super.children,
@@ -5249,6 +5266,12 @@
       ];
 
   @override
+  List<Fragment> get children3 => [
+        ...typeParameters,
+        ...parameters,
+      ];
+
+  @override
   GenericFunctionTypeElementImpl2 get element => _element2;
 
   @override
@@ -5811,8 +5834,13 @@
   }
 
   @override
-  bool isAccessibleIn2(LibraryElement2 library) =>
-      firstFragment.isAccessibleIn(library as LibraryElement);
+  bool isAccessibleIn2(LibraryElement2 library) {
+    var name = name3;
+    if (name != null && Identifier.isPrivateName(name)) {
+      return library == library2;
+    }
+    return true;
+  }
 
   @override
   GetterElement? lookUpGetter2({
@@ -5986,6 +6014,7 @@
         library.session.classHierarchy.implementedInterfaces(element);
   }
 
+  @Deprecated('Use Element2 instead')
   @override
   List<Element> get children => [
         ...super.children,
@@ -5997,6 +6026,15 @@
       ];
 
   @override
+  List<Fragment> get children3 => [
+        ...accessors,
+        ...fields,
+        ...constructors,
+        ...methods,
+        ...typeParameters,
+      ];
+
+  @override
   List<ConstructorElementImpl> get constructors {
     if (!identical(_constructors, _Sentinel.constructorElement)) {
       return _constructors;
@@ -6931,10 +6969,14 @@
   void visitChildren2<T>(ElementVisitor2<T> visitor) {}
 }
 
-/// A concrete implementation of a [LibraryElement] or [LibraryElement2].
+/// A concrete implementation of [LibraryElement2].
 class LibraryElementImpl extends ElementImpl
-    with _HasLibraryMixin
-    implements LibraryElement, LibraryElement2 {
+    with
+        _HasLibraryMixin
+    implements
+        // ignore:deprecated_member_use_from_same_package
+        LibraryElement,
+        LibraryElement2 {
   /// The analysis context in which this library is defined.
   @override
   final AnalysisContext context;
@@ -7031,6 +7073,7 @@
   @override
   LibraryElementImpl get baseElement => this;
 
+  @Deprecated('Use Element2 instead')
   @override
   List<Element> get children => [
         definingCompilationUnit,
@@ -8561,6 +8604,7 @@
     builder.writeMixinElement(this);
   }
 
+  @Deprecated('Use MixinElement2 instead')
   @override
   bool isImplementableIn(LibraryElement library) {
     if (library == this.library) {
@@ -8609,8 +8653,12 @@
   }
 
   @override
-  bool isImplementableIn2(LibraryElement2 library) =>
-      firstFragment.isImplementableIn(library as LibraryElement);
+  bool isImplementableIn2(LibraryElement2 library) {
+    if (library == library2) {
+      return true;
+    }
+    return !isBase;
+  }
 }
 
 /// The constants for all of the modifiers defined by the Dart language and for
@@ -8737,10 +8785,8 @@
   SYNTHETIC
 }
 
-class MultiplyDefinedElementImpl
-    implements
-        // ignore:deprecated_member_use_from_same_package
-        MultiplyDefinedElement {
+@Deprecated('Use MultiplyDefinedElement2 instead')
+class MultiplyDefinedElementImpl implements MultiplyDefinedElement {
   /// The unique integer identifier of this element.
   @override
   final int id = ElementImpl._NEXT_ID++;
@@ -8762,6 +8808,7 @@
     this.conflictingElements,
   );
 
+  @Deprecated('Use Element2 instead')
   @override
   List<Element> get children => const [];
 
@@ -9024,14 +9071,6 @@
     this.conflictingElements2,
   );
 
-  MultiplyDefinedElementImpl get asElement {
-    return MultiplyDefinedElementImpl(
-      libraryFragment,
-      name3,
-      conflictingElements2.map((e) => e.asElement).nonNulls.toList(),
-    );
-  }
-
   @override
   MultiplyDefinedElementImpl2 get baseElement => this;
 
@@ -9387,6 +9426,7 @@
     return element;
   }
 
+  @Deprecated('Use Element2 instead')
   @override
   List<Element> get children => parameters;
 
@@ -11088,6 +11128,9 @@
   TypeImpl? get aliasedTypeRaw => _aliasedType;
 
   @override
+  List<Fragment> get children3 => const [];
+
+  @override
   String get displayName => name;
 
   @override
@@ -11241,15 +11284,15 @@
       return false;
     }
     var typeParameters = typeParameters2;
-    var aliasedClass = aliasedType_.element;
+    var aliasedClass = aliasedType_.element3;
     var typeArguments = aliasedType_.typeArguments;
     var typeParameterCount = typeParameters.length;
-    if (typeParameterCount != aliasedClass.typeParameters.length) {
+    if (typeParameterCount != aliasedClass.typeParameters2.length) {
       return false;
     }
     for (var i = 0; i < typeParameterCount; i++) {
       var bound = typeParameters[i].bound ?? DynamicTypeImpl.instance;
-      var aliasedBound = aliasedClass.typeParameters[i].bound ??
+      var aliasedBound = aliasedClass.typeParameters2[i].bound ??
           library2.typeProvider.dynamicType;
       if (!library2.typeSystem.isSubtypeOf(bound, aliasedBound) ||
           !library2.typeSystem.isSubtypeOf(aliasedBound, bound)) {
@@ -11679,9 +11722,6 @@
   List<TypeParameterElementImpl> _typeParameters = const [];
 
   @override
-  List<Fragment> get children3 => children.whereType<Fragment>().toList();
-
-  @override
   bool get isSimplyBounded => true;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index a1af92d..cde8354 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -228,12 +228,17 @@
     required this.typeParameters,
   });
 
+  @Deprecated('Use Element2 instead')
   @override
   List<Element> get children => parameters;
 
   @override
-  List<Element2> get children2 =>
-      children.map((fragment) => fragment.asElement2).nonNulls.toList();
+  List<Element2> get children2 {
+    return [
+      ...typeParameters2,
+      ...formalParameters,
+    ];
+  }
 
   @override
   ExecutableElementImpl get declaration =>
@@ -292,6 +297,7 @@
   @override
   bool get isSynchronous => declaration.isSynchronous;
 
+  @Deprecated('Use ExecutableElement2 instead')
   @override
   LibraryElement get library => _declaration.library!;
 
@@ -507,8 +513,7 @@
   FieldElement2 get baseElement => _element2;
 
   @override
-  List<Element2> get children2 =>
-      children.map((fragment) => fragment.asElement2).nonNulls.toList();
+  List<Element2> get children2 => const [];
 
   @override
   ConstantInitializer? get constantInitializer2 {
@@ -586,6 +591,7 @@
   @override
   bool get isPromotable => declaration.isPromotable;
 
+  @Deprecated('Use FieldElement2 instead')
   @override
   LibraryElement get library => _declaration.library!;
 
@@ -800,6 +806,7 @@
 
   Element2 get baseElement;
 
+  @Deprecated('Use Element2 instead')
   @override
   List<Element> get children => const [];
 
@@ -914,6 +921,7 @@
   @override
   ElementKind get kind => _declaration.kind;
 
+  @Deprecated('Use Element2 instead')
   @override
   LibraryElement? get library => _declaration.library;
 
@@ -976,6 +984,7 @@
     );
   }
 
+  @Deprecated('Use Element2 instead')
   @override
   bool isAccessibleIn(LibraryElement library) =>
       _declaration.isAccessibleIn(library);
@@ -1151,12 +1160,17 @@
   @override
   FormalParameterElement get baseElement => _element2;
 
+  @Deprecated('Use Element2 instead')
   @override
   List<Element> get children => parameters;
 
   @override
-  List<Element2> get children2 =>
-      children.map((fragment) => fragment.asElement2).nonNulls.toList();
+  List<Element2> get children2 {
+    return [
+      ...typeParameters2,
+      ...formalParameters,
+    ];
+  }
 
   @override
   ConstantInitializer? get constantInitializer2 {
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index a57043e..614adaf 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -672,6 +672,7 @@
     }).toFixedList();
   }
 
+  @Deprecated('Use element3 instead')
   @override
   InterfaceElementImpl get element => element3.asElement;
 
@@ -977,14 +978,14 @@
   @override
   PropertyAccessorElement? lookUpGetter2(
     String name,
-    LibraryElement library, {
+    covariant LibraryElementImpl library, {
     bool concrete = false,
     bool inherited = false,
     bool recoveryStatic = false,
   }) {
     return lookUpGetter3(
       name,
-      library.asElement2,
+      library,
       concrete: concrete,
       inherited: inherited,
       recoveryStatic: recoveryStatic,
@@ -1033,14 +1034,14 @@
   @override
   MethodElementOrMember? lookUpMethod2(
     String name,
-    LibraryElement library, {
+    covariant LibraryElementImpl library, {
     bool concrete = false,
     bool inherited = false,
     bool recoveryStatic = false,
   }) {
     return lookUpMethod3(
       name,
-      library.asElement2,
+      library,
       concrete: concrete,
       inherited: inherited,
       recoveryStatic: recoveryStatic,
@@ -1089,14 +1090,14 @@
   @override
   PropertyAccessorElement? lookUpSetter2(
     String name,
-    LibraryElement library, {
+    covariant LibraryElementImpl library, {
     bool concrete = false,
     bool inherited = false,
     bool recoveryStatic = false,
   }) {
     return lookUpSetter3(
       name,
-      library.asElement2,
+      library,
       concrete: concrete,
       inherited: inherited,
       recoveryStatic: recoveryStatic,
diff --git a/pkg/analyzer/lib/src/summary2/instance_member_inferrer.dart b/pkg/analyzer/lib/src/summary2/instance_member_inferrer.dart
index 5acc0e3..9261d4d 100644
--- a/pkg/analyzer/lib/src/summary2/instance_member_inferrer.dart
+++ b/pkg/analyzer/lib/src/summary2/instance_member_inferrer.dart
@@ -489,7 +489,8 @@
     if (superType != null) {
       var index = classElement.constructors.indexOf(constructor);
       var superConstructors = superType.elementImpl.constructors
-          .where((element) => element.isAccessibleIn(classElement.library))
+          .where((element) =>
+              element.asElement2.isAccessibleIn2(classElement.library))
           .toList();
       if (index < superConstructors.length) {
         var baseConstructor = superConstructors[index];
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart
index d9aa290..2cd7b7c 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/element.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -285,12 +285,6 @@
       return self;
     } else if (self is LocalVariableElementImpl) {
       return self.element;
-    } else if (self is MultiplyDefinedElementImpl) {
-      return MultiplyDefinedElementImpl2(
-        self.libraryFragment,
-        self.name,
-        self.conflictingElements.map((e) => e.asElement2).nonNulls.toList(),
-      );
     } else if (self is NeverElementImpl) {
       return NeverElementImpl2.instance;
     } else if (self is ParameterMember) {
@@ -452,7 +446,7 @@
 }
 
 extension InterfaceTypeImplExtension on InterfaceTypeImpl {
-  InterfaceElementImpl get elementImpl => element;
+  InterfaceElementImpl get elementImpl => element3.firstFragment;
 }
 
 extension JoinPatternVariableElementImplExtension
@@ -463,23 +457,19 @@
 }
 
 extension LibraryElement2Extension on LibraryElement2 {
+  @Deprecated('Use LibraryElement2 instead')
   LibraryElement get asElement {
     return this as LibraryElement;
   }
 }
 
+@Deprecated('Use LibraryElement2 instead')
 extension LibraryElementExtension on LibraryElement {
   LibraryElement2 get asElement2 {
     return this as LibraryElement2;
   }
 }
 
-extension LibraryElementOrNullExtension on LibraryElement? {
-  LibraryElement2? get asElement2 {
-    return this as LibraryElement2?;
-  }
-}
-
 extension LibraryFragmentExtension on LibraryFragment {
   /// Returns a list containing this library fragment and all of its enclosing
   /// fragments.
diff --git a/pkg/linter/test/rules/analyzer_use_new_elements_test.dart b/pkg/linter/test/rules/analyzer_use_new_elements_test.dart
index 308ebe9..1113a73 100644
--- a/pkg/linter/test/rules/analyzer_use_new_elements_test.dart
+++ b/pkg/linter/test/rules/analyzer_use_new_elements_test.dart
@@ -64,7 +64,7 @@
   type.element;
 }
 ''',
-      [lint(95, 7)],
+      [error(HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE, 95, 7), lint(95, 7)],
     );
   }