Elements. Migrate src/dart/element/scope.dart

Change-Id: Id5f07a688138f463e307cb145d56cb286ba85cac
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/407220
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/dart/element/element2.dart b/pkg/analyzer/lib/dart/element/element2.dart
index 8220877..a85edba 100644
--- a/pkg/analyzer/lib/dart/element/element2.dart
+++ b/pkg/analyzer/lib/dart/element/element2.dart
@@ -2561,6 +2561,10 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class TopLevelFunctionElement
     implements ExecutableElement2, HasSinceSdkVersion {
+  /// The name of the synthetic function defined for libraries that are
+  /// deferred.
+  static final String LOAD_LIBRARY_NAME = "loadLibrary";
+
   @override
   TopLevelFunctionElement get baseElement;
 
diff --git a/pkg/analyzer/lib/dart/element/scope.dart b/pkg/analyzer/lib/dart/element/scope.dart
index 61d0037..bc8d49b 100644
--- a/pkg/analyzer/lib/dart/element/scope.dart
+++ b/pkg/analyzer/lib/dart/element/scope.dart
@@ -6,6 +6,7 @@
 
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/element2.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
 
 /// Scopes are used to resolve names to elements.
 ///
@@ -23,8 +24,10 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class ScopeLookupResult {
-  Element? get getter;
+  Element? get getter => getter2?.asElement;
   Element2? get getter2;
-  Element? get setter;
+
+  Element? get setter => setter2?.asElement;
+
   Element2? get setter2;
 }
diff --git a/pkg/analyzer/lib/src/dart/ast/extensions.dart b/pkg/analyzer/lib/src/dart/ast/extensions.dart
index b40317e..aaff107 100644
--- a/pkg/analyzer/lib/src/dart/ast/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/ast/extensions.dart
@@ -279,14 +279,14 @@
         name2: self.identifier.token,
         typeArguments: typeArguments,
         question: question,
-      )..element2 = self.identifier.staticElement.asElement2;
+      )..element2 = self.identifier.staticElement?.asElement2;
     } else if (self is SimpleIdentifierImpl) {
       return NamedTypeImpl(
         importPrefix: null,
         name2: self.token,
         typeArguments: typeArguments,
         question: question,
-      )..element2 = self.staticElement.asElement2;
+      )..element2 = self.staticElement?.asElement2;
     } else {
       throw UnimplementedError('(${self.runtimeType}) $self');
     }
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 959c4d9..69c0e25 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -683,6 +683,10 @@
   @override
   bool get isDartCoreObject => firstFragment.isDartCoreObject;
 
