Elements. Updates as needed for google3.

Change-Id: Ib76bf37a41d2fc0923ccddb1da37599589da3a5f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/396571
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index 8a003f3..0916f90 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -653,7 +653,7 @@
   /// Return `true` if the given [element] is a top-level member of the test
   /// package.
   bool _isInsideTestPackage(engine.TopLevelFunctionElement element) {
-    var parent = element.library2!;
+    var parent = element.library2;
     return parent.firstFragment.source.fullName.endsWith('test.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 df09740..555153a 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
@@ -186,7 +186,8 @@
 
     var className = enclosingClass.displayName;
 
-    var completion = element.displayName;
+    // TODO(scheglov): Wrong, if no name, should be no completion.
+    var completion = element.name3 ?? '';
     if (suggestUnnamedAsNew) {
       if (completion.isEmpty) {
         completion = 'new';
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart b/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart
index 0e42288..d3a2278 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart
@@ -465,7 +465,7 @@
       prefix: null,
       isNotImported: true,
     );
-    _addConstructors(library.asElement as LibraryElement, importData);
+    _addConstructors(library.asElement, importData);
   }
 
   /// Add members from all the applicable extensions that are visible in the
@@ -477,7 +477,7 @@
     required bool includeMethods,
     required bool includeSetters,
   }) {
-    var libraryElement = library.asElement as LibraryElement;
+    var libraryElement = library.asElement;
     var applicableExtensions = library.exportNamespace.definedNames.values
         .whereType<ExtensionElement>()
         .applicableTo(
@@ -511,7 +511,7 @@
       isNotImported: true,
     );
     _addExternalTopLevelDeclarations(
-      library: library.asElement as LibraryElement,
+      library: library.asElement,
       namespace: library.exportNamespace,
       importData: importData,
     );
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 2cc1327..9979ae4 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
@@ -741,7 +741,7 @@
       if (constructorElement == null) {
         return;
       }
-      var libraryElement = state.libraryElement.asElement as LibraryElement;
+      var libraryElement = state.libraryElement.asElement;
       declarationHelper(
         mustBeConstant: constructorElement.isConst,
       ).addPossibleRedirectionsInLibrary(constructorElement, libraryElement);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart
index d7c2e17..c9f99a1 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart
@@ -61,7 +61,7 @@
 
   // TODO(brianwilkerson): Use `targetLibrary2` everywhere below and rename it
   //  to `targetLibrary`.
-  var targetLibrary = targetLibrary2.asElement as LibraryElement;
+  var targetLibrary = targetLibrary2.asElement;
   var libUtils = CorrectionUtils(resolveResult);
   var eol = libUtils.endOfLine;
   // Prepare information about existing imports.
diff --git a/pkg/analysis_server/lib/src/services/search/hierarchy.dart b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
index 4fca766..25e3449 100644
--- a/pkg/analysis_server/lib/src/services/search/hierarchy.dart
+++ b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
@@ -304,7 +304,7 @@
 ) async {
   var result = await getHierarchyNamedParameters(
     searchEngine,
-    element.asElement as ParameterElement,
+    element.asElement,
   );
   return result.map((e) => e.asElement2).toList();
 }
diff --git a/pkg/analyzer/lib/dart/analysis/session.dart b/pkg/analyzer/lib/dart/analysis/session.dart
index 8537a74..cbb35ac 100644
--- a/pkg/analyzer/lib/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/dart/analysis/session.dart
@@ -55,6 +55,11 @@
   /// with the given library [element].
   SomeParsedLibraryResult getParsedLibraryByElement(LibraryElement element);
 
+  /// Return information about the results of parsing units of the library file
+  /// with the given library [element].
+  @experimental
+  SomeParsedLibraryResult getParsedLibraryByElement2(LibraryElement2 element);
+
   /// Return information about the results of parsing the file with the given
   /// absolute, normalized [path].
   SomeParsedUnitResult getParsedUnit(String path);
diff --git a/pkg/analyzer/lib/dart/constant/value.dart b/pkg/analyzer/lib/dart/constant/value.dart
index 3740582..48a4796 100644
--- a/pkg/analyzer/lib/dart/constant/value.dart
+++ b/pkg/analyzer/lib/dart/constant/value.dart
@@ -71,6 +71,9 @@
   /// If this object is the value of a constant variable, the variable.
   VariableElement? get variable;
 
