Elements. Migrate lib/src/model/model_element.dart (#3988)

diff --git a/lib/src/element_type.dart b/lib/src/element_type.dart
index 41b62fb..a7eb044 100644
--- a/lib/src/element_type.dart
+++ b/lib/src/element_type.dart
@@ -214,7 +214,7 @@
   bool get isTypedef => true;
 
   late final ModelElement aliasElement =
-      ModelElement.forElement2(typeAliasElement2, packageGraph);
+      ModelElement.forElement(typeAliasElement2, packageGraph);
 
   late final List<ElementType> aliasArguments = type.alias!.typeArguments
       .map((f) => getTypeFor(f, library))
@@ -322,7 +322,7 @@
   @internal
   @override
   CommentReferable get definingCommentReferable =>
-      ModelElement.forElement2(modelElement.element2, packageGraph);
+      ModelElement.forElement(modelElement.element2, packageGraph);
 }
 
 /// Any callable [ElementType] will mix-in this class, whether anonymous or not,
diff --git a/lib/src/generator/templates.runtime_renderers.dart b/lib/src/generator/templates.runtime_renderers.dart
index fcf499f..803a73f 100644
--- a/lib/src/generator/templates.runtime_renderers.dart
+++ b/lib/src/generator/templates.runtime_renderers.dart
@@ -3505,6 +3505,34 @@
                   );
                 },
               ),
+              'element2': Property(
+                getValue: (CT_ c) => c.element2,
+                renderVariable:
+                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
+                        self.renderSimpleVariable(
+                          c,
+                          remainingNames,
+                          'ConstructorElement2',
+                        ),
+
+                isNullValue: (CT_ c) => false,
+
+                renderValue: (
+                  CT_ c,
+                  RendererBase<CT_> r,
+                  List<MustachioNode> ast,
+                  StringSink sink,
+                ) {
+                  renderSimple(
+                    c.element2,
+                    ast,
+                    r.template,
+                    sink,
+                    parent: r,
+                    getters: _invisibleGetters['ConstructorElement2']!,
+                  );
+                },
+              ),
               'enclosingElement': Property(
                 getValue: (CT_ c) => c.enclosingElement,
                 renderVariable: (
@@ -13345,34 +13373,6 @@
                   );
                 },
               ),
-              'compilationUnitElement': Property(
-                getValue: (CT_ c) => c.compilationUnitElement,
-                renderVariable:
-                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
-                        self.renderSimpleVariable(
-                          c,
-                          remainingNames,
-                          'CompilationUnitElement',
-                        ),
-
-                isNullValue: (CT_ c) => false,
-
-                renderValue: (
-                  CT_ c,
-                  RendererBase<CT_> r,
-                  List<MustachioNode> ast,
-                  StringSink sink,
-                ) {
-                  renderSimple(
-                    c.compilationUnitElement,
-                    ast,
-                    r.template,
-                    sink,
-                    parent: r,
-                    getters: _invisibleGetters['CompilationUnitElement']!,
-                  );
-                },
-              ),
               'constants': Property(
                 getValue: (CT_ c) => c.constants,
                 renderVariable:
@@ -14212,6 +14212,34 @@
                   );
                 },
               ),
+              'unitElement': Property(
+                getValue: (CT_ c) => c.unitElement,
+                renderVariable:
+                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
+                        self.renderSimpleVariable(
+                          c,
+                          remainingNames,
+                          'LibraryFragment',
+                        ),
+
+                isNullValue: (CT_ c) => false,
+
+                renderValue: (
+                  CT_ c,
+                  RendererBase<CT_> r,
+                  List<MustachioNode> ast,
+                  StringSink sink,
+                ) {
+                  renderSimple(
+                    c.unitElement,
+                    ast,
+                    r.template,
+                    sink,
+                    parent: r,
+                    getters: _invisibleGetters['LibraryFragment']!,
+                  );
+                },
+              ),
             },
           )
           as Map<String, Property<CT_>>;
@@ -14411,7 +14439,7 @@
   }
 }
 
-String renderLibrary(LibraryTemplateData context, Template template) {
+String renderLibraryRedirect(LibraryTemplateData context, Template template) {
   var buffer = StringBuffer();
   _render_LibraryTemplateData(context, template.ast, template, buffer);
   return buffer.toString();
@@ -14657,7 +14685,7 @@
   }
 }
 
-String renderLibraryRedirect(LibraryTemplateData context, Template template) {
+String renderLibrary(LibraryTemplateData context, Template template) {
   var buffer = StringBuffer();
   _render_LibraryTemplateData(context, template.ast, template, buffer);
   return buffer.toString();
@@ -16856,34 +16884,6 @@
                   );
                 },
               ),
-              'compilationUnitElement': Property(
-                getValue: (CT_ c) => c.compilationUnitElement,
-                renderVariable:
-                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
-                        self.renderSimpleVariable(
-                          c,
-                          remainingNames,
-                          'CompilationUnitElement',
-                        ),
-
-                isNullValue: (CT_ c) => false,
-
-                renderValue: (
-                  CT_ c,
-                  RendererBase<CT_> r,
-                  List<MustachioNode> ast,
-                  StringSink sink,
-                ) {
-                  renderSimple(
-                    c.compilationUnitElement,
-                    ast,
-                    r.template,
-                    sink,
-                    parent: r,
-                    getters: _invisibleGetters['CompilationUnitElement']!,
-                  );
-                },
-              ),
               'config': Property(
                 getValue: (CT_ c) => c.config,
                 renderVariable:
@@ -18013,6 +18013,34 @@
                   );
                 },
               ),