+  bool get isDartCoreRecord {
+    return name3 == 'Record' && library2.isDartCore;
+  }
+
   bool get isEnumLike {
     // Must be a concrete class.
     if (isAbstract) {
@@ -844,14 +848,12 @@
 
   @override
   List<ExtensionElement> get accessibleExtensions {
-    return scope.accessibleExtensions;
+    return scope.accessibleExtensions.map((e) => e.asElement).toList();
   }
 
   @override
   List<ExtensionElement2> get accessibleExtensions2 {
-    return scope.accessibleExtensions
-        .map((element) => element.augmented as ExtensionElement2)
-        .toList();
+    return scope.accessibleExtensions;
   }
 
   @override
@@ -9851,6 +9853,10 @@
     return asElement.scope;
   }
 
+  set scope(PrefixScope value) {
+    asElement.scope = value;
+  }
+
   @override
   T? accept2<T>(ElementVisitor2<T> visitor) {
     return visitor.visitPrefixElement(this);
diff --git a/pkg/analyzer/lib/src/dart/element/scope.dart b/pkg/analyzer/lib/src/dart/element/scope.dart
index b83db1d..ca9f6f2 100644
--- a/pkg/analyzer/lib/src/dart/element/scope.dart
+++ b/pkg/analyzer/lib/src/dart/element/scope.dart
@@ -2,29 +2,26 @@
 // 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:_fe_analyzer_shared/src/scanner/string_canonicalizer.dart';
 import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/scope.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/extensions.dart';
 import 'package:analyzer/src/summary2/combinator.dart';
 import 'package:analyzer/src/utilities/extensions/collection.dart';
-import 'package:analyzer/src/utilities/extensions/element.dart';
 
 /// The scope for the initializers in a constructor.
 class ConstructorInitializerScope extends EnclosedScope {
-  ConstructorInitializerScope(super.parent, ConstructorElement element) {
-    for (var parameter in element.parameters) {
+  ConstructorInitializerScope(super.parent, ConstructorElement2 element) {
+    var hasWildcardVariables =
+        element.library2.featureSet.isEnabled(Feature.wildcard_variables);
+    for (var formalParameter in element.formalParameters) {
       // Skip wildcards.
-      if (parameter.name == '_' &&
-          element.library.featureSet.isEnabled(Feature.wildcard_variables)) {
+      if (formalParameter.name3 == '_' && hasWildcardVariables) {
         continue;
       }
-      _addGetter(parameter);
+      _addGetter(formalParameter);
     }
   }
 }
@@ -41,15 +38,15 @@
   Scope innerScope;
 
   DocumentationCommentScope(
-      this.innerScope, List<LibraryElement> docImportLibraries) {
+      this.innerScope, List<LibraryElement2> docImportLibraries) {
     for (var importedLibrary in docImportLibraries) {
       if (importedLibrary is LibraryElementImpl) {
         // TODO(kallentu): Handle combinators.
         for (var exportedReference in importedLibrary.exportedReferences) {
           var reference = exportedReference.reference;
           var element = importedLibrary.session.elementFactory
-              .elementOfReference(reference)!;
-          if (element is PropertyAccessorElement && element.isSetter) {
+              .elementOfReference2(reference)!;
+          if (element is SetterElement) {
             _addSetter(element);
           } else {
             _addGetter(element);
@@ -62,10 +59,10 @@
   @override
   ScopeLookupResult lookup(String id) {
     var result = innerScope.lookup(id);
-    if (result.getter != null || result.setter != null) return result;
+    if (result.getter2 != null || result.setter2 != null) return result;
     return ScopeLookupResultImpl(
-      getter: _getters[id],
-      setter: _setters[id],
+      getter2: _getters[id],
+      setter2: _setters[id],
     );
   }
 }
@@ -84,8 +81,8 @@
     var setter = _setters[id];
     if (getter != null || setter != null) {
       return ScopeLookupResultImpl(
-        getter: getter,
-        setter: setter,
+        getter2: getter,
+        setter2: setter,
       );
     }
 
@@ -97,21 +94,22 @@
 class ExtensionScope extends EnclosedScope {
   ExtensionScope(
     super.parent,
-    ExtensionElement element,
+    ExtensionElement2 element,
   ) {
-    element.accessors.forEach(_addPropertyAccessor);
-    element.methods.forEach(_addGetter);
+    element.getters2.forEach(_addGetter);
+    element.setters2.forEach(_addSetter);
+    element.methods2.forEach(_addGetter);
   }
 }
 
 class FormalParameterScope extends EnclosedScope {
   FormalParameterScope(
     super.parent,
-    List<ParameterElement> elements,
+    List<FormalParameterElement> elements,
   ) {
     for (var parameter in elements) {
-      if (parameter is! FieldFormalParameterElement &&
-          parameter is! SuperFormalParameterElement) {
+      if (parameter is! FieldFormalParameterElement2 &&
+          parameter is! SuperFormalParameterElement2) {
         if (!parameter.isWildcardVariable) {
           _addGetter(parameter);
         }
@@ -123,36 +121,26 @@
 /// Tracking information for all import in [CompilationUnitElementImpl].
 class ImportsTracking {
   /// Tracking information for each import prefix.
-  final Map<PrefixElementImpl?, ImportsTrackingOfPrefix> map;
+  final Map<PrefixElementImpl2?, ImportsTrackingOfPrefix> map;
 
   ImportsTracking({
     required this.map,
   });
 
   /// The elements that are used from [import].
-  Set<Element> elementsOf(LibraryImportElementImpl import) {
-    return trackerOf(import).importToUsedElements[import] ?? {};
+  Set<Element2> elementsOf(LibraryImportElementImpl import) {
+    return trackerOf(import)?.importToUsedElements[import] ?? {};
   }
 
-  /// The elements that are used from [import].
-  Set<Element2> elementsOf2(LibraryImportElementImpl import) {
-    return trackerOf(import)
-            .importToUsedElements[import]
-            ?.map((e) => e.asElement2)
-            .nonNulls
-            .toSet() ??
-        {};
-  }
-
-  void notifyExtensionUsed(ExtensionElement element) {
+  void notifyExtensionUsed(ExtensionElement2 element) {
     for (var tracking in map.values) {
       tracking.notifyExtensionUsed(element);
     }
   }
 
-  ImportsTrackingOfPrefix trackerOf(LibraryImportElementImpl import) {
-    var prefix = import.prefix?.element;
-    return map[prefix]!;
+  ImportsTrackingOfPrefix? trackerOf(LibraryImportElementImpl import) {
+    var prefix = import.prefix2?.element;
+    return map[prefix];
   }
 }
 
@@ -161,16 +149,16 @@
 
   /// Key: an element.
   /// Value: the imports that provide the element.
-  final Map<Element, List<LibraryImportElementImpl>> _elementImports = {};
+  final Map<Element2, List<LibraryImportElementImpl>> _elementImports = {};
 
   /// Key: an import.
   /// Value: used elements imported from the import.
-  final Map<LibraryImportElementImpl, Set<Element>> importToUsedElements = {};
+  final Map<LibraryImportElementImpl, Set<Element2>> importToUsedElements = {};
 
   /// Key: an import.
   /// Value: used elements imported from the import.
   /// Excludes elements from deprecated exports.
-  final Map<LibraryImportElementImpl, Set<Element>> importToAccessedElements2 =
+  final Map<LibraryImportElementImpl, Set<Element2>> importToAccessedElements2 =
       {};
 
   /// Usually it is an error to use an import prefix without `.identifier`
@@ -187,13 +175,8 @@
     _buildElementToImportsMap();
   }
 
-  Map<LibraryImportElementImpl, Set<Element2>> get importToUsedElements2 {
-    return importToUsedElements.mapValue(
-        (elements) => elements.map((e) => e.asElement2).nonNulls.toSet());
-  }
-
   /// The elements that are used from [import].
-  Set<Element> elementsOf(LibraryImportElementImpl import) {
+  Set<Element2> elementsOf(LibraryImportElementImpl import) {
     return importToUsedElements[import] ?? {};
   }
 
@@ -202,7 +185,7 @@
   Set<Element2> elementsOf2(LibraryImportElementImpl import) {
     var result = importToAccessedElements2[import];
     if (result != null) {
-      return result.map((e) => e.asElement2).nonNulls.toSet();
+      return result;
     }
 
     var accessedElements = elementsOf(import);
@@ -213,7 +196,7 @@
 
     for (var exportedReference in importedLibrary.exportedReferences) {
       var reference = exportedReference.reference;
-      var element = elementFactory.elementOfReference(reference)!;
+      var element = elementFactory.elementOfReference2(reference)!;
 
       // Check only accessed elements.
       if (!accessedElements.contains(element)) {
@@ -231,11 +214,10 @@
     }
 
     result ??= accessedElements;
-    importToAccessedElements2[import] = result;
-    return result.map((e) => e.asElement2).nonNulls.toSet();
+    return importToAccessedElements2[import] = result;
   }
 
-  void lookupResult(Element? element) {
+  void lookupResult(Element2? element) {
     if (!active) {
       return;
     }
@@ -244,7 +226,7 @@
       return;
     }
 
-    if (element is MultiplyDefinedElement) {
+    if (element is MultiplyDefinedElement2) {
       return;
     }
 
@@ -255,7 +237,7 @@
     }
   }
 
-  void notifyExtensionUsed(ExtensionElement element) {
+  void notifyExtensionUsed(ExtensionElement2 element) {
     var imports = _elementImports[element];
     if (imports != null) {
       for (var import in imports) {
@@ -282,7 +264,7 @@
       for (var exportedReference in importedLibrary.exportedReferences) {
         var reference = exportedReference.reference;
         if (combinators.allows(reference.name)) {
-          var element = elementFactory.elementOfReference(reference)!;
+          var element = elementFactory.elementOfReference2(reference)!;
           (_elementImports[element] ??= []).add(import);
         }
       }
@@ -292,65 +274,48 @@
 
 /// The scope defined by an instance element.
 class InstanceScope extends EnclosedScope {
-  InstanceScope(super.parent, InstanceElement element) {
-    var augmented = element.augmented;
-    augmented.accessors.forEach(_addPropertyAccessor);
-    augmented.methods.forEach(_addGetter);
+  InstanceScope(super.parent, InstanceElement2 element) {
+    element.getters2.forEach(_addGetter);
+    element.setters2.forEach(_addSetter);
+    element.methods2.forEach(_addGetter);
   }
 }
 
 /// The top-level declarations of the library.
 class LibraryDeclarations with _GettersAndSetters {
-  List<ExtensionElement> extensions = [];
+  List<ExtensionElement2> extensions = [];
 
   LibraryDeclarations(LibraryElementImpl library) {
-    library.units.forEach(_addLibraryFragment);
+    library.getters.forEach(_addGetter);
+    library.enums.forEach(_addGetter);
+    library.extensions.forEach(_addExtension);
+    library.extensionTypes.forEach(_addGetter);
+    library.setters.forEach(_addSetter);
+    library.topLevelFunctions.forEach(_addGetter);
+    library.typeAliases.forEach(_addGetter);
+    library.mixins.forEach(_addGetter);
+    library.classes.forEach(_addGetter);
 
     // Add implicit 'dart:core' declarations.
     if ('${library.source.uri}' == 'dart:core') {
-      _addGetter(DynamicElementImpl.instance);
-      _addGetter(NeverElementImpl.instance);
+      _addGetter(DynamicElementImpl2.instance);
+      _addGetter(NeverElementImpl2.instance);
     }
 
     extensions = extensions.toFixedList();
   }
 
   /// Returns a getter or setter with the [name].
-  Element? withName(String name) {
+  Element2? withName(String name) {
     return _getters[name] ?? _setters[name];
   }
 
-  void _addExtension(ExtensionElement element) {
-    if (element.isAugmentation) {
-      return;
-    }
-
+  void _addExtension(ExtensionElement2 element) {
     _addGetter(element);
     if (!extensions.contains(element)) {
       extensions.add(element);
     }
   }
-
-  void _addLibraryFragment(CompilationUnitElement fragment) {
-    for (var element in fragment.accessors) {
-      if (element.augmentation == null) {
-        _addPropertyAccessor(element);
-      }
-    }
-
-    for (var element in fragment.functions) {
-      if (element.augmentation == null) {
-        _addGetter(element);
-      }
-    }
-
-    fragment.enums.forEach(_addGetter);
-    fragment.extensions.forEach(_addExtension);
-    fragment.extensionTypes.forEach(_addGetter);
-    fragment.typeAliases.forEach(_addGetter);
-    fragment.mixins.forEach(_addGetter);
-    fragment.classes.forEach(_addGetter);
-  }
 }
 
 class LibraryFragmentScope implements Scope {
@@ -358,10 +323,10 @@
   final CompilationUnitElementImpl fragment;
   final PrefixScope noPrefixScope;
 
-  final Map<String, PrefixElementImpl> _prefixElements = {};
+  final Map<String, PrefixElementImpl2> _prefixElements = {};
 
   /// The cached result for [accessibleExtensions].
-  List<ExtensionElement>? _extensions;
+  List<ExtensionElement2>? _extensions;
 
   /// This field is set temporarily while resolving all files of a library.
   /// So, we can track which elements were actually returned, and which imports
@@ -390,8 +355,10 @@
     required this.fragment,
     required this.noPrefixScope,
   }) {
-    for (var prefix in fragment.libraryImportPrefixes) {
-      _prefixElements[prefix.name] = prefix;
+    for (var prefix in fragment.prefixes) {
+      if (prefix.name3 case var name?) {
+        _prefixElements[name] = prefix;
+      }
       prefix.scope = PrefixScope(
         libraryFragment: fragment,
         parent: _getParentPrefixScope(prefix),
@@ -402,7 +369,7 @@
   }
 
   /// The extensions accessible within [fragment].
-  List<ExtensionElement> get accessibleExtensions {
+  List<ExtensionElement2> get accessibleExtensions {
     var libraryDeclarations = fragment.library.libraryDeclarations;
     return _extensions ??= {
       ...libraryDeclarations.extensions,
@@ -456,25 +423,25 @@
 
     // No result.
     return ScopeLookupResultImpl(
-      getter: null,
-      setter: null,
+      getter2: null,
+      setter2: null,
     );
   }
 
   void notifyExtensionUsed(ExtensionElement2 element) {
-    _importsTracking?.notifyExtensionUsed(element.asElement);
+    _importsTracking?.notifyExtensionUsed(element);
   }
 
-  PrefixScope? _getParentPrefixScope(PrefixElementImpl prefix) {
+  PrefixScope? _getParentPrefixScope(PrefixElementImpl2 prefix) {
     var isDeferred = prefix.imports.any((import) {
-      return import.prefix is DeferredImportElementPrefix;
+      return import.prefix2?.isDeferred ?? false;
     });
     if (isDeferred) {
       return null;
     }
 
     for (var scope = parent; scope != null; scope = scope.parent) {
-      var parentPrefix = scope._prefixElements[prefix.name];
+      var parentPrefix = scope._prefixElements[prefix.name3];
       if (parentPrefix != null) {
         return parentPrefix.scope;
       }
@@ -487,15 +454,15 @@
     if (_shouldTryPrefixElement(id)) {
       if (_prefixElements[id] case var prefixElement?) {
         return ScopeLookupResultImpl(
-          getter: prefixElement,
-          setter: null,
+          getter2: prefixElement,
+          setter2: null,
         );
       }
     }
 
     // Try imports of the library fragment.
     var noPrefixResult = noPrefixScope.lookup(id);
-    if (noPrefixResult.getter != null || noPrefixResult.setter != null) {
+    if (noPrefixResult.getter2 != null || noPrefixResult.setter2 != null) {
       return noPrefixResult;
     }
 
@@ -509,8 +476,8 @@
     var librarySetter = libraryDeclarations._setters[id];
     if (libraryGetter != null || librarySetter != null) {
       return ScopeLookupResultImpl(
-        getter: libraryGetter,
-        setter: librarySetter,
+        getter2: libraryGetter,
+        setter2: librarySetter,
       );
     }
     return null;
@@ -528,7 +495,7 @@
 class LocalScope extends EnclosedScope {
   LocalScope(super.parent);
 
-  void add(Element element) {
+  void add(Element2 element) {
     if (!element.isWildcardVariable) {
       _addGetter(element);
     }
@@ -541,12 +508,12 @@
 
   final List<LibraryImportElementImpl> _importElements = [];
 
-  final Map<String, Element> _getters = {};
-  final Map<String, Element> _setters = {};
+  final Map<String, Element2> _getters = {};
+  final Map<String, Element2> _setters = {};
   Set<String>? _settersFromDeprecatedExport;
   Set<String>? _gettersFromDeprecatedExport;
-  final Set<ExtensionElement> _extensions = {};
-  LibraryElement? _deferredLibrary;
+  final Set<ExtensionElement2> _extensions = {};
+  LibraryElement2? _deferredLibrary;
 
   ImportsTrackingOfPrefix? _importsTracking;
 
@@ -554,20 +521,20 @@
     required this.libraryFragment,
     required this.parent,
     required List<LibraryImportElementImpl> libraryImports,
-    required PrefixElement? prefix,
+    required PrefixElement2? prefix,
   }) {
     var elementFactory = libraryElement.session.elementFactory;
     for (var import in libraryImports) {
       var importedUri = import.uri;
       if (importedUri is DirectiveUriWithLibraryImpl &&
-          import.prefix?.element == prefix) {
+          import.prefix2?.element == prefix) {
         _importElements.add(import);
         var importedLibrary = importedUri.library;
         var combinators = import.combinators.build();
         for (var exportedReference in importedLibrary.exportedReferences) {
           var reference = exportedReference.reference;
           if (combinators.allows(reference.name)) {
-            var element = elementFactory.elementOfReference(reference)!;
+            var element = elementFactory.elementOfReference2(reference)!;
             if (_shouldAdd(importedLibrary, element)) {
               _add(
                 element,
@@ -576,8 +543,10 @@
             }
           }
         }
-        if (import.prefix is DeferredImportElementPrefix) {
-          _deferredLibrary ??= importedLibrary;
+        if (import.prefix2 case var importPrefix?) {
+          if (importPrefix.isDeferred) {
+            _deferredLibrary ??= importedLibrary;
+          }
         }
       }
     }
@@ -600,10 +569,11 @@
   @override
   ScopeLookupResult lookup(String id) {
     var deferredLibrary = _deferredLibrary;
-    if (deferredLibrary != null && id == FunctionElement.LOAD_LIBRARY_NAME) {
+    if (deferredLibrary != null &&
+        id == TopLevelFunctionElement.LOAD_LIBRARY_NAME) {
       return ScopeLookupResultImpl(
-        getter: deferredLibrary.loadLibraryFunction,
-        setter: null,
+        getter2: deferredLibrary.loadLibraryFunction2,
+        setter2: null,
       );
     }
 
@@ -613,8 +583,8 @@
       _importsTracking?.lookupResult(getter);
       _importsTracking?.lookupResult(setter);
       return PrefixScopeLookupResult(
-        getter: getter,
-        setter: setter,
+        getter2: getter,
+        setter2: setter,
         getterIsFromDeprecatedExport:
             _gettersFromDeprecatedExport?.contains(id) ?? false,
         setterIsFromDeprecatedExport:
@@ -627,8 +597,8 @@
     }
 
     return ScopeLookupResultImpl(
-      getter: null,
-      setter: null,
+      getter2: null,
+      setter2: null,
     );
   }
 
@@ -637,8 +607,8 @@
     _importsTracking?.notifyPrefixUsedInCommentReference();
   }
 
-  void _add(Element element, bool isFromDeprecatedExport) {
-    if (element is PropertyAccessorElement && element.isSetter) {
+  void _add(Element2 element, bool isFromDeprecatedExport) {
+    if (element is SetterElement) {
       _addTo(
         element,
         isFromDeprecatedExport: isFromDeprecatedExport,
@@ -650,14 +620,14 @@
         isFromDeprecatedExport: isFromDeprecatedExport,
         isSetter: false,
       );
-      if (element is ExtensionElement) {
+      if (element is ExtensionElement2) {
         _extensions.add(element);
       }
     }
   }
 
   void _addTo(
-    Element element, {
+    Element2 element, {
     required bool isFromDeprecatedExport,
     required bool isSetter,
   }) {
@@ -693,7 +663,7 @@
     }
   }
 
-  Element _merge(Element existing, Element other) {
+  Element2 _merge(Element2 existing, Element2 other) {
     if (_isSdkElement(existing)) {
       if (!_isSdkElement(other)) {
         return other;
@@ -704,18 +674,18 @@
       }
     }
 
-    var conflictingElements = <Element>{};
+    var conflictingElements = <Element2>{};
     _addElement(conflictingElements, existing);
     _addElement(conflictingElements, other);
 
-    return MultiplyDefinedElementImpl(
+    return MultiplyDefinedElementImpl2(
       libraryFragment,
-      conflictingElements.first.name!,
+      conflictingElements.first.name3!,
       conflictingElements.toList(),
     );
   }
 
-  bool _shouldAdd(LibraryElementImpl importedLibrary, Element element) {
+  bool _shouldAdd(LibraryElementImpl importedLibrary, Element2 element) {
     // It is an error for the identifier `Record`, denoting the `Record` class
     // from `dart:core`, where that import scope name is only imported from
     // platform libraries, to appear in a library whose language version is
@@ -723,7 +693,7 @@
     // records are released.
     if (!libraryElement.featureSet.isEnabled(Feature.records)) {
       if (importedLibrary.isInSdk &&
-          element is ClassElementImpl &&
+          element is ClassElementImpl2 &&
           element.isDartCoreRecord) {
         return false;
       }
@@ -732,24 +702,24 @@
   }
 
   static void _addElement(
-    Set<Element> conflictingElements,
-    Element element,
+    Set<Element2> conflictingElements,
+    Element2 element,
   ) {
-    if (element is MultiplyDefinedElementImpl) {
-      conflictingElements.addAll(element.conflictingElements);
+    if (element is MultiplyDefinedElementImpl2) {
+      conflictingElements.addAll(element.conflictingElements2);
     } else {
       conflictingElements.add(element);
     }
   }
 
-  static bool _isSdkElement(Element element) {
-    if (element is DynamicElementImpl || element is NeverElementImpl) {
+  static bool _isSdkElement(Element2 element) {
+    if (element is DynamicElementImpl2 || element is NeverElementImpl2) {
       return true;
     }
-    if (element is MultiplyDefinedElement) {
+    if (element is MultiplyDefinedElement2) {
       return false;
     }
-    return element.library!.isInSdk;
+    return element.library2!.isInSdk;
   }
 }
 
@@ -760,8 +730,8 @@
   final int _deprecatedBits;
 
   PrefixScopeLookupResult({
-    required super.getter,
-    required super.setter,
+    required super.getter2,
+    required super.setter2,
     required bool getterIsFromDeprecatedExport,
     required bool setterIsFromDeprecatedExport,
   }) : _deprecatedBits = (getterIsFromDeprecatedExport
@@ -784,28 +754,23 @@
       (_deprecatedBits & setterIsFromDeprecatedExportBit) != 0;
 }
 
-class ScopeLookupResultImpl implements ScopeLookupResult {
+class ScopeLookupResultImpl extends ScopeLookupResult {
   @override
-  final Element? getter;
+  final Element2? getter2;
 
   @override
-  final Element? setter;
+  final Element2? setter2;
 
   ScopeLookupResultImpl({
-    required this.getter,
-    required this.setter,
+    required this.getter2,
+    required this.setter2,
   });
-
-  @override
-  Element2? get getter2 => getter?.asElement2;
-  @override
-  Element2? get setter2 => setter?.asElement2;
 }
 
 class TypeParameterScope extends EnclosedScope {
   TypeParameterScope(
     super.parent,
-    List<TypeParameterElement> elements,
+    List<TypeParameterElement2> elements,
   ) {
     for (var element in elements) {
       if (!element.isWildcardVariable) {
@@ -816,26 +781,18 @@
 }
 
 mixin _GettersAndSetters {
-  final Map<String, Element> _getters = {};
-  final Map<String, Element> _setters = {};
+  final Map<String, Element2> _getters = {};
+  final Map<String, Element2> _setters = {};
 
-  void _addGetter(Element element) {
-    var id = element.name;
+  void _addGetter(Element2 element) {
+    var id = element.lookupName;
     if (id != null) {
       _getters[id] ??= element;
     }
   }
 
-  void _addPropertyAccessor(PropertyAccessorElement element) {
-    if (element.isGetter) {
-      _addGetter(element);
-    } else {
-      _addSetter(element);
-    }
-  }
-
-  void _addSetter(Element element) {
-    var name = element.name;
+  void _addSetter(Element2 element) {
+    var name = element.lookupName;
     if (name != null && name.endsWith('=')) {
       var id = considerCanonicalizeString(name.substring(0, name.length - 1));
       _setters[id] ??= element;
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 9400593..647f2c4 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -675,7 +675,7 @@
     var variablesMap = _patternVariables.casePatternFinish();
     node.variables = variablesMap.values
         .whereType<BindPatternVariableElementImpl2>()
-        .map((e) => e.asElement as BindPatternVariableElementImpl)
+        .map((e) => e.asElement)
         .toList();
   }
 
@@ -1154,7 +1154,7 @@
     var variablesMap = _patternVariables.casePatternFinish();
     node.elements = variablesMap.values
         .whereType<BindPatternVariableElementImpl2>()
-        .map((e) => e.asElement as BindPatternVariableElementImpl)
+        .map((e) => e.asElement)
         .toList();
   }
 
@@ -1571,7 +1571,7 @@
 
   void _define(Element element) {
     if (_nameScope case LocalScope nameScope) {
-      nameScope.add(element);
+      nameScope.add(element.asElement2!);
     }
   }
 
diff --git a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
index c1380ea..0d046cf 100644
--- a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
+++ b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
@@ -20,6 +20,7 @@
 import 'package:analyzer/src/diagnostic/diagnostic_factory.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/error_verifier.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
 
 class DuplicateDefinitionVerifier {
   final LibraryElementImpl _currentLibrary;
@@ -170,7 +171,7 @@
           _diagnosticFactory.duplicateDefinition(
             CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER,
             importPrefix,
-            existing,
+            existing.asElement!,
             [name],
           ),
         );
diff --git a/pkg/analyzer/lib/src/error/imports_verifier.dart b/pkg/analyzer/lib/src/error/imports_verifier.dart
index 69daba3..d4b49ad 100644
--- a/pkg/analyzer/lib/src/error/imports_verifier.dart
+++ b/pkg/analyzer/lib/src/error/imports_verifier.dart
@@ -178,6 +178,9 @@
     for (var firstDirective in usedImports) {
       var firstElement = firstDirective.element!;
       var tracker = importsTracking.trackerOf(firstElement);
+      if (tracker == null) {
+        continue;
+      }
 
       // Ignore unresolved imports.
       var importedLibrary = firstElement.importedLibrary;
@@ -241,8 +244,12 @@
     for (var importDirective in fileAnalysis.unit.directives) {
       if (importDirective is ImportDirectiveImpl) {
         var importElement = importDirective.element!;
-        var prefixElement = importElement.prefix?.element;
-        var tracking = importsTracking.map[prefixElement]!;
+        var prefixElement = importElement.prefix2?.element;
+
+        var tracking = importsTracking.map[prefixElement];
+        if (tracking == null) {
+          continue;
+        }
 
         // Ignore the group of imports with a prefix in a comment reference.
         if (tracking.hasPrefixUsedInCommentReference) {
@@ -260,8 +267,7 @@
             continue;
           }
 
-          var isUsed =
-              tracking.importToUsedElements2.containsKey(importElement);
+          var isUsed = tracking.importToUsedElements.containsKey(importElement);
           if (!isUsed) {
             _unusedImports.add(importDirective);
             errorReporter.atNode(
@@ -310,7 +316,7 @@
           for (var identifier in combinator.shownNames) {
             var element = identifier.element;
             if (element != null) {
-              var importElements = importsTracking.elementsOf2(importElement);
+              var importElements = importsTracking.elementsOf(importElement);
 
               var isUsed = importElements.contains(element);
               if (element is PropertyInducingElement2) {
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 0cf11b9..147a842 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -4564,7 +4564,7 @@
   ScopeResolverVisitor(
     this.errorReporter, {
     required this.nameScope,
-    List<LibraryElement> docImportLibraries = const [],
+    List<LibraryElement2> docImportLibraries = const [],
   }) : _docImportScope =
             DocumentationCommentScope(nameScope, docImportLibraries);
 
@@ -4610,10 +4610,10 @@
       Scope outerScope = nameScope;
       try {
         nameScope = LocalScope(nameScope);
-        _define(exception.declaredElement!);
+        _define(exception.declaredElement!.asElement2!);
         var stackTrace = node.stackTraceParameter;
         if (stackTrace != null) {
-          _define(stackTrace.declaredElement!);
+          _define(stackTrace.declaredElement!.asElement2!);
         }
         super.visitCatchClause(node);
       } finally {
@@ -4633,7 +4633,7 @@
 
       nameScope = TypeParameterScope(
         nameScope,
-        element.typeParameters,
+        element.typeParameters.map((e) => e.asElement2).toList(),
       );
       node.nameScope = nameScope;
       node.typeParameters?.accept(this);
@@ -4642,7 +4642,7 @@
       node.implementsClause?.accept(this);
       node.nativeClause?.accept(this);
 
-      nameScope = InstanceScope(nameScope, element);
+      nameScope = InstanceScope(nameScope, element.asElement2);
       _visitDocumentationComment(node.documentationComment);
       node.members.accept(this);
     } finally {
@@ -4657,8 +4657,11 @@
     try {
       ClassElement element = node.declaredElement!;
       nameScope = InstanceScope(
-        TypeParameterScope(nameScope, element.typeParameters),
-        element,
+        TypeParameterScope(
+          nameScope,
+          element.typeParameters.map((e) => e.asElement2).toList(),
+        ),
+        element.asElement2,
       );
       _visitDocumentationComment(node.documentationComment);
       node.typeParameters?.accept(this);
@@ -4690,7 +4693,7 @@
       try {
         nameScope = ConstructorInitializerScope(
           nameScope,
-          element,
+          element.asElement2,
         );
         node.initializers.accept(this);
         _visitDocumentationComment(node.documentationComment);
@@ -4702,7 +4705,7 @@
 
       nameScope = FormalParameterScope(
         nameScope,
-        element.parameters,
+        element.parameters.map((e) => e.asElement2).toList(),
       );
       node.body.accept(this);
     } finally {
@@ -4717,7 +4720,7 @@
 
   @override
   void visitDeclaredIdentifier(DeclaredIdentifier node) {
-    _define(node.declaredElement!);
+    _define(node.declaredElement!.asElement2!);
     super.visitDeclaredIdentifier(node);
   }
 
@@ -4750,14 +4753,14 @@
 
       nameScope = TypeParameterScope(
         nameScope,
-        element.typeParameters,
+        element.typeParameters.map((e) => e.asElement2).toList(),
       );
       node.nameScope = nameScope;
       node.typeParameters?.accept(this);
       node.withClause?.accept(this);
       node.implementsClause?.accept(this);
 
-      nameScope = InstanceScope(nameScope, element);
+      nameScope = InstanceScope(nameScope, element.asElement2);
       _visitDocumentationComment(node.documentationComment);
       node.constants.accept(this);
       node.members.accept(this);
@@ -4781,13 +4784,13 @@
 
       nameScope = TypeParameterScope(
         nameScope,
-        element.typeParameters,
+        element.typeParameters.map((e) => e.asElement2).toList(),
       );
       node.nameScope = nameScope;
       node.typeParameters?.accept(this);
       node.onClause?.accept(this);
 
-      nameScope = ExtensionScope(nameScope, element);
+      nameScope = ExtensionScope(nameScope, element.asElement2);
       _visitDocumentationComment(node.documentationComment);
       node.members.accept(this);
     } finally {
@@ -4806,14 +4809,14 @@
 
       nameScope = TypeParameterScope(
         nameScope,
-        element.typeParameters,
+        element.typeParameters.map((e) => e.asElement2).toList(),
       );
       node.nameScope = nameScope;
       node.typeParameters?.accept(this);
       node.representation.accept(this);
       node.implementsClause?.accept(this);
 
-      nameScope = InstanceScope(nameScope, element);
+      nameScope = InstanceScope(nameScope, element.asElement2);
       _visitDocumentationComment(node.documentationComment);
       node.members.accept(this);
     } finally {
@@ -4845,7 +4848,7 @@
     node.iterable.accept(this);
 
     for (var variable in node.variables) {
-      _define(variable);
+      _define(variable.asElement2);
     }
 
     node.pattern.accept(this);
@@ -4875,19 +4878,19 @@
     if (parent is FunctionExpression) {
       nameScope = FormalParameterScope(
         nameScope,
-        parent.declaredElement!.parameters,
+        parent.declaredElement!.parameters.map((e) => e.asElement2).toList(),
       );
     } else if (parent is FunctionTypeAlias) {
       var aliasedElement = parent.declaredElement!.aliasedElement;
       var functionElement = aliasedElement as GenericFunctionTypeElement;
       nameScope = FormalParameterScope(
         nameScope,
-        functionElement.parameters,
+        functionElement.parameters.map((e) => e.asElement2).toList(),
       );
     } else if (parent is MethodDeclaration) {
       nameScope = FormalParameterScope(
         nameScope,
-        parent.declaredElement!.parameters,
+        parent.declaredElement!.parameters.map((e) => e.asElement2).toList(),
       );
     }
   }
@@ -4921,7 +4924,7 @@
       var element = node.declaredElement!;
       nameScope = TypeParameterScope(
         nameScope,
-        element.typeParameters,
+        element.typeParameters.map((e) => e.asElement2).toList(),
       );
       node.nameScope = nameScope;
       node.returnType?.accept(this);
@@ -4951,8 +4954,11 @@
 
       ExecutableElement element = node.declaredElement!;
       nameScope = FormalParameterScope(
-        TypeParameterScope(nameScope, element.typeParameters),
-        element.parameters,
+        TypeParameterScope(
+          nameScope,
+          element.typeParameters.map((e) => e.asElement2).toList(),
+        ),
+        element.parameters.map((e) => e.asElement2).toList(),
       );
       super.visitFunctionExpression(node);
     } finally {
@@ -4967,7 +4973,10 @@
     Scope outerScope = nameScope;
     try {
       var element = node.declaredElement!;
-      nameScope = TypeParameterScope(nameScope, element.typeParameters);
+      nameScope = TypeParameterScope(
+        nameScope,
+        element.typeParameters.map((e) => e.asElement2).toList(),
+      );
       node.returnType?.accept(this);
       node.typeParameters?.accept(this);
       node.parameters.accept(this);
@@ -4988,7 +4997,7 @@
       ParameterElement element = node.declaredElement!;
       nameScope = TypeParameterScope(
         nameScope,
-        element.typeParameters,
+        element.typeParameters.map((e) => e.asElement2).toList(),
       );
       _visitDocumentationComment(node.documentationComment);
       node.returnType?.accept(this);
@@ -5012,7 +5021,10 @@
     Scope outerScope = nameScope;
     try {
       GenericFunctionTypeElement element = node.declaredElement!;
-      nameScope = TypeParameterScope(nameScope, element.typeParameters);
+      nameScope = TypeParameterScope(
+        nameScope,
+        element.typeParameters.map((e) => e.asElement2).toList(),
+      );
       node.nameScope = nameScope;
       super.visitGenericFunctionType(node);
     } finally {
@@ -5026,7 +5038,10 @@
     Scope outerScope = nameScope;
     try {
       var element = node.declaredElement as TypeAliasElement;
-      nameScope = TypeParameterScope(nameScope, element.typeParameters);
+      nameScope = TypeParameterScope(
+        nameScope,
+        element.typeParameters.map((e) => e.asElement2).toList(),
+      );
       node.nameScope = nameScope;
       node.typeParameters?.accept(this);
       node.type.accept(this);
@@ -5034,8 +5049,12 @@
       var aliasedElement = element.aliasedElement;
       if (aliasedElement is GenericFunctionTypeElement) {
         nameScope = FormalParameterScope(
-            TypeParameterScope(nameScope, aliasedElement.typeParameters),
-            aliasedElement.parameters);
+          TypeParameterScope(
+            nameScope,
+            aliasedElement.typeParameters.map((e) => e.asElement2).toList(),
+          ),
+          aliasedElement.parameters.map((e) => e.asElement2).toList(),
+        );
       }
       _visitDocumentationComment(node.documentationComment);
     } finally {
@@ -5047,7 +5066,7 @@
   void visitGuardedPattern(covariant GuardedPatternImpl node) {
     var patternVariables = node.variables.values.toList();
     for (var variable in patternVariables) {
-      _define(variable.asElement!);
+      _define(variable);
     }
 
     node.pattern.accept(this);
@@ -5112,7 +5131,7 @@
       var element = node.declaredElement!;
       nameScope = TypeParameterScope(
         nameScope,
-        element.typeParameters,
+        element.typeParameters.map((e) => e.asElement2).toList(),
       );
       node.nameScope = nameScope;
       node.returnType?.accept(this);
@@ -5148,13 +5167,16 @@
       var element = node.declaredElement!;
       node.metadata.accept(this);
 
-      nameScope = TypeParameterScope(nameScope, element.typeParameters);
+      nameScope = TypeParameterScope(
+        nameScope,
+        element.typeParameters.map((e) => e.asElement2).toList(),
+      );
       node.nameScope = nameScope;
       node.typeParameters?.accept(this);
       node.onClause?.accept(this);
       node.implementsClause?.accept(this);
 
-      nameScope = InstanceScope(nameScope, element);
+      nameScope = InstanceScope(nameScope, element.asElement2);
       _visitDocumentationComment(node.documentationComment);
       node.members.accept(this);
     } finally {
@@ -5175,7 +5197,7 @@
     covariant PatternVariableDeclarationImpl node,
   ) {
     for (var variable in node.elements) {
-      _define(variable);
+      _define(variable.asElement2);
     }
 
     super.visitPatternVariableDeclaration(node);
@@ -5269,7 +5291,7 @@
         var guardedPattern = case_.guardedPattern;
         var variables = guardedPattern.variables;
         for (var variable in variables.values) {
-          _define(variable.asElement!);
+          _define(variable);
         }
         case_.accept(this);
       });
@@ -5307,7 +5329,7 @@
         var lastMember = group.members.last;
         _withDeclaredLocals(lastMember, lastMember.statements, () {
           for (var variable in group.variables.values) {
-            _define(variable.asElement!);
+            _define(variable);
           }
           lastMember.statements.accept(this);
         });
@@ -5331,7 +5353,7 @@
     super.visitVariableDeclaration(node);
 
     if (node.parent!.parent is ForParts) {
-      _define(node.declaredElement!);
+      _define(node.declaredElement!.asElement2!);
     }
   }
 
@@ -5361,7 +5383,7 @@
     return outerScope;
   }
 
-  void _define(Element element) {
+  void _define(Element2 element) {
     (nameScope as LocalScope).add(element);
   }
 
@@ -5490,7 +5512,7 @@
       var enclosedScope = LocalScope(nameScope);
       for (var statement in BlockScope.elementsInStatements(statements)) {
         if (!statement.isWildcardFunction) {
-          enclosedScope.add(statement);
+          enclosedScope.add(statement.asElement2!);
         }
       }
 
diff --git a/pkg/analyzer/lib/src/summary2/constructor_initializer_resolver.dart b/pkg/analyzer/lib/src/summary2/constructor_initializer_resolver.dart
index 54f5c68..0085189 100644
--- a/pkg/analyzer/lib/src/summary2/constructor_initializer_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/constructor_initializer_resolver.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/src/summary2/library_builder.dart';
 import 'package:analyzer/src/summary2/link.dart';
 import 'package:analyzer/src/summary2/linking_node_scope.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
 
 class ConstructorInitializerResolver {
   final Linker _linker;
@@ -51,7 +52,7 @@
     var functionScope = LinkingNodeContext.get(node).scope;
     var initializerScope = ConstructorInitializerScope(
       functionScope,
-      element,
+      element.asElement2,
     );
 
     var analysisOptions = _libraryBuilder.kind.file.analysisOptions;
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index 1e2bb09..c83c051 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -7,6 +7,7 @@
 import 'dart:collection';
 
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/element/element.dart';
@@ -15,6 +16,7 @@
 import 'package:analyzer/src/summary2/bundle_reader.dart';
 import 'package:analyzer/src/summary2/export.dart';
 import 'package:analyzer/src/summary2/reference.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
 import 'package:analyzer/src/utilities/uri_cache.dart';
 import 'package:meta/meta.dart';
 
@@ -204,6 +206,11 @@
     return element;
   }
 
+  // TODO(scheglov): Why would this method return `null`?
+  Element2? elementOfReference2(Reference reference) {
+    return elementOfReference(reference)?.asElement2;
+  }
+
   bool hasLibrary(Uri uri) {
     // We already have the element, linked or read.
     if (rootReference['$uri']?.element is LibraryElementImpl) {
diff --git a/pkg/analyzer/lib/src/summary2/reference_resolver.dart b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
index 5a07301..980aee2 100644
--- a/pkg/analyzer/lib/src/summary2/reference_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
@@ -20,6 +20,7 @@
 import 'package:analyzer/src/summary2/named_type_builder.dart';
 import 'package:analyzer/src/summary2/record_type_builder.dart';
 import 'package:analyzer/src/summary2/types_builder.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
 
 /// Recursive visitor of LinkedNodes that resolves explicit type annotations
 /// in outlines.  This includes resolving element references in identifiers
@@ -75,7 +76,10 @@
 
     var element = node.declaredElement as ClassElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.metadata.accept(this);
     node.typeParameters?.accept(this);
@@ -83,7 +87,7 @@
     node.withClause?.accept(this);
     node.implementsClause?.accept(this);
 
-    scope = InstanceScope(scope, element);
+    scope = InstanceScope(scope, element.asElement2);
     LinkingNodeContext(node, scope);
 
     node.members.accept(this);
@@ -98,7 +102,10 @@
 
     var element = node.declaredElement as ClassElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
     LinkingNodeContext(node, scope);
 
     node.metadata.accept(this);
@@ -123,7 +130,10 @@
 
     var element = node.declaredElement as ConstructorElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
     LinkingNodeContext(node, scope);
 
     node.metadata.accept(this);
@@ -143,14 +153,17 @@
 
     var element = node.declaredElement as EnumElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.metadata.accept(this);
     node.typeParameters?.accept(this);
     node.implementsClause?.accept(this);
     node.withClause?.accept(this);
 
-    scope = InstanceScope(scope, element);
+    scope = InstanceScope(scope, element.asElement2);
     LinkingNodeContext(node, scope);
 
     node.members.accept(this);
@@ -173,13 +186,16 @@
 
     var element = node.declaredElement as ExtensionElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.metadata.accept(this);
     node.typeParameters?.accept(this);
     node.onClause?.accept(this);
 
-    scope = ExtensionScope(scope, element);
+    scope = ExtensionScope(scope, element.asElement2);
     LinkingNodeContext(node, scope);
 
     node.members.accept(this);
@@ -199,14 +215,17 @@
 
     var element = node.declaredElement as ExtensionTypeElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.metadata.accept(this);
     node.typeParameters?.accept(this);
     node.representation.accept(this);
     node.implementsClause?.accept(this);
 
-    scope = InstanceScope(scope, element);
+    scope = InstanceScope(scope, element.asElement2);
     LinkingNodeContext(node, scope);
     LinkingNodeContext(node.representation, scope);
 
@@ -228,7 +247,10 @@
 
     var element = node.declaredElement as FieldFormalParameterElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.type?.accept(this);
     node.typeParameters?.accept(this);
@@ -249,7 +271,10 @@
 
     var element = node.declaredElement as ExecutableElementImpl;
 
-    scope = TypeParameterScope(outerScope, element.typeParameters);
+    scope = TypeParameterScope(
+      outerScope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
     LinkingNodeContext(node, scope);
 
     node.metadata.accept(this);
@@ -272,7 +297,10 @@
 
     var element = node.declaredElement as TypeAliasElementImpl;
 
-    scope = TypeParameterScope(outerScope, element.typeParameters);
+    scope = TypeParameterScope(
+      outerScope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.returnType?.accept(this);
     node.typeParameters?.accept(this);
@@ -289,7 +317,10 @@
 
     var element = node.declaredElement as ParameterElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.returnType?.accept(this);
     node.typeParameters?.accept(this);
@@ -305,7 +336,10 @@
     var outerScope = scope;
 
     var element = node.declaredElement as GenericFunctionTypeElementImpl;
-    scope = TypeParameterScope(outerScope, element.typeParameters);
+    scope = TypeParameterScope(
+      outerScope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.returnType?.accept(this);
     node.typeParameters?.accept(this);
@@ -326,7 +360,10 @@
 
     var element = node.declaredElement as TypeAliasElementImpl;
 
-    scope = TypeParameterScope(outerScope, element.typeParameters);
+    scope = TypeParameterScope(
+      outerScope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.metadata.accept(this);
     node.typeParameters?.accept(this);
@@ -354,7 +391,10 @@
 
     var element = node.declaredElement as ExecutableElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
     LinkingNodeContext(node, scope);
 
     node.metadata.accept(this);
@@ -372,14 +412,17 @@
 
     var element = node.declaredElement as MixinElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.metadata.accept(this);
     node.typeParameters?.accept(this);
     node.onClause?.accept(this);
     node.implementsClause?.accept(this);
 
-    scope = InstanceScope(scope, element);
+    scope = InstanceScope(scope, element.asElement2);
     LinkingNodeContext(node, scope);
 
     node.members.accept(this);
@@ -490,7 +533,10 @@
 
     var element = node.declaredElement as SuperFormalParameterElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.type?.accept(this);
     node.typeParameters?.accept(this);
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart
index 3367048..aa81e91 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/element.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -14,6 +14,20 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:meta/meta.dart';
 
+extension BindPatternVariableElementImpl2Extension
+    on BindPatternVariableElementImpl2 {
+  BindPatternVariableElementImpl get asElement {
+    return firstFragment;
+  }
+}
+
+extension BindPatternVariableElementImplExtension
+    on BindPatternVariableElementImpl {
+  BindPatternVariableElementImpl2 get asElement2 {
+    return element;
+  }
+}
+
 extension ClassElement2Extension on ClassElement2 {
   ClassElement get asElement {
     return firstFragment as ClassElement;
@@ -146,6 +160,8 @@
     switch (self) {
       case null:
         return null;
+      case BindPatternVariableElementImpl2 element2:
+        return element2.asElement;
       case ConstructorElementImpl2 element2:
         return element2.asElement;
       case DynamicElementImpl2():
@@ -511,6 +527,12 @@
   }
 }
 
+extension MixinElementImplExtension on MixinElementImpl {
+  MixinElementImpl2 get asElement2 {
+    return element;
+  }
+}
+
 extension ParameterElementExtension on ParameterElement {
   FormalParameterElementMixin get asElement2 {
     return switch (this) {