+  /// If this object is the value of a constant variable, the variable.
+  VariableElement2? get variable2;
+
   /// Return a representation of the value of the field with the given [name].
   ///
   /// Return `null` if either the object being represented does not have a field
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index c298ef7..ff7c007 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -515,6 +515,9 @@
 abstract class DirectiveUriWithLibrary extends DirectiveUriWithSource {
   /// The library referenced by the [source].
   LibraryElement get library;
+
+  /// The library referenced by the [source].
+  LibraryElement2 get library2;
 }
 
 /// [DirectiveUriWithRelativeUriString] that can be parsed into a relative URI.
@@ -1987,6 +1990,9 @@
   /// the order in which they were specified.
   List<NamespaceCombinator> get combinators;
 
+  @override
+  CompilationUnitElement get enclosingElement3;
+
   /// The [LibraryElement], if [uri] is a [DirectiveUriWithLibrary].
   LibraryElement? get exportedLibrary;
 
diff --git a/pkg/analyzer/lib/dart/element/element2.dart b/pkg/analyzer/lib/dart/element/element2.dart
index f6f5362..28eb844 100644
--- a/pkg/analyzer/lib/dart/element/element2.dart
+++ b/pkg/analyzer/lib/dart/element/element2.dart
@@ -495,6 +495,13 @@
   /// be changed if doing so would improve the UX.
   String displayString2({bool multiline = false, bool preferTypeAlias = false});
 
+  /// Returns a display name for the given element that includes the path to the
+  /// compilation unit in which the type is defined. If [shortName] is `null`
+  /// then [displayName] will be used as the name of this element. Otherwise
+  /// the provided name will be used.
+  // TODO(brianwilkerson): Make the parameter optional.
+  String getExtendedDisplayName(String? shortName);
+
   /// Whether the element, assuming that it is within scope, is accessible to
   /// code in the given [library].
   ///
@@ -1165,6 +1172,28 @@
 
   /// Returns the setter from [setters2] that has the given [name].
   SetterElement? getSetter2(String name);
+
+  /// Returns the element representing the getter that results from looking up
+  /// the given [name] in this class with respect to the given [library],
+  /// or `null` if the look up fails.
+  ///
+  /// The behavior of this method is defined by the Dart Language Specification
+  /// in section 17.18 Lookup.
+  PropertyAccessorElement2? lookUpGetter2({
+    required String name,
+    required LibraryElement2 library,
+  });
+
+  /// Returns the element representing the method that results from looking up
+  /// the given [name] in this class with respect to the given [library],
+  /// or `null` if the look up fails.
+  ///
+  /// The behavior of this method is defined by the Dart Language Specification
+  /// in section 17.18 Lookup.
+  MethodElement2? lookUpMethod2({
+    required String name,
+    required LibraryElement2 library,
+  });
 }
 
 /// The portion of an [InstanceElement2] contributed by a single declaration.
@@ -1279,6 +1308,25 @@
     required List<DartType> typeArguments,
     required NullabilitySuffix nullabilitySuffix,
   });
+
+  /// Returns the element representing the method that results from looking up
+  /// the given [methodName] in the superclass of this class with respect to the
+  /// given [library], or `null` if the look up fails.
+  ///
+  /// The behavior of this method is defined by the Dart Language Specification
+  /// in section 16.15.1:
+  /// <blockquote>
+  /// The result of looking up method <i>m</i> in class <i>C</i> with respect to
+  /// library <i>L</i> is:  If <i>C</i> declares an instance method named
+  /// <i>m</i> that is accessible to <i>L</i>, then that method is the result of
+  /// the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the
+  /// result of the lookup is the result of looking up method <i>m</i> in
+  /// <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
+  /// failed.
+  /// </blockquote>
+  // TODO(scheglov): Deprecate and remove it.
+  MethodElement2? lookUpInheritedMethod2(
+      String methodName, LibraryElement2 library);
 }
 
 /// The portion of an [InterfaceElement2] contributed by a single declaration.