+              'unitElement': Property(
+                getValue: (CT_ c) => c.unitElement,
+                renderVariable:
+                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
+                        self.renderSimpleVariable(
+                          c,
+                          remainingNames,
+                          'LibraryFragment',
+                        ),
+
+                isNullValue: (CT_ c) => false,
+
+                renderValue: (
+                  CT_ c,
+                  RendererBase<CT_> r,
+                  List<MustachioNode> ast,
+                  StringSink sink,
+                ) {
+                  renderSimple(
+                    c.unitElement,
+                    ast,
+                    r.template,
+                    sink,
+                    parent: r,
+                    getters: _invisibleGetters['LibraryFragment']!,
+                  );
+                },
+              ),
             },
           )
           as Map<String, Property<CT_>>;
@@ -20353,7 +20381,7 @@
   }
 }
 
-String renderError(PackageTemplateData context, Template template) {
+String renderIndex(PackageTemplateData context, Template template) {
   var buffer = StringBuffer();
   _render_PackageTemplateData(context, template.ast, template, buffer);
   return buffer.toString();
@@ -20710,13 +20738,13 @@
   }
 }
 
-String renderSearchPage(PackageTemplateData context, Template template) {
+String renderError(PackageTemplateData context, Template template) {
   var buffer = StringBuffer();
   _render_PackageTemplateData(context, template.ast, template, buffer);
   return buffer.toString();
 }
 
-String renderIndex(PackageTemplateData context, Template template) {
+String renderSearchPage(PackageTemplateData context, Template template) {
   var buffer = StringBuffer();
   _render_PackageTemplateData(context, template.ast, template, buffer);
   return buffer.toString();
@@ -26196,28 +26224,6 @@
     'referenceParents',
     'scope',
   },
-  'CompilationUnitElement': {
-    'accessibleExtensions',
-    'accessors',
-    'classes',
-    'enclosingElement3',
-    'enums',
-    'extensionTypes',
-    'extensions',
-    'functions',
-    'hashCode',
-    'libraryExports',
-    'libraryImportPrefixes',
-    'libraryImports',
-    'lineInfo',
-    'mixins',
-    'parts',
-    'runtimeType',
-    'scope',
-    'session',
-    'topLevelVariables',
-    'typeAliases',
-  },
   'Constructable': {
     'constructors',
     'extraReferenceChildren',
@@ -26243,6 +26249,22 @@
     'runtimeType',
     'superConstructor',
   },
+  'ConstructorElement2': {
+    'baseElement',
+    'enclosingElement2',
+    'firstFragment',
+    'fragments',
+    'hashCode',
+    'isConst',
+    'isDefaultConstructor',
+    'isFactory',
+    'isGenerative',
+    'name3',
+    'redirectedConstructor2',
+    'returnType',
+    'runtimeType',
+    'superConstructor2',
+  },
   'ContainerModifier': {
     'displayName',
     'hashCode',
@@ -26761,6 +26783,33 @@
     'typeSystem',
     'uri',
   },
+  'LibraryFragment': {
+    'accessibleExtensions2',
+    'classes2',
+    'element',
+    'enclosingFragment',
+    'enums2',
+    'extensionTypes2',
+    'extensions2',
+    'functions2',
+    'getters',
+    'hashCode',
+    'importedLibraries2',
+    'libraryExports2',
+    'libraryImports2',
+    'lineInfo',
+    'mixins2',
+    'nextFragment',
+    'partIncludes',
+    'prefixes',
+    'previousFragment',
+    'runtimeType',
+    'scope',
+    'setters',
+    'source',
+    'topLevelVariables2',
+    'typeAliases2',
+  },
   'List': {'hashCode', 'length', 'reversed', 'runtimeType'},
   'Locatable': {
     'documentationFrom',
diff --git a/lib/src/model/canonicalization.dart b/lib/src/model/canonicalization.dart
index a3e4a3e..ac2605c 100644
--- a/lib/src/model/canonicalization.dart
+++ b/lib/src/model/canonicalization.dart
@@ -58,7 +58,7 @@
   }
 
   var topLevelModelElement =
-      ModelElement.forElement2(topLevelElement, modelElement.packageGraph);
+      ModelElement.forElement(topLevelElement, modelElement.packageGraph);
 
   return _Canonicalization(topLevelModelElement)
       .canonicalLibraryCandidate(candidateLibraries);
diff --git a/lib/src/model/constructor.dart b/lib/src/model/constructor.dart
index bb3cc96..343daba 100644
--- a/lib/src/model/constructor.dart
+++ b/lib/src/model/constructor.dart
@@ -5,7 +5,10 @@
 // ignore_for_file: analyzer_use_new_elements
 
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/source/line_info.dart';
+// ignore: implementation_imports
+import 'package:analyzer/src/utilities/extensions/element.dart';
 import 'package:dartdoc/src/element_type.dart';
 import 'package:dartdoc/src/model/comment_referable.dart';
 import 'package:dartdoc/src/model/kind.dart';
@@ -14,9 +17,12 @@
 
 class Constructor extends ModelElement with ContainerMember, TypeParameters {
   @override
-  final ConstructorElement element;
+   ConstructorElement get element => element2.asElement;
 
-  Constructor(this.element, super.library, super.packageGraph);
+  @override
+  final ConstructorElement2 element2;
+
+  Constructor(this.element2, super.library, super.packageGraph);
 
   @override
   CharacterLocation? get characterLocation {
diff --git a/lib/src/model/extension.dart b/lib/src/model/extension.dart
index a8937fe..7dcff42 100644
--- a/lib/src/model/extension.dart
+++ b/lib/src/model/extension.dart
@@ -110,12 +110,12 @@
     ContainerAccessor? getter, setter;
     final fieldGetter = field.getter2;
     if (fieldGetter != null) {
-      getter = ModelElement.for2_(fieldGetter, library, packageGraph,
+      getter = ModelElement.for_(fieldGetter, library, packageGraph,
           enclosingContainer: this) as ContainerAccessor;
     }
     final fieldSetter = field.setter2;
     if (fieldSetter != null) {
-      setter = ModelElement.for2_(fieldSetter, library, packageGraph,
+      setter = ModelElement.for_(fieldSetter, library, packageGraph,
           enclosingContainer: this) as ContainerAccessor;
     }
     return getModelForPropertyInducingElement(field.asElement, library,
diff --git a/lib/src/model/extension_type.dart b/lib/src/model/extension_type.dart
index 8069823..7a5d54b 100644
--- a/lib/src/model/extension_type.dart
+++ b/lib/src/model/extension_type.dart
@@ -16,16 +16,15 @@
 
 class ExtensionType extends InheritingContainer with Constructable {
   @override
-  final ExtensionTypeElement element;
+  ExtensionTypeElement get element => element2.asElement;
 
   @override
-  ExtensionTypeElement2 get element2 =>
-      element.asElement2 as ExtensionTypeElement2;
+  final ExtensionTypeElement2  element2;
 
   late final ElementType representationType =
       getTypeFor(element.representation.type, library);
 
-  ExtensionType(this.element, super.library, super.packageGraph);
+  ExtensionType(this.element2, super.library, super.packageGraph);
 
   @override
   Library get enclosingElement => library;
diff --git a/lib/src/model/field.dart b/lib/src/model/field.dart
index b5cdb4d..21d6a03 100644
--- a/lib/src/model/field.dart
+++ b/lib/src/model/field.dart
@@ -42,7 +42,7 @@
     this.setter,
   )   : isInherited = false,
         enclosingElement =
-            ModelElement.for_(element.enclosingElement3, library, packageGraph)
+            ModelElement.for_(element.asElement2.enclosingElement2, library, packageGraph)
                 as Container,
         assert(getter != null || setter != null) {
     getter?.enclosingCombo = this;
@@ -58,7 +58,7 @@
   )   : element = element2.asElement as FieldElement,
         isInherited = false,
         enclosingElement =
-            ModelElement.for2_(element2.enclosingElement2!, library, packageGraph)
+            ModelElement.for_(element2.enclosingElement2!, library, packageGraph)
                 as Container,
         assert(getter != null || setter != null) {
     getter?.enclosingCombo = this;
@@ -66,26 +66,28 @@
   }
 
   Field.providedByExtension(
-    this.element,
+    Element2 element2,
     this.enclosingElement,
     super.library,
     super.packageGraph,
     this.getter,
     this.setter,
-  )   : isInherited = false,
+  )   : element = element2.asElement as FieldElement,
+        isInherited = false,
         assert(getter != null || setter != null) {
     getter?.enclosingCombo = this;
     setter?.enclosingCombo = this;
   }
 
   Field.inherited(
-    this.element,
+    Element2 element2,
     this.enclosingElement,
     super.library,
     super.packageGraph,
     this.getter,
     this.setter,
-  )   : isInherited = true,
+  )   : element = element2.asElement as FieldElement,
+        isInherited = true,
         assert(getter != null || setter != null) {
     // Can't set `isInherited` to true if this is the defining element, because
     // that would mean it isn't inherited.
diff --git a/lib/src/model/library.dart b/lib/src/model/library.dart
index 6bda7b2..5152ccf 100644
--- a/lib/src/model/library.dart
+++ b/lib/src/model/library.dart
@@ -120,8 +120,8 @@
   }
 
   @override
-  CompilationUnitElement get compilationUnitElement =>
-      element.definingCompilationUnit;
+  LibraryFragment get unitElement =>
+      element2.library2.firstFragment;
 
   @override
 
diff --git a/lib/src/model/model_element.dart b/lib/src/model/model_element.dart
index d59c757..2c7f3f8 100644
--- a/lib/src/model/model_element.dart
+++ b/lib/src/model/model_element.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
-
 /// The models used to represent Dart code.
 library;
 
@@ -15,8 +13,10 @@
 import 'package:analyzer/dart/element/type.dart' show FunctionType;
 import 'package:analyzer/source/line_info.dart';
 // ignore: implementation_imports
+import 'package:analyzer/src/dart/element/element.dart';
+// ignore: implementation_imports
 import 'package:analyzer/src/dart/element/member.dart'
-    show ExecutableMember, Member, ParameterMember;
+    show ExecutableMember, FieldMember, Member, ParameterMember;
 // ignore: implementation_imports
 import 'package:analyzer/src/utilities/extensions/element.dart';
 import 'package:dartdoc/src/dartdoc_options.dart';
@@ -83,25 +83,25 @@
   ModelElement(this._library, this._packageGraph, {Member? originalMember})
       : _originalMember = originalMember;
 
-  /// Returns a [ModelElement] for an [Element], which can be a
+  /// Returns a [ModelElement] for an [Element2], which can be a
   /// property-inducing element or not.
   ///
   /// This constructor is used when the caller does not know the element's
   /// library, or whether it is property-inducing.
-  factory ModelElement.forElement(Element e, PackageGraph p) {
-    if (e is MultiplyDefinedElement) {
+  factory ModelElement.forElement(Element2 e, PackageGraph p) {
+    if (e is MultiplyDefinedElement2) {
       // The code-to-document has static errors. We can pick the first
       // conflicting element and move on.
-      e = e.conflictingElements.first;
+      e = e.conflictingElements2.first;
     }
-    var library = p.findButDoNotCreateLibraryFor(e.asElement2!) ?? Library.sentinel;
+    var library = p.findButDoNotCreateLibraryFor(e) ?? Library.sentinel;
 
-    if (e is PropertyInducingElement) {
-      var elementGetter = e.getter;
+    if (e is PropertyInducingElement2) {
+      var elementGetter = e.getter2;
       var getter = elementGetter != null
           ? ModelElement.for_(elementGetter, library, p) as Accessor
           : null;
-      var elementSetter = e.setter;
+      var elementSetter = e.setter2;
       var setter = elementSetter != null
           ? ModelElement.for_(elementSetter, library, p) as Accessor
           : null;
@@ -112,22 +112,13 @@
     return ModelElement.for_(e, library, p);
   }
 
-  /// Returns a [ModelElement] for an [Element2], which can be a
-  /// property-inducing element or not.
-  ///
-  /// This constructor is used when the caller does not know the element's
-  /// library, or whether it is property-inducing.
-  factory ModelElement.forElement2(Element2 e, PackageGraph p) {
-    return ModelElement.forElement(e.asElement!, p);
-  }
-
   /// Returns a [ModelElement] for a property-inducing element.
   ///
   /// Do not construct any [ModelElement]s except from this constructor or
   /// [ModelElement.for_]. Specify [enclosingContainer] if and only if this is
   /// to be an inherited or extended object.
   factory ModelElement.forPropertyInducingElement(
-    PropertyInducingElement e,
+    PropertyInducingElement2 e,
     Library library,
     PackageGraph packageGraph, {
     required Accessor? getter,
@@ -137,24 +128,24 @@
     // TODO(jcollins-g): Refactor object model to instantiate 'ModelMembers'
     //                   for members?
     if (e is Member) {
-      e = e.declaration as PropertyInducingElement;
+      e = e.baseElement as PropertyInducingElement2;
     }
 
     // Return the cached ModelElement if it exists.
     var cachedModelElement = packageGraph.allConstructedModelElements[
-        ConstructedModelElementsKey(e.asElement2!, enclosingContainer)];
+        ConstructedModelElementsKey(e, enclosingContainer)];
     if (cachedModelElement != null) {
       return cachedModelElement;
     }
 
     ModelElement newModelElement;
-    if (e is TopLevelVariableElement) {
+    if (e is TopLevelVariableElement2) {
       assert(getter != null || setter != null);
       newModelElement =
-          TopLevelVariable(e.asElement2, library, packageGraph, getter, setter);
-    } else if (e is FieldElement) {
+          TopLevelVariable(e, library, packageGraph, getter, setter);
+    } else if (e is FieldElement2) {
       if (enclosingContainer is Extension) {
-        newModelElement = Field(e, library, packageGraph,
+        newModelElement = Field.element2(e, library, packageGraph,
             getter as ContainerAccessor?, setter as ContainerAccessor?);
       } else if (enclosingContainer == null) {
         if (e.isEnumConstant) {
@@ -169,19 +160,19 @@
                 'Enum $e (${e.runtimeType}) does not have a constant value.');
           }
           var index = constantIndex.toIntValue()!;
-          newModelElement = EnumField.forConstant(
-              index, e.asElement2, library, packageGraph, getter);
-        } else if (e.enclosingElement3 is ExtensionElement) {
-          newModelElement = Field(e, library, packageGraph,
+          newModelElement =
+              EnumField.forConstant(index, e, library, packageGraph, getter);
+        } else if (e.enclosingElement2 is ExtensionElement2) {
+          newModelElement = Field.element2(e, library, packageGraph,
               getter as ContainerAccessor?, setter as ContainerAccessor?);
         } else {
-          newModelElement = Field(e, library, packageGraph,
+          newModelElement = Field.element2(e, library, packageGraph,
               getter as ContainerAccessor?, setter as ContainerAccessor?);
         }
       } else {
         // Enum fields and extension getters can't be inherited, so this case is
         // simpler.
-        if (e.enclosingElement3 is ExtensionElement) {
+        if (e.enclosingElement2 is ExtensionElement2) {
           newModelElement = Field.providedByExtension(
             e,
             enclosingContainer,
@@ -222,25 +213,28 @@
   // TODO(jcollins-g): Enforce construction restraint.
   // TODO(jcollins-g): Allow e to be null and drop extraneous null checks.
   factory ModelElement.for_(
-      Element e, Library library, PackageGraph packageGraph,
+      Element2 e, Library library, PackageGraph packageGraph,
       {Container? enclosingContainer}) {
     assert(library != Library.sentinel ||
-        e is ParameterElement ||
-        e is TypeParameterElement ||
-        e is GenericFunctionTypeElement ||
+        e is FormalParameterElement ||
+        e is TypeParameterElement2 ||
+        e is GenericFunctionTypeElement2 ||
         e.kind == ElementKind.DYNAMIC ||
         e.kind == ElementKind.NEVER);
 
     Member? originalMember;
     // TODO(jcollins-g): Refactor object model to instantiate 'ModelMembers'
     //                   for members?
-    if (e is Member) {
+    if (e is ExecutableMember) {
       originalMember = e;
-      e = e.declaration;
+      e = e.baseElement;
+    } else if (e is FieldMember){
+      originalMember = e;
+      e = e.baseElement;  
     }
 
     // Return the cached ModelElement if it exists.
-    var key = ConstructedModelElementsKey(e.asElement2!, enclosingContainer);
+    var key = ConstructedModelElementsKey(e, enclosingContainer);
     var cachedModelElement = packageGraph.allConstructedModelElements[key];
     if (cachedModelElement != null) {
       return cachedModelElement;
@@ -248,11 +242,11 @@
 
     if (e.kind == ElementKind.DYNAMIC) {
       return packageGraph.allConstructedModelElements[key] =
-          Dynamic(e.asElement2!, packageGraph);
+          Dynamic(e, packageGraph);
     }
     if (e.kind == ElementKind.NEVER) {
       return packageGraph.allConstructedModelElements[key] =
-          NeverType(e.asElement2!, packageGraph);
+          NeverType(e, packageGraph);
     }
 
     var newModelElement = ModelElement._constructFromElementDeclaration(
@@ -269,117 +263,105 @@
     return newModelElement;
   }
 
-  factory ModelElement.for2_(
-      Element2 e, Library library, PackageGraph packageGraph,
-      {Container? enclosingContainer}) {
-    return ModelElement.for_(e.asElement!, library, packageGraph,
-        enclosingContainer: enclosingContainer);
-  }
-
   /// Caches a newly-created [ModelElement] from [ModelElement.for_] or
   /// [ModelElement.forPropertyInducingElement].
   static void _cacheNewModelElement(
-      Element e, ModelElement newModelElement, Library library,
+      Element2 e, ModelElement newModelElement, Library library,
       {Container? enclosingContainer}) {
     // TODO(jcollins-g): Reenable Parameter caching when dart-lang/sdk#30146
     //                   is fixed?
     assert(enclosingContainer == null || enclosingContainer.library == library,
         '$enclosingContainer.library != $library');
-    var element = e.asElement2!;
     if (library != Library.sentinel && newModelElement is! Parameter) {
       runtimeStats.incrementAccumulator('modelElementCacheInsertion');
-      var key = ConstructedModelElementsKey(element, enclosingContainer);
+      var key = ConstructedModelElementsKey(e, enclosingContainer);
       library.packageGraph.allConstructedModelElements[key] = newModelElement;
       if (newModelElement is Inheritable) {
         library.packageGraph.allInheritableElements
-            .putIfAbsent(InheritableElementsKey(element, library), () => {})
+            .putIfAbsent(InheritableElementsKey(e, library), () => {})
             .add(newModelElement);
       }
     }
   }
 
   static ModelElement _constructFromElementDeclaration(
-    Element e,
+    Element2 e,
     Library library,
     PackageGraph packageGraph, {
     Container? enclosingContainer,
     Member? originalMember,
   }) {
     return switch (e) {
-      LibraryElement() => packageGraph.findButDoNotCreateLibraryFor(e.asElement2)!,
-      PrefixElement() => Prefix(e.asElement2, library, packageGraph),
-      EnumElement() => Enum(e.asElement2, library, packageGraph),
-      MixinElement() => Mixin(e.asElement2, library, packageGraph),
-      ClassElement() => Class(e.asElement2, library, packageGraph),
-      ExtensionElement() => Extension(e.asElement2, library, packageGraph),
-      ExtensionTypeElement() => ExtensionType(e, library, packageGraph),
-      FunctionElement() => ModelFunction(
-          e.asElement2 as TopLevelFunctionElement, library, packageGraph),
-      ConstructorElement() => Constructor(e, library, packageGraph),
-      GenericFunctionTypeElement() => ModelFunctionTypedef(
-          e.asElement2 as FunctionTypedElement2, library, packageGraph),
-      TypeAliasElement(aliasedType: FunctionType()) =>
-        FunctionTypedef(e.asElement2, library, packageGraph),
-      TypeAliasElement()
-          when e.aliasedType.documentableElement2.asElement
-              is InterfaceElement =>
-        ClassTypedef(e.asElement2, library, packageGraph),
-      TypeAliasElement() =>
-        GeneralizedTypedef(e.asElement2, library, packageGraph),
-      MethodElement(isOperator: true) when enclosingContainer == null =>
-        Operator(e.asElement2, library, packageGraph),
-      MethodElement(isOperator: true)
-          when e.enclosingElement3 is ExtensionElement =>
+      LibraryElement2() => packageGraph.findButDoNotCreateLibraryFor(e)!,
+      PrefixElement2() => Prefix(e, library, packageGraph),
+      EnumElement2() => Enum(e, library, packageGraph),
+      MixinElement2() => Mixin(e, library, packageGraph),
+      ClassElement2() => Class(e, library, packageGraph),
+      ExtensionElement2() => Extension(e, library, packageGraph),
+      ExtensionTypeElement2() => ExtensionType(e, library, packageGraph),
+      TopLevelFunctionElement() => ModelFunction(e, library, packageGraph),
+      ConstructorElement2() => Constructor(e, library, packageGraph),
+      GenericFunctionTypeElement2() =>
+        ModelFunctionTypedef(e as FunctionTypedElement2, library, packageGraph),
+      TypeAliasElement2(aliasedType: FunctionType()) =>
+        FunctionTypedef(e, library, packageGraph),
+      TypeAliasElement2()
+          when e.aliasedType.documentableElement2 is InterfaceElement2 =>
+        ClassTypedef(e, library, packageGraph),
+      TypeAliasElement2() => GeneralizedTypedef(e, library, packageGraph),
+      MethodElement2(isOperator: true) when enclosingContainer == null =>
+        Operator(e, library, packageGraph),
+      MethodElement2(isOperator: true)
+          when e.enclosingElement2 is ExtensionElement2 =>
         Operator.providedByExtension(
-            e.asElement2, enclosingContainer, library, packageGraph),
-      MethodElement(isOperator: true) => Operator.inherited(
-          e.asElement2, enclosingContainer, library, packageGraph,
+            e, enclosingContainer, library, packageGraph),
+      MethodElement2(isOperator: true) => Operator.inherited(
+          e, enclosingContainer, library, packageGraph,
           originalMember: originalMember),
-      MethodElement(isOperator: false) when enclosingContainer == null =>
-        Method(e.asElement2, library, packageGraph),
-      MethodElement(isOperator: false)
-          when e.enclosingElement3 is ExtensionElement =>
+      MethodElement2(isOperator: false) when enclosingContainer == null =>
+        Method(e, library, packageGraph),
+      MethodElement2(isOperator: false)
+          when e.enclosingElement2 is ExtensionElement2 =>
         Method.providedByExtension(
-            e.asElement2, enclosingContainer, library, packageGraph),
-      MethodElement(isOperator: false) => Method.inherited(
-          e.asElement2, enclosingContainer, library, packageGraph,
+            e, enclosingContainer, library, packageGraph),
+      MethodElement2(isOperator: false) => Method.inherited(
+          e, enclosingContainer, library, packageGraph,
           originalMember: originalMember as ExecutableMember?),
-      ParameterElement() => Parameter(e.asElement2, library, packageGraph,
+      FormalParameterElement() => Parameter(e, library, packageGraph,
           originalMember: originalMember as ParameterMember?),
-      PropertyAccessorElement() => _constructFromPropertyAccessor(
+      PropertyAccessorElement2() => _constructFromPropertyAccessor(
           e,
           library,
           packageGraph,
           enclosingContainer: enclosingContainer,
           originalMember: originalMember,
         ),
-      TypeParameterElement() =>
-        TypeParameter(e.asElement2, library, packageGraph),
+      TypeParameterElement2() => TypeParameter(e, library, packageGraph),
       _ => throw UnimplementedError('Unknown type ${e.runtimeType}'),
     };
   }
 
-  /// Constructs a [ModelElement] from a [PropertyAccessorElement].
+  /// Constructs a [ModelElement] from a [PropertyAccessorElement2].
   static ModelElement _constructFromPropertyAccessor(
-    PropertyAccessorElement e,
+    PropertyAccessorElement2 e,
     Library library,
     PackageGraph packageGraph, {
     required Container? enclosingContainer,
     required Member? originalMember,
   }) {
     // Accessors can be part of a [Container], or a part of a [Library].
-    if (e.enclosingElement3 is ExtensionElement ||
-        e.enclosingElement3 is InterfaceElement) {
+    if (e.enclosingElement2 is ExtensionElement2 ||
+        e.enclosingElement2 is InterfaceElement2) {
       if (enclosingContainer == null || enclosingContainer is Extension) {
-        return ContainerAccessor(e.asElement2, library, packageGraph, enclosingContainer);
+        return ContainerAccessor(e, library, packageGraph, enclosingContainer);
       }
 
       return ContainerAccessor.inherited(
-          e.asElement2, library, packageGraph, enclosingContainer,
+          e, library, packageGraph, enclosingContainer,
           originalMember: originalMember as ExecutableMember?);
     }
 
-    return Accessor(e.asElement2, library, packageGraph);
+    return Accessor(e, library, packageGraph);
   }
 
   /// The model element enclosing this one.
@@ -400,7 +382,7 @@
   Iterable<Category?> get displayedCategories => const [];
 
   @override
-  ModelNode? get modelNode => packageGraph.getModelNodeFor(element.asElement2!);
+  ModelNode? get modelNode => packageGraph.getModelNodeFor(element2);
 
   /// This element's [Annotation]s.
   ///
@@ -408,7 +390,7 @@
   /// supposed to be invisible (like `@pragma`). While `null` elements indicate
   /// invalid code from analyzer's perspective, some are present in `sky_engine`
   /// (`@Native`) so we don't want to crash here.
-  late final List<Annotation> annotations = element.metadata
+  late final List<Annotation> annotations = element2.metadata
       .where((m) => m.isVisibleAnnotation)
       .map((m) => Annotation(m, library, packageGraph))
       .toList(growable: false);
@@ -435,7 +417,7 @@
       return false;
     }
 
-    if (element case LibraryElement(:var identifier, :var source)) {
+    if (element2 case LibraryElement2(:var identifier, :var firstFragment)) {
       // Private Dart SDK libraries are not public.
       if (identifier.startsWith('dart:_') ||
           identifier.startsWith('dart:nativewrappers/') ||
@@ -443,7 +425,7 @@
         return false;
       }
       // Package-private libraries are not public.
-      var elementUri = source.uri;
+      var elementUri = firstFragment.source.uri;
       if (elementUri.scheme == 'package' &&
           elementUri.pathSegments[1] == 'src') {
         return false;
@@ -484,9 +466,9 @@
 
   /// Whether this is a function, or if it is an type alias to a function.
   bool get isCallable =>
-      element is FunctionTypedElement ||
-      (element is TypeAliasElement &&
-          (element as TypeAliasElement).aliasedType is FunctionType);
+      element2 is FunctionTypedElement2 ||
+      (element2 is TypeAliasElement2 &&
+          (element2 as TypeAliasElement2).aliasedType is FunctionType);
 
   /// The canonical ModelElement for this ModelElement, or null if there isn't
   /// one.
@@ -568,10 +550,11 @@
       documentationFrom.map((e) => e.documentationLocal).join('<p>'));
 
   @override
-  Element get element;
+  // ignore: analyzer_use_new_elements
+  Element get element => element2.asElement!;
 
   @override
-  Element2 get element2 => element.asElement2!;
+  Element2 get element2;
 
   @override
   String get location {
@@ -609,23 +592,27 @@
   }();
 
   @override
-  String get sourceFileName => element.source!.fullName;
+  String get sourceFileName => element2.library2!.firstFragment.source.fullName;
 
   @override
   late final CharacterLocation? characterLocation = () {
-    final lineInfo = compilationUnitElement.lineInfo;
-    late final element = this.element;
-    assert(element.nameOffset >= 0,
+    final lineInfo = unitElement.lineInfo;
+    late final element = element2;
+    var nameOffset = element.firstFragment.nameOffset2;
+    if (element is LibraryElementImpl) {
+      nameOffset = element.nameOffset;
+    } else if (element is ConstructorElement2) {
+      nameOffset = (element.firstFragment as ConstructorElementImpl).nameOffset;
+    }
+    assert(nameOffset != null && nameOffset >= 0,
         'Invalid location data for element: $fullyQualifiedName');
-    var nameOffset = element.nameOffset;
-    if (nameOffset >= 0) {
+    if (nameOffset != null && nameOffset >= 0) {
       return lineInfo.getLocation(nameOffset);
     }
     return null;
   }();
 
-  CompilationUnitElement get compilationUnitElement =>
-      element.thisOrAncestorOfType<CompilationUnitElement>()!;
+  LibraryFragment get unitElement => element2.library2!.firstFragment;
 
   bool get hasAnnotations => annotations.isNotEmpty;
 
@@ -652,13 +639,13 @@
   bool get isDeprecated {
     // If element.metadata is empty, it might be because this is a property
     // where the metadata belongs to the individual getter/setter
-    if (element.metadata.isEmpty && element is PropertyInducingElement) {
-      var pie = element as PropertyInducingElement;
+    if (element2.metadata.isEmpty && element2 is PropertyInducingElement2) {
+      var pie = element2 as PropertyInducingElement2;
 
       // The getter or the setter might be null – so the stored value may be
       // `true`, `false`, or `null`
-      var getterDeprecated = pie.getter?.metadata.any((a) => a.isDeprecated);
-      var setterDeprecated = pie.setter?.metadata.any((a) => a.isDeprecated);
+      var getterDeprecated = pie.getter2?.metadata.any((a) => a.isDeprecated);
+      var setterDeprecated = pie.setter2?.metadata.any((a) => a.isDeprecated);
 
       var deprecatedValues = [getterDeprecated, setterDeprecated].nonNulls;
 
@@ -669,7 +656,7 @@
       // deprecated if both are deprecated.
       return deprecatedValues.every((d) => d);
     }
-    return element.metadata.any((a) => a.isDeprecated);
+    return element2.metadata.any((a) => a.isDeprecated);
   }
 
   @override
@@ -693,8 +680,8 @@
     // If `name` is empty, we probably have the wrong Element association or
     // there's an analyzer issue.
     assert(name.isNotEmpty ||
-        element.kind == ElementKind.DYNAMIC ||
-        element.kind == ElementKind.NEVER ||
+        element2.kind == ElementKind.DYNAMIC ||
+        element2.kind == ElementKind.NEVER ||
         this is ModelFunction);
 
     final href = this.href;
@@ -732,7 +719,7 @@
       _parameterRenderer.renderLinkedParams(parameters, showMetadata: false);
 
   @override
-  String get name => element.name!;
+  String get name => element2.lookupName!;
 
   @override
   String get oneLineDoc => elementDocumentation.asOneLiner;
@@ -753,32 +740,32 @@
   // TODO(srawlins): This really smells like it should just be implemented in
   // the subclasses.
   late final List<Parameter> parameters = () {
-    final element = this.element;
+    final element = element2;
     if (!isCallable) {
       throw StateError(
           '$element (${element.runtimeType}) cannot have parameters');
     }
 
-    final List<ParameterElement> params;
-    if (element is TypeAliasElement) {
+    final List<FormalParameterElement> params;
+    if (element is TypeAliasElement2) {
       final aliasedType = element.aliasedType;
       if (aliasedType is FunctionType) {
-        params = aliasedType.parameters;
+        params = aliasedType.formalParameters;
       } else {
         return const <Parameter>[];
       }
-    } else if (element is ExecutableElement) {
+    } else if (element is ExecutableElement2) {
       if (_originalMember != null) {
         assert(_originalMember is ExecutableMember);
-        params = (_originalMember as ExecutableMember).parameters;
+        params = (_originalMember as ExecutableMember).formalParameters;
       } else {
-        params = element.parameters;
+        params = element.formalParameters;
       }
-    } else if (element is FunctionTypedElement) {
+    } else if (element is FunctionTypedElement2) {
       if (_originalMember != null) {
-        params = (_originalMember as FunctionTypedElement).parameters;
+        params = (_originalMember as FunctionTypedElement2).formalParameters;
       } else {
-        params = element.parameters;
+        params = element.formalParameters;
       }
     } else {
       return const <Parameter>[];
@@ -809,8 +796,8 @@
   @internal
   @override
   CommentReferable get definingCommentReferable {
-    var element = this.element;
-    return getModelForElement(element);
+    var element = element2;
+    return getModelForElement2(element);
   }
 
   String get linkedObjectType => _packageGraph.dartCoreObject;
@@ -821,11 +808,11 @@
   ///
   /// At the moment, `pragma` is the only invisible annotation.
   bool get isVisibleAnnotation {
-    if (element == null) return false;
+    if (element2 == null) return false;
 
-    if (element case ConstructorElement(:var enclosingElement3)) {
-      return !(enclosingElement3.name == 'pragma' &&
-          enclosingElement3.library.name == 'dart.core');
+    if (element2 case ConstructorElement2(:var enclosingElement2)) {
+      return !(enclosingElement2.name3 == 'pragma' &&
+          enclosingElement2.library2.name3 == 'dart.core');
     }
 
     return true;
diff --git a/lib/src/model/nameable.dart b/lib/src/model/nameable.dart
index 36ddb49..a7fc9c4 100644
--- a/lib/src/model/nameable.dart
+++ b/lib/src/model/nameable.dart
@@ -63,7 +63,7 @@
     Container? enclosingContainer,
   }) =>
       ModelElement.for_(
-        element,
+        element.asElement2!,
         library,
         packageGraph,
         enclosingContainer: enclosingContainer,
@@ -78,7 +78,7 @@
     Container? enclosingContainer,
   }) =>
       ModelElement.for_(
-        element.asElement!,
+        element,
         library,
         packageGraph,
         enclosingContainer: enclosingContainer,
@@ -89,14 +89,14 @@
   /// A convenience method for [ModelElement.forElement], see its
   /// documentation.
   ModelElement getModelForElement(Element element) =>
-      ModelElement.forElement(element, packageGraph);
+      ModelElement.forElement(element.asElement2!, packageGraph);
 
   /// Returns the [ModelElement] for [element], instantiating it if needed.
   ///
   /// A convenience method for [ModelElement.forElement], see its
   /// documentation.
   ModelElement getModelForElement2(Element2 element) =>
-      ModelElement.forElement(element.asElement!, packageGraph);
+      ModelElement.forElement(element, packageGraph);
 
   /// Returns the [ModelElement] for [element], instantiating it if needed.
   ///
@@ -113,7 +113,7 @@
     Container? enclosingContainer,
   }) =>
       ModelElement.forPropertyInducingElement(
-        element,
+        element.asElement2 as PropertyInducingElement2,
         library,
         packageGraph,
         getter: getter,
@@ -136,7 +136,7 @@
     Container? enclosingContainer,
   }) =>
       ModelElement.forPropertyInducingElement(
-        element.asElement as PropertyInducingElement,
+        element,
         library,
         packageGraph,
         getter: getter,