@@ -1455,6 +1503,12 @@
   /// of this element's parent.
   String get identifier;
 
+  /// The libraries that are imported into this library.
+  ///
+  /// This includes all of the libraries that are imported using a prefix, and
+  /// those that are imported without a prefix.
+  List<LibraryElement2> get importedLibraries2;
+
   /// Whether the library is the `dart:async` library.
   bool get isDartAsync;
 
@@ -1902,6 +1956,9 @@
   /// The test might be based on the name of the executable element, in which
   /// case the result will be correct when the name is legal.
   bool get isOperator;
+
+  @override
+  LibraryElement2 get library2;
 }
 
 /// The portion of a [MethodElement2] contributed by a single declaration.
@@ -2352,6 +2409,9 @@
   ///
   /// A top-level function is an entry point if it has the name `main`.
   bool get isEntryPoint;
+
+  @override
+  LibraryElement2 get library2;
 }
 
 /// The portion of a [TopLevelFunctionElement] contributed by a single
diff --git a/pkg/analyzer/lib/dart/element/type.dart b/pkg/analyzer/lib/dart/element/type.dart
index 333fdcb..52d5107 100644
--- a/pkg/analyzer/lib/dart/element/type.dart
+++ b/pkg/analyzer/lib/dart/element/type.dart
@@ -420,6 +420,24 @@
     bool recoveryStatic = false,
   });
 
+  /// Return the getter with the given [name].
+  ///
+  /// If [concrete] is `true`, then the concrete implementation is returned,
+  /// from this type, or its superclass.
+  ///
+  /// If [inherited] is `true`, then only getters from the superclass are
+  /// considered.
+  ///
+  /// If [recoveryStatic] is `true`, then static getters of the class,
+  /// and its superclasses are considered. Clients should not use it.
+  GetterElement? lookUpGetter3(
+    String name,
+    LibraryElement2 library, {
+    bool concrete = false,
+    bool inherited = false,
+    bool recoveryStatic = false,
+  });
+
   /// Return the method with the given [name].
   ///
   /// If [concrete] is `true`, then the concrete implementation is returned,
@@ -438,6 +456,24 @@
     bool recoveryStatic = false,
   });
 
+  /// Return the method with the given [name].
+  ///
+  /// If [concrete] is `true`, then the concrete implementation is returned,
+  /// from this type, or its superclass.
+  ///
+  /// If [inherited] is `true`, then only methods from the superclass are
+  /// considered.
+  ///
+  /// If [recoveryStatic] is `true`, then static methods of the class,
+  /// and its superclasses are considered. Clients should not use it.
+  MethodElement2? lookUpMethod3(
+    String name,
+    LibraryElement2 library, {
+    bool concrete = false,
+    bool inherited = false,
+    bool recoveryStatic = false,
+  });
+
   /// Return the setter with the given [name].
   ///
   /// If [concrete] is `true`, then the concrete implementation is returned,
@@ -455,6 +491,24 @@
     bool inherited = false,
     bool recoveryStatic = false,
   });
+
+  /// Return the setter with the given [name].
+  ///
+  /// If [concrete] is `true`, then the concrete implementation is returned,
+  /// from this type, or its superclass.
+  ///
+  /// If [inherited] is `true`, then only setters from the superclass are
+  /// considered.
+  ///
+  /// If [recoveryStatic] is `true`, then static setters of the class,
+  /// and its superclasses are considered. Clients should not use it.
+  SetterElement? lookUpSetter3(
+    String name,
+    LibraryElement2 library, {
+    bool concrete = false,
+    bool inherited = false,
+    bool recoveryStatic = false,
+  });
 }
 
 /// The type arising from code with errors, such as invalid type annotations,
diff --git a/pkg/analyzer/lib/dart/element/visitor2.dart b/pkg/analyzer/lib/dart/element/visitor2.dart
index 41bc9c5f..bcea781 100644
--- a/pkg/analyzer/lib/dart/element/visitor2.dart
+++ b/pkg/analyzer/lib/dart/element/visitor2.dart
@@ -120,7 +120,7 @@
 
   @override
   R? visitGetterElement(GetterElement element) =>
-      visitExecutableElement(element);
+      visitPropertyAccessorElement(element);
 
   @override
   R? visitLabelElement(LabelElement2 element) {
@@ -156,12 +156,15 @@
     return visitElement(element);
   }
 
+  R? visitPropertyAccessorElement(PropertyAccessorElement2 element) =>
+      visitExecutableElement(element);
+
   R? visitPropertyInducingElement(PropertyInducingElement2 element) =>
       visitVariableElement(element);
 
   @override
   R? visitSetterElement(SetterElement element) =>
-      visitExecutableElement(element);
+      visitPropertyAccessorElement(element);
 
   @override
   R? visitSuperFormalParameterElement(SuperFormalParameterElement2 element) =>
diff --git a/pkg/analyzer/lib/src/dart/analysis/session.dart b/pkg/analyzer/lib/src/dart/analysis/session.dart
index 99291c8..d63eac5 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session.dart
@@ -105,6 +105,17 @@
   }
 
   @override
+  SomeParsedLibraryResult getParsedLibraryByElement2(LibraryElement2 element) {
+    checkConsistency();
+
+    if (element.session != this) {
+      return NotElementOfThisSessionResult();
+    }
+
+    return _driver.getParsedLibraryByUri(element.uri);
+  }
+
+  @override
   SomeParsedUnitResult getParsedUnit(String path) {
     checkConsistency();
     return _driver.parseFileSync(path);
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 10afec6..2bd994d 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -10,6 +10,7 @@
 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/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
@@ -519,6 +520,9 @@
 
   /// The library with this constant.
   LibraryElement? get library;
+
+  /// The library with this constant.
+  LibraryElement2? get library2;
 }
 
 /// A visitor used to evaluate constant expressions to produce their
diff --git a/pkg/analyzer/lib/src/dart/constant/value.dart b/pkg/analyzer/lib/src/dart/constant/value.dart
index 00f4a45..840d86c 100644
--- a/pkg/analyzer/lib/src/dart/constant/value.dart
+++ b/pkg/analyzer/lib/src/dart/constant/value.dart
@@ -156,6 +156,9 @@
   ConstructorInvocation(
       this.constructor, this._argumentValues, this.namedArguments);
 
+  /// The constructor that was called.
+  ConstructorElement2 get constructor2 => constructor.asElement2;
+
   /// The positional arguments passed to the constructor.
   List<DartObjectImpl> get positionalArguments {
     var result = <DartObjectImpl>[];
@@ -279,6 +282,9 @@
   List<DartType>? get typeArguments => (state as FunctionState).typeArguments;
 
   @override
+  VariableElement2? get variable2 => variable.asElement2 as VariableElement2?;
+
+  @override
   bool operator ==(Object other) {
     if (other is DartObjectImpl) {
       return _typeSystem.runtimeTypesEqual(type, other.type) &&
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 5f14b9f..b2312d7 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -31,6 +31,7 @@
 import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/display_string_builder.dart';
 import 'package:analyzer/src/dart/element/field_name_non_promotability_info.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/name_union.dart';
 import 'package:analyzer/src/dart/element/scope.dart';
@@ -1584,6 +1585,17 @@
   ConstructorElement2 get baseElement => this;
 
   @override
+  String get displayName {
+    var className = enclosingElement2.name3 ?? '<null>';
+    var name = name3 ?? '<null>';
+    if (name != 'new') {
+      return '$className.$name';
+    } else {
+      return className;
+    }
+  }
+
+  @override
   InterfaceElementImpl2 get enclosingElement2 =>
       firstFragment.enclosingElement3.element;
 
@@ -1866,6 +1878,9 @@
     required super.relativeUri,
     required super.source,
   });
+
+  @override
+  LibraryElement2 get library2 => library;
 }
 
 class DirectiveUriWithRelativeUriImpl
@@ -2347,6 +2362,9 @@
   @override
   LibraryElement get library => compilationUnit.library;
 
+  @override
+  LibraryElement2 get library2 => compilationUnit.library;
+
   /// Get the library containing this annotation.
   @override
   Source get librarySource => compilationUnit.librarySource;
@@ -3323,6 +3341,13 @@
   }
 
   @override
+  String getExtendedDisplayName(String? shortName) {
+    shortName ??= displayName;
+    var source = firstFragment.libraryFragment?.source;
+    return "$shortName (${source?.fullName})";
+  }
+
+  @override
   bool isAccessibleIn2(LibraryElement2 library) {
     var name3 = this.name3;
     if (name3 == null || Identifier.isPrivateName(name3)) {
@@ -5549,6 +5574,17 @@
   }
 
   @override
+  PropertyAccessorElement2? lookUpGetter2({
+    required String name,
+    required LibraryElement2 library,
+  }) {
+    return lookUpGetter(
+      name: name,
+      library: library.asElement,
+    )?.asElement2;
+  }
+
+  @override
   MethodElement? lookUpMethod({
     required String name,
     required LibraryElement library,
@@ -5558,6 +5594,17 @@
   }
 
   @override
+  MethodElement2? lookUpMethod2({
+    required String name,
+    required LibraryElement2 library,
+  }) {
+    return lookUpMethod(
+      name: name,
+      library: library.asElement,
+    )?.asElement2;
+  }
+
+  @override
   PropertyAccessorElement? lookUpSetter({
     required String name,
     required LibraryElement library,
@@ -6186,6 +6233,11 @@
   @override
   InterfaceElementImpl get firstFragment;
 
+  InheritanceManager3 get inheritanceManager {
+    var library = library2 as LibraryElementImpl;
+    return library.session.inheritanceManager;
+  }
+
   @override
   List<InterfaceType> get mixins {
     if (firstFragment.mixinInferenceCallback case var callback?) {
@@ -6252,6 +6304,19 @@
   }) =>
       firstFragment.instantiate(
           typeArguments: typeArguments, nullabilitySuffix: nullabilitySuffix);
+
+  @override
+  MethodElement2? lookUpInheritedMethod2(
+    String methodName,
+    LibraryElement2 library,
+  ) {
+    return inheritanceManager
+        .getInherited4(
+          this,
+          Name.forLibrary(library, methodName),
+        )
+        .ifTypeOrNull();
+  }
 }
 
 class JoinPatternVariableElementImpl extends PatternVariableElementImpl
@@ -6543,13 +6608,15 @@
   List<Element2> get children2 {
     return [
       ...classes,
+      ...enums,
       ...extensions,
       ...extensionTypes,
-      ...topLevelFunctions,
-      ...mixins,
-      ...typeAliases,
       ...getters,
+      ...mixins,
+      ...setters,
+      ...topLevelFunctions,
       ...topLevelVariables,
+      ...typeAliases,
     ];
   }
 
@@ -6687,6 +6754,16 @@
   }
 
   @override
+  List<LibraryElement2> get importedLibraries2 {
+    return fragments
+        .expand((fragment) => fragment.libraryImports2)
+        .map((import) => import.importedLibrary2)
+        .nonNulls
+        .toSet()
+        .toList();
+  }
+
+  @override
   bool get isDartAsync => name == "dart.async";
 
   @override
@@ -6970,6 +7047,11 @@
   }
 
   @override
+  CompilationUnitElementImpl get enclosingElement3 {
+    return super.enclosingElement3 as CompilationUnitElementImpl;
+  }
+
+  @override
   LibraryElementImpl? get exportedLibrary {
     var uri = this.uri;
     if (uri is DirectiveUriWithLibraryImpl) {
@@ -7849,6 +7931,9 @@
   ElementKind get kind => ElementKind.METHOD;
 
   @override
+  LibraryElement2 get library2 => super.library2!;
+
+  @override
   String? get lookupName {
     if (name3 == '-' && formalParameters.isEmpty) {
       return 'unary-';
@@ -10006,6 +10091,9 @@
   ElementKind get kind => ElementKind.FUNCTION;
 
   @override
+  LibraryElement2 get library2 => super.library2!;
+
+  @override
   String? get name3 => firstFragment.name;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 0053c66..608216a 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -996,6 +996,9 @@
   MethodFragment get firstFragment => _element2.firstFragment;
 
   @override
+  LibraryElement2 get library2 => _element2.library2;
+
+  @override
   String? get lookupName => name3;
 
   @override
@@ -1519,6 +1522,9 @@
   LibraryElement get library => _declaration.library!;
 
   @override
+  LibraryElement2 get library2 => _declaration.library as LibraryElement2;
+
+  @override
   String get name => declaration.name;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 146b99b..02f5181 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -17,6 +17,8 @@
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/utilities/extensions/collection.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
+import 'package:analyzer/src/utilities/extensions/object.dart';
 import 'package:collection/collection.dart';
 
 /// Returns a [List] of fixed length with given types.
@@ -751,7 +753,7 @@
 
   @override
   List<MethodElement2> get methods2 =>
-      methods.map((fragment) => (fragment as MethodFragment).element).toList();
+      methods.map((e) => e.asElement2).toList();
 
   @override
   List<InterfaceType> get mixins {
@@ -953,6 +955,23 @@
   }
 
   @override
+  GetterElement? lookUpGetter3(
+    String name,
+    LibraryElement2 library, {
+    bool concrete = false,
+    bool inherited = false,
+    bool recoveryStatic = false,
+  }) {
+    return lookUpGetter2(
+      name,
+      library.asElement,
+      concrete: concrete,
+      inherited: inherited,
+      recoveryStatic: recoveryStatic,
+    )?.asElement2.ifTypeOrNull();
+  }
+
+  @override
   MethodElement? lookUpMethod2(
     String name,
     LibraryElement library, {
@@ -992,6 +1011,23 @@
   }
 
   @override
+  MethodElement2? lookUpMethod3(
+    String name,
+    LibraryElement2 library, {
+    bool concrete = false,
+    bool inherited = false,
+    bool recoveryStatic = false,
+  }) {
+    return lookUpMethod2(
+      name,
+      library.asElement,
+      concrete: concrete,
+      inherited: inherited,
+      recoveryStatic: recoveryStatic,
+    )?.asElement2;
+  }
+
+  @override
   PropertyAccessorElement? lookUpSetter2(
     String name,
     LibraryElement library, {
@@ -1031,6 +1067,23 @@
   }
 
   @override
+  SetterElement? lookUpSetter3(
+    String name,
+    LibraryElement2 library, {
+    bool concrete = false,
+    bool inherited = false,
+    bool recoveryStatic = false,
+  }) {
+    return lookUpSetter2(
+      name,
+      library.asElement,
+      concrete: concrete,
+      inherited: inherited,
+      recoveryStatic: recoveryStatic,
+    )?.asElement2.ifTypeOrNull();
+  }
+
+  @override
   bool referencesAny(Set<TypeParameterElement> parameters) {
     return typeArguments.any((argument) {
       var argumentImpl = argument as TypeImpl;
diff --git a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
index 5ecb605..fdbe847 100644
--- a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
+++ b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
@@ -4,10 +4,12 @@
 
 import 'package:analyzer/dart/ast/syntactic_entity.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/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
 import 'package:collection/collection.dart';
 
@@ -113,7 +115,14 @@
   }
 
   void reportError(SyntacticEntity errorEntity, Element element,
-      String displayName, String? message);
+      String displayName, String? message) {
+    reportError2(errorEntity, element.asElement2!, displayName, message);
+  }
+
+  void reportError2(SyntacticEntity errorEntity, Element2 element,
+      String displayName, String? message) {
+    reportError(errorEntity, element.asElement!, displayName, message);
+  }
 
   void simpleIdentifier(SimpleIdentifier node) {
     // Don't report declared identifiers.
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart
index f58fa7e..8c8c85c 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/element.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -11,6 +11,12 @@
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:meta/meta.dart';
 
+extension ClassElement2Extension on ClassElement2 {
+  ClassElement get asElement {
+    return firstFragment as ClassElement;
+  }
+}
+
 extension ClassElementExtension on ClassElement {
   ClassElement2 get asElement2 {
     return (this as ClassElementImpl).element;
@@ -18,6 +24,10 @@
 }
 
 extension CompilationUnitElementExtension on CompilationUnitElement {
+  LibraryFragment get asElement2 {
+    return this as LibraryFragment;
+  }
+
   /// Returns this library fragment, and all its enclosing fragments.
   List<CompilationUnitElement> get withEnclosing {
     var result = <CompilationUnitElement>[];
@@ -34,6 +44,12 @@
   }
 }
 
+extension ConstructorElement2Extension on ConstructorElement2 {
+  ConstructorElement get asElement {
+    return baseElement.firstFragment as ConstructorElement;
+  }
+}
+
 extension ConstructorElementExtension on ConstructorElement {
   ConstructorElement2 get asElement2 {
     return switch (this) {
@@ -44,10 +60,21 @@
   }
 }
 
+extension Element2Extension on Element2 {
+  List<ElementAnnotation> get metadata {
+    if (this case Annotatable annotatable) {
+      return annotatable.metadata2.annotations;
+    }
+    return [];
+  }
+}
+
 extension Element2OrNullExtension on Element2? {
   Element? get asElement {
     var self = this;
     switch (self) {
+      case null:
+        return null;
       case ConstructorElementImpl2():
         return self.firstFragment as Element;
       case DynamicElementImpl():
@@ -58,10 +85,12 @@
         return self.firstFragment as Element;
       case FieldMember():
         return self.declaration as Element;
-      case FormalParameterElementImpl():
-        return self.firstFragment as Element;
+      case FormalParameterElement element2:
+        return element2.asElement;
       case GetterElementImpl():
         return self.firstFragment as Element;
+      case LabelElementImpl2 element2:
+        return element2.asElement;
       case LibraryElementImpl():
         return self as Element;
       case LocalFunctionElementImpl():
@@ -74,6 +103,8 @@
         return element2.asElement;
       case NeverElementImpl2():
         return NeverElementImpl.instance;
+      case PrefixElement2 element2:
+        return element2.asElement;
       case SetterElementImpl():
         return self.firstFragment as Element;
       case TopLevelFunctionElementImpl():
@@ -83,7 +114,7 @@
       case TypeDefiningElement2():
         return self.firstFragment as Element;
       default:
-        return null;
+        throw UnsupportedError('Unsupported type: $runtimeType');
     }
   }
 }
@@ -267,6 +298,10 @@
 }
 
 extension FormalParameterExtension on FormalParameterElement {
+  ParameterElement get asElement {
+    return firstFragment as ParameterElement;
+  }
+
   void appendToWithoutDelimiters(
     StringBuffer buffer, {
     @Deprecated('Only non-nullable by default mode is supported')
@@ -299,9 +334,34 @@
   }
 }
 
+extension InterfaceTypeExtension on InterfaceType {
+  MethodElement2? getMethod2(String name) {
+    return getMethod(name)?.asElement2;
+  }
+}
+
+extension LabelElement2Extension on LabelElement2 {
+  LabelElement get asElement {
+    return firstFragment as LabelElement;
+  }
+}
+
+extension LibraryElement2Extension on LibraryElement2 {
+  LibraryElement get asElement {
+    return this as LibraryElement;
+  }
+}
+
 extension LibraryElementExtension on LibraryElement {
   LibraryElement2 get asElement2 {
-    return this as LibraryElementImpl;
+    return this as LibraryElement2;
+  }
+}
+
+extension LibraryExportElementExtension on LibraryExportElement {
+  LibraryExport get asElement2 {
+    var index = enclosingElement3.libraryExports.indexOf(this);
+    return enclosingElement3.asElement2.libraryExports2[index];
   }
 }
 
@@ -323,6 +383,13 @@
   }
 }
 
+extension LibraryImportElementExtension on LibraryImportElement {
+  LibraryImport get asElement2 {
+    var index = enclosingElement3.libraryImports.indexOf(this);
+    return enclosingElement3.asElement2.libraryImports2[index];
+  }
+}
+
 extension ListOfTypeParameterElementExtension on List<TypeParameterElement> {
   List<TypeParameterType> instantiateNone() {
     return map((e) {
@@ -391,6 +458,12 @@
   }
 }
 
+extension TopLevelVariableElement2Extension on TopLevelVariableElement2 {
+  TopLevelVariableElement get asElement {
+    return baseElement.firstFragment as TopLevelVariableElement;
+  }
+}
+
 extension TopLevelVariableElementExtension on TopLevelVariableElement {
   TopLevelVariableElement2 get asElement2 {
     return (this as TopLevelVariableElementImpl).element;
diff --git a/pkg/analyzer/lib/src/wolf/ir/ast_to_ir.dart b/pkg/analyzer/lib/src/wolf/ir/ast_to_ir.dart
index 45ef370..d4db4e9 100644
--- a/pkg/analyzer/lib/src/wolf/ir/ast_to_ir.dart
+++ b/pkg/analyzer/lib/src/wolf/ir/ast_to_ir.dart
@@ -724,7 +724,7 @@
             isNullAware: false,
             previousNestingLevel: previousNestingLevel);
         // Stack: arguments
-        if (methodElement.library2!.isDartCore &&
+        if (methodElement.library2.isDartCore &&
             methodElement.name3 == 'identical') {
           ir.identical();
         } else {
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
index 65af9cc..8d2fd2e 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
@@ -1314,7 +1314,7 @@
   constructorName: ConstructorName
     type: NamedType
       name: prefix
-      element: <null>
+      element: <testLibraryFragment>::@prefix::prefix
       element2: <testLibraryFragment>::@prefix2::prefix
       type: InvalidType
     staticElement: <null>
diff --git a/pkg/analyzer/test/src/dart/resolution/named_type_test.dart b/pkg/analyzer/test/src/dart/resolution/named_type_test.dart
index 07bd281..dc12bd6 100644
--- a/pkg/analyzer/test/src/dart/resolution/named_type_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/named_type_test.dart
@@ -605,7 +605,7 @@
     assertResolvedNodeText(node, r'''
 NamedType
   name: prefix
-  element: <null>
+  element: <testLibraryFragment>::@prefix::prefix
   element2: <testLibraryFragment>::@prefix2::prefix
   type: InvalidType
 ''');
@@ -633,7 +633,7 @@
         element2: dart:core::@class::int
         type: int
     rightBracket: >
-  element: <null>
+  element: <testLibraryFragment>::@prefix::prefix
   element2: <testLibraryFragment>::@prefix2::prefix
   type: InvalidType
 ''');
diff --git a/pkg/linter/lib/src/rules/discarded_futures.dart b/pkg/linter/lib/src/rules/discarded_futures.dart
index 447532b..0d5faf8 100644
--- a/pkg/linter/lib/src/rules/discarded_futures.dart
+++ b/pkg/linter/lib/src/rules/discarded_futures.dart
@@ -131,6 +131,6 @@
     var self = this;
     return self is TopLevelFunctionElement &&
         self.name3 == 'unawaited' &&
-        (self.library2?.isDartAsync ?? false);
+        self.library2.isDartAsync;
   }
 }
diff --git a/pkg/linter/lib/src/rules/use_test_throws_matchers.dart b/pkg/linter/lib/src/rules/use_test_throws_matchers.dart
index ba4db790..221d861 100644
--- a/pkg/linter/lib/src/rules/use_test_throws_matchers.dart
+++ b/pkg/linter/lib/src/rules/use_test_throws_matchers.dart
@@ -39,7 +39,7 @@
     if (expression is! MethodInvocation) return false;
     var element = expression.methodName.element;
     return element is TopLevelFunctionElement &&
-        element.library2?.uri ==
+        element.library2.uri ==
             Uri.parse('package:test_api/src/frontend/expect.dart') &&
         element.name3 == functionName;
   }
diff --git a/pkg/linter/lib/src/rules/use_truncating_division.dart b/pkg/linter/lib/src/rules/use_truncating_division.dart
index 07ba6a6..8fd8988 100644
--- a/pkg/linter/lib/src/rules/use_truncating_division.dart
+++ b/pkg/linter/lib/src/rules/use_truncating_division.dart
@@ -50,7 +50,7 @@
     if (methodElement == null) return;
 
     var libraryElement = methodElement.library2;
-    if (libraryElement != null && !libraryElement.isDartCore) return;
+    if (!libraryElement.isDartCore) return;
 
     var parent = node.parent;
     if (parent is! ParenthesizedExpression) return;