Elements. Move everything from element2.dart into element.dart, re-export.

I do not deprecate element2.dart in this CL, to make the change smaller, but I will in a following CL.

Change-Id: I78b73eea5b47cf62122daae74c0bfe6e5bb8b0ef
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/424581
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/api.txt b/pkg/analyzer/api.txt
index 5091440..713ec85 100644
--- a/pkg/analyzer/api.txt
+++ b/pkg/analyzer/api.txt
@@ -2966,121 +2966,6 @@
     toSymbolValue (method: String? Function())
     toTypeValue (method: DartType? Function())
 package:analyzer/dart/element/element.dart:
-  DirectiveUri (class extends Object):
-    new (constructor: DirectiveUri Function())
-  DirectiveUriWithLibrary (class extends DirectiveUriWithSource):
-    new (constructor: DirectiveUriWithLibrary Function())
-    library2 (getter: LibraryElement2)
-  DirectiveUriWithRelativeUri (class extends DirectiveUriWithRelativeUriString):
-    new (constructor: DirectiveUriWithRelativeUri Function())
-    relativeUri (getter: Uri)
-  DirectiveUriWithRelativeUriString (class extends DirectiveUri):
-    new (constructor: DirectiveUriWithRelativeUriString Function())
-    relativeUriString (getter: String)
-  DirectiveUriWithSource (class extends DirectiveUriWithRelativeUri):
-    new (constructor: DirectiveUriWithSource Function())
-    source (getter: Source)
-  DirectiveUriWithUnit (class extends DirectiveUriWithSource):
-    new (constructor: DirectiveUriWithUnit Function())
-    libraryFragment (getter: LibraryFragment, experimental)
-  ElementAnnotation (class extends Object implements ConstantEvaluationTarget):
-    new (constructor: ElementAnnotation Function())
-    constantEvaluationErrors (getter: List<AnalysisError>?)
-    element2 (getter: Element2?)
-    isAlwaysThrows (getter: bool)
-    isAwaitNotRequired (getter: bool)
-    isDeprecated (getter: bool)
-    isDoNotStore (getter: bool)
-    isDoNotSubmit (getter: bool)
-    isFactory (getter: bool)
-    isImmutable (getter: bool)
-    isInternal (getter: bool)
-    isIsTest (getter: bool)
-    isIsTestGroup (getter: bool)
-    isJS (getter: bool)
-    isLiteral (getter: bool)
-    isMustBeConst (getter: bool)
-    isMustBeOverridden (getter: bool)
-    isMustCallSuper (getter: bool)
-    isNonVirtual (getter: bool)
-    isOptionalTypeArgs (getter: bool)
-    isOverride (getter: bool)
-    isProtected (getter: bool)
-    isProxy (getter: bool)
-    isRedeclare (getter: bool)
-    isReopen (getter: bool)
-    isRequired (getter: bool)
-    isSealed (getter: bool)
-    isTarget (getter: bool)
-    isUseResult (getter: bool)
-    isVisibleForOverriding (getter: bool)
-    isVisibleForTemplate (getter: bool)
-    isVisibleForTesting (getter: bool)
-    isVisibleOutsideTemplate (getter: bool)
-    isWidgetFactory (getter: bool)
-    computeConstantValue (method: DartObject? Function())
-    toSource (method: String Function())
-  ElementKind (class extends Object implements Comparable<ElementKind>):
-    AUGMENTATION_IMPORT (static getter: ElementKind)
-    CLASS (static getter: ElementKind)
-    CLASS_AUGMENTATION (static getter: ElementKind)
-    COMPILATION_UNIT (static getter: ElementKind)
-    CONSTRUCTOR (static getter: ElementKind)
-    DYNAMIC (static getter: ElementKind)
-    ENUM (static getter: ElementKind)
-    ERROR (static getter: ElementKind)
-    EXPORT (static getter: ElementKind)
-    EXTENSION (static getter: ElementKind)
-    EXTENSION_TYPE (static getter: ElementKind)
-    FIELD (static getter: ElementKind)
-    FUNCTION (static getter: ElementKind)
-    FUNCTION_TYPE_ALIAS (static getter: ElementKind)
-    GENERIC_FUNCTION_TYPE (static getter: ElementKind)
-    GETTER (static getter: ElementKind)
-    IMPORT (static getter: ElementKind)
-    LABEL (static getter: ElementKind)
-    LIBRARY (static getter: ElementKind)
-    LIBRARY_AUGMENTATION (static getter: ElementKind)
-    LOCAL_VARIABLE (static getter: ElementKind)
-    METHOD (static getter: ElementKind)
-    MIXIN (static getter: ElementKind)
-    NAME (static getter: ElementKind)
-    NEVER (static getter: ElementKind)
-    PARAMETER (static getter: ElementKind)
-    PART (static getter: ElementKind)
-    PREFIX (static getter: ElementKind)
-    RECORD (static getter: ElementKind)
-    SETTER (static getter: ElementKind)
-    TOP_LEVEL_VARIABLE (static getter: ElementKind)
-    TYPE_ALIAS (static getter: ElementKind)
-    TYPE_PARAMETER (static getter: ElementKind)
-    UNIVERSE (static getter: ElementKind)
-    values (static getter: List<ElementKind>)
-    new (constructor: ElementKind Function(String, int, String))
-    displayName (getter: String)
-    name (getter: String)
-    ordinal (getter: int)
-    compareTo (method: int Function(ElementKind))
-    toString (method: String Function())
-  ElementLocation (class extends Object):
-    new (constructor: ElementLocation Function())
-    components (getter: List<String>)
-    encoding (getter: String)
-  HideElementCombinator (class extends Object implements NamespaceCombinator):
-    new (constructor: HideElementCombinator Function())
-    hiddenNames (getter: List<String>)
-  LibraryLanguageVersion (class extends Object):
-    new (constructor: LibraryLanguageVersion Function({required Version? override, required Version package}))
-    effective (getter: Version)
-    override (getter: Version?)
-    package (getter: Version)
-  NamespaceCombinator (class extends Object, sealed (immediate subtypes: HideElementCombinator, ShowElementCombinator)):
-    end (getter: int)
-    offset (getter: int)
-  ShowElementCombinator (class extends Object implements NamespaceCombinator):
-    new (constructor: ShowElementCombinator Function())
-    shownNames (getter: List<String>)
-package:analyzer/dart/element/element2.dart:
   Annotatable (class extends Object):
     new (constructor: Annotatable Function())
     documentationComment (getter: String?)
@@ -3149,12 +3034,23 @@
     previousFragment (getter: ConstructorFragment?)
     typeName (getter: String?)
     typeNameOffset (getter: int?)
-  DirectiveUri (see above)
-  DirectiveUriWithLibrary (see above)
-  DirectiveUriWithRelativeUri (see above)
-  DirectiveUriWithRelativeUriString (see above)
-  DirectiveUriWithSource (see above)
-  DirectiveUriWithUnit (see above)
+  DirectiveUri (class extends Object):
+    new (constructor: DirectiveUri Function())
+  DirectiveUriWithLibrary (class extends DirectiveUriWithSource):
+    new (constructor: DirectiveUriWithLibrary Function())
+    library2 (getter: LibraryElement2)
+  DirectiveUriWithRelativeUri (class extends DirectiveUriWithRelativeUriString):
+    new (constructor: DirectiveUriWithRelativeUri Function())
+    relativeUri (getter: Uri)
+  DirectiveUriWithRelativeUriString (class extends DirectiveUri):
+    new (constructor: DirectiveUriWithRelativeUriString Function())
+    relativeUriString (getter: String)
+  DirectiveUriWithSource (class extends DirectiveUriWithRelativeUri):
+    new (constructor: DirectiveUriWithSource Function())
+    source (getter: Source)
+  DirectiveUriWithUnit (class extends DirectiveUriWithSource):
+    new (constructor: DirectiveUriWithUnit Function())
+    libraryFragment (getter: LibraryFragment, experimental)
   Element2 (class extends Object):
     new (constructor: Element2 Function())
     baseElement (getter: Element2)
@@ -3180,12 +3076,92 @@
     thisOrAncestorMatching2 (method: Element2? Function(bool Function(Element2)))
     thisOrAncestorOfType2 (method: E? Function<E extends Element2>())
     visitChildren2 (method: void Function<T>(ElementVisitor2<T>))
-  ElementAnnotation (see above)
+  ElementAnnotation (class extends Object implements ConstantEvaluationTarget):
+    new (constructor: ElementAnnotation Function())
+    constantEvaluationErrors (getter: List<AnalysisError>?)
+    element2 (getter: Element2?)
+    isAlwaysThrows (getter: bool)
+    isAwaitNotRequired (getter: bool)
+    isDeprecated (getter: bool)
+    isDoNotStore (getter: bool)
+    isDoNotSubmit (getter: bool)
+    isFactory (getter: bool)
+    isImmutable (getter: bool)
+    isInternal (getter: bool)
+    isIsTest (getter: bool)
+    isIsTestGroup (getter: bool)
+    isJS (getter: bool)
+    isLiteral (getter: bool)
+    isMustBeConst (getter: bool)
+    isMustBeOverridden (getter: bool)
+    isMustCallSuper (getter: bool)
+    isNonVirtual (getter: bool)
+    isOptionalTypeArgs (getter: bool)
+    isOverride (getter: bool)
+    isProtected (getter: bool)
+    isProxy (getter: bool)
+    isRedeclare (getter: bool)
+    isReopen (getter: bool)
+    isRequired (getter: bool)
+    isSealed (getter: bool)
+    isTarget (getter: bool)
+    isUseResult (getter: bool)
+    isVisibleForOverriding (getter: bool)
+    isVisibleForTemplate (getter: bool)
+    isVisibleForTesting (getter: bool)
+    isVisibleOutsideTemplate (getter: bool)
+    isWidgetFactory (getter: bool)
+    computeConstantValue (method: DartObject? Function())
+    toSource (method: String Function())
   ElementDirective (class extends Object implements Annotatable, sealed (immediate subtypes: LibraryExport, LibraryImport, PartInclude)):
     libraryFragment (getter: LibraryFragment)
     uri (getter: DirectiveUri)
-  ElementKind (see above)
-  ElementLocation (see above)
+  ElementKind (class extends Object implements Comparable<ElementKind>):
+    AUGMENTATION_IMPORT (static getter: ElementKind)
+    CLASS (static getter: ElementKind)
+    CLASS_AUGMENTATION (static getter: ElementKind)
+    COMPILATION_UNIT (static getter: ElementKind)
+    CONSTRUCTOR (static getter: ElementKind)
+    DYNAMIC (static getter: ElementKind)
+    ENUM (static getter: ElementKind)
+    ERROR (static getter: ElementKind)
+    EXPORT (static getter: ElementKind)
+    EXTENSION (static getter: ElementKind)
+    EXTENSION_TYPE (static getter: ElementKind)
+    FIELD (static getter: ElementKind)
+    FUNCTION (static getter: ElementKind)
+    FUNCTION_TYPE_ALIAS (static getter: ElementKind)
+    GENERIC_FUNCTION_TYPE (static getter: ElementKind)
+    GETTER (static getter: ElementKind)
+    IMPORT (static getter: ElementKind)
+    LABEL (static getter: ElementKind)
+    LIBRARY (static getter: ElementKind)
+    LIBRARY_AUGMENTATION (static getter: ElementKind)
+    LOCAL_VARIABLE (static getter: ElementKind)
+    METHOD (static getter: ElementKind)
+    MIXIN (static getter: ElementKind)
+    NAME (static getter: ElementKind)
+    NEVER (static getter: ElementKind)
+    PARAMETER (static getter: ElementKind)
+    PART (static getter: ElementKind)
+    PREFIX (static getter: ElementKind)
+    RECORD (static getter: ElementKind)
+    SETTER (static getter: ElementKind)
+    TOP_LEVEL_VARIABLE (static getter: ElementKind)
+    TYPE_ALIAS (static getter: ElementKind)
+    TYPE_PARAMETER (static getter: ElementKind)
+    UNIVERSE (static getter: ElementKind)
+    values (static getter: List<ElementKind>)
+    new (constructor: ElementKind Function(String, int, String))
+    displayName (getter: String)
+    name (getter: String)
+    ordinal (getter: int)
+    compareTo (method: int Function(ElementKind))
+    toString (method: String Function())
+  ElementLocation (class extends Object):
+    new (constructor: ElementLocation Function())
+    components (getter: List<String>)
+    encoding (getter: String)
   ElementVisitor2 (class<R> extends Object):
     new (constructor: ElementVisitor2<R> Function())
     visitClassElement (method: R? Function(ClassElement2))
@@ -3372,7 +3348,9 @@
   HasSinceSdkVersion (class extends Object):
     new (constructor: HasSinceSdkVersion Function())
     sinceSdkVersion (getter: Version?)
-  HideElementCombinator (see above)
+  HideElementCombinator (class extends Object implements NamespaceCombinator):
+    new (constructor: HideElementCombinator Function())
+    hiddenNames (getter: List<String>)
   InstanceElement2 (class extends Object implements TypeDefiningElement2, TypeParameterizedElement2, HasSinceSdkVersion):
     new (constructor: InstanceElement2 Function())
     baseElement (getter: InstanceElement2)
@@ -3538,6 +3516,11 @@
     isSynthetic (getter: bool)
     namespace (getter: Namespace)
     prefix2 (getter: PrefixFragment?)
+  LibraryLanguageVersion (class extends Object):
+    new (constructor: LibraryLanguageVersion Function({required Version? override, required Version package}))
+    effective (getter: Version)
+    override (getter: Version?)
+    package (getter: Version)
   LocalElement2 (class extends Object implements Element2):
     new (constructor: LocalElement2 Function())
   LocalFragment (class extends Object implements Fragment):
@@ -3648,7 +3631,9 @@
     == (method: bool Function(Object))
     isAccessibleFor (method: bool Function(Uri))
     toString (method: String Function())
-  NamespaceCombinator (see above)
+  NamespaceCombinator (class extends Object, sealed (immediate subtypes: HideElementCombinator, ShowElementCombinator)):
+    end (getter: int)
+    offset (getter: int)
   PartInclude (class extends Object implements ElementDirective):
     new (constructor: PartInclude Function())
     includedFragment (getter: LibraryFragment?)
@@ -3731,7 +3716,9 @@
     nextFragment (getter: SetterFragment?)
     offset (getter: int)
     previousFragment (getter: SetterFragment?)
-  ShowElementCombinator (see above)
+  ShowElementCombinator (class extends Object implements NamespaceCombinator):
+    new (constructor: ShowElementCombinator Function())
+    shownNames (getter: List<String>)
   SuperFormalParameterElement2 (class extends Object implements FormalParameterElement):
     new (constructor: SuperFormalParameterElement2 Function())
     firstFragment (getter: SuperFormalParameterFragment)
@@ -3834,6 +3821,108 @@
     initializer (getter: Expression?)
     nextFragment (getter: VariableFragment?)
     previousFragment (getter: VariableFragment?)
+package:analyzer/dart/element/element2.dart:
+  Annotatable (see above)
+  BindPatternVariableElement2 (see above)
+  BindPatternVariableFragment (see above)
+  ClassElement2 (see above)
+  ClassFragment (see above)
+  ConstantInitializer (see above)
+  ConstructorElement2 (see above)
+  ConstructorFragment (see above)
+  DirectiveUri (see above)
+  DirectiveUriWithLibrary (see above)
+  DirectiveUriWithRelativeUri (see above)
+  DirectiveUriWithRelativeUriString (see above)
+  DirectiveUriWithSource (see above)
+  DirectiveUriWithUnit (see above)
+  Element2 (see above)
+  ElementAnnotation (see above)
+  ElementDirective (see above)
+  ElementKind (see above)
+  ElementLocation (see above)
+  ElementVisitor2 (see above)
+  EnumElement2 (see above)
+  EnumFragment (see above)
+  ExecutableElement2 (see above)
+  ExecutableFragment (see above)
+  ExtensionElement2 (see above)
+  ExtensionFragment (see above)
+  ExtensionTypeElement2 (see above)
+  ExtensionTypeFragment (see above)
+  FieldElement2 (see above)
+  FieldFormalParameterElement2 (see above)
+  FieldFormalParameterFragment (see above)
+  FieldFragment (see above)
+  FormalParameterElement (see above)
+  FormalParameterFragment (see above)
+  Fragment (see above)
+  FunctionTypedElement2 (see above)
+  FunctionTypedFragment (see above)
+  GenericFunctionTypeElement2 (see above)
+  GenericFunctionTypeFragment (see above)
+  GetterElement (see above)
+  GetterFragment (see above)
+  HasSinceSdkVersion (see above)
+  HideElementCombinator (see above)
+  InstanceElement2 (see above)
+  InstanceFragment (see above)
+  InterfaceElement2 (see above)
+  InterfaceFragment (see above)
+  JoinPatternVariableElement2 (see above)
+  JoinPatternVariableFragment (see above)
+  LabelElement2 (see above)
+  LabelFragment (see above)
+  LibraryElement2 (see above)
+  LibraryExport (see above)
+  LibraryFragment (see above)
+  LibraryImport (see above)
+  LibraryLanguageVersion (see above)
+  LocalElement2 (see above)
+  LocalFragment (see above)
+  LocalFunctionElement (see above)
+  LocalFunctionFragment (see above)
+  LocalVariableElement2 (see above)
+  LocalVariableFragment (see above)
+  Metadata (see above)
+  MethodElement2 (see above)
+  MethodFragment (see above)
+  MixinElement2 (see above)
+  MixinFragment (see above)
+  MultiplyDefinedElement2 (see above)
+  MultiplyDefinedFragment (see above)
+  Name (see above)
+  NamespaceCombinator (see above)
+  PartInclude (see above)
+  PatternVariableElement2 (see above)
+  PatternVariableFragment (see above)
+  PrefixElement2 (see above)
+  PrefixFragment (see above)
+  PromotableElement2 (see above)
+  PromotableFragment (see above)
+  PropertyAccessorElement2 (see above)
+  PropertyAccessorFragment (see above)
+  PropertyInducingElement2 (see above)
+  PropertyInducingFragment (see above)
+  SetterElement (see above)
+  SetterFragment (see above)
+  ShowElementCombinator (see above)
+  SuperFormalParameterElement2 (see above)
+  SuperFormalParameterFragment (see above)
+  TopLevelFunctionElement (see above)
+  TopLevelFunctionFragment (see above)
+  TopLevelVariableElement2 (see above)
+  TopLevelVariableFragment (see above)
+  TypeAliasElement2 (see above)
+  TypeAliasFragment (see above)
+  TypeDefiningElement2 (see above)
+  TypeDefiningFragment (see above)
+  TypeParameterElement2 (see above)
+  TypeParameterFragment (see above)
+  TypeParameterizedElement2 (see above)
+  TypeParameterizedFragment (see above)
+  VariableElement2 (see above)
+  VariableFragment (see above)
 package:analyzer/dart/element/nullability_suffix.dart:
   NullabilitySuffix (enum):
     none (static getter: NullabilitySuffix)
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index fa64210..416edf6 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -2,14 +2,16 @@
 // 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.
 
-/// Defines the element model. The element model describes the semantic (as
-/// opposed to syntactic) structure of Dart code. The syntactic structure of the
-/// code is modeled by the [AST
-/// structure](../dart_ast_ast/dart_ast_ast-library.html).
+/// Defines the elements and fragments that are part of the element model.
 ///
-/// The element model consists of two closely related kinds of objects: elements
-/// (instances of a subclass of `Element`) and types. This library defines the
-/// elements, the types are defined in
+/// The element model describes the semantic (as opposed to syntactic) structure
+/// of Dart code. The syntactic structure of the code is modeled by the
+/// [AST structure](../dart_ast_ast/dart_ast_ast-library.html).
+///
+/// The element model consists of three closely related kinds of objects:
+/// elements (instances of a subclass of [Element2]), fragments (instances of a
+/// subclass of [Fragment]) and types. This library defines the elements and
+/// fragments; the types are defined in
 /// [type.dart](../dart_element_type/dart_element_type-library.html).
 ///
 /// Generally speaking, an element represents something that is declared in the
@@ -19,31 +21,348 @@
 /// For example, the elements representing the methods and fields in a class are
 /// children of the element representing the class.
 ///
+/// Some elements, such as a [LocalVariableElement2] are declared by a single
+/// declaration, but most elements can be declared by multiple declarations. A
+/// fragment represents a single declaration when the corresponding element
+/// can have multiple declarations. There is no fragment for an element that can
+/// only have one declaration.
+///
+/// As with elements, fragments are organized in a tree structure. The two
+/// structures parallel each other.
+///
 /// Every complete element structure is rooted by an instance of the class
-/// `LibraryElement`. A library element represents a single Dart library. Every
+/// [LibraryElement2]. A library element represents a single Dart library. Every
 /// library is defined by one or more compilation units (the library and all of
 /// its parts). The compilation units are represented by the class
-/// `CompilationUnitElement` and are children of the library that is defined by
-/// them. Each compilation unit can contain zero or more top-level declarations,
-/// such as classes, functions, and variables. Each of these is in turn
-/// represented as an element that is a child of the compilation unit. Classes
-/// contain methods and fields, methods can contain local variables, etc.
+/// [LibraryFragment].
 ///
 /// The element model does not contain everything in the code, only those things
 /// that are declared by the code. For example, it does not include any
 /// representation of the statements in a method body, but if one of those
 /// statements declares a local variable then the local variable will be
 /// represented by an element.
+///
+/// @docImport 'package:analyzer/dart/element/element.dart';
+/// @docImport 'package:analyzer/src/dart/element/member.dart';
 library;
 
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/constant/value.dart';
 import 'package:analyzer/dart/element/element2.dart';
+import 'package:analyzer/dart/element/nullability_suffix.dart';
+import 'package:analyzer/dart/element/scope.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/dart/element/type_provider.dart';
+import 'package:analyzer/dart/element/type_system.dart';
 import 'package:analyzer/error/error.dart';
+import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/source/source.dart';
 import 'package:analyzer/src/dart/constant/evaluation.dart';
+import 'package:analyzer/src/dart/resolver/scope.dart';
 import 'package:meta/meta.dart';
 import 'package:pub_semver/pub_semver.dart';
 
+export 'package:analyzer/src/dart/element/inheritance_manager3.dart' show Name;
+
+/// An element or fragment that can have either annotations (metadata), a
+/// documentation comment, or both associated with it.
+abstract class Annotatable {
+  /// The content of the documentation comment (including delimiters) for this
+  /// element or fragment.
+  ///
+  /// If the receiver is an element that has fragments, the comment will be a
+  /// concatenation of the comments from all of the fragments.
+  ///
+  /// Returns `null` if the receiver doesn't have documentation.
+  String? get documentationComment;
+
+  /// The metadata associated with the element or fragment.
+  ///
+  /// If the receiver is an element that has fragments, the list will include
+  /// all of the metadata from all of the fragments.
+  ///
+  /// The list will be empty if the receiver does not have any metadata or if
+  /// the library containing this element has not yet been fully resolved.
+  Metadata get metadata2;
+}
+
+/// A pattern variable that is explicitly declared.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class BindPatternVariableElement2 implements PatternVariableElement2 {
+  @override
+  BindPatternVariableFragment get firstFragment;
+
+  @override
+  List<BindPatternVariableFragment> get fragments;
+}
+
+/// The portion of a [BindPatternVariableElement2] contributed by a single
+/// declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class BindPatternVariableFragment implements PatternVariableFragment {
+  @override
+  BindPatternVariableElement2 get element;
+
+  @override
+  BindPatternVariableFragment? get nextFragment;
+
+  @override
+  BindPatternVariableFragment? get previousFragment;
+}
+
+/// A class.
+///
+/// The class can be defined by either a class declaration (with a class body),
+/// or a mixin application (without a class body).
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ClassElement2 implements InterfaceElement2 {
+  @override
+  ClassFragment get firstFragment;
+
+  @override
+  List<ClassFragment> get fragments;
+
+  /// Whether the class or its superclass declares a non-final instance field.
+  bool get hasNonFinalField;
+
+  /// Whether the class is abstract.
+  ///
+  /// A class is abstract if it has an explicit `abstract` modifier. Note, that
+  /// this definition of <i>abstract</i> is different from <i>has unimplemented
+  /// members</i>.
+  bool get isAbstract;
+
+  /// Whether this class is a base class.
+  ///
+  /// A class is a base class if it has an explicit `base` modifier, or the
+  /// class has a `base` induced modifier and [isSealed] is `true` as well.
+  /// The base modifier allows the class to be extended but not implemented.
+  bool get isBase;
+
+  /// Whether the class can be instantiated.
+  bool get isConstructable;
+
+  /// Whether the class represents the class 'Enum' defined in `dart:core`.
+  bool get isDartCoreEnum;
+
+  /// Whether the class represents the class 'Object' defined in `dart:core`.
+  bool get isDartCoreObject;
+
+  /// Whether the class is exhaustive.
+  ///
+  /// A class is exhaustive if it has the property where, in a switch, if you
+  /// cover all of the subtypes of this element, then the compiler knows that
+  /// you have covered all possible instances of the type.
+  bool get isExhaustive;
+
+  /// Whether the class is a final class.
+  ///
+  /// A class is a final class if it has an explicit `final` modifier, or the
+  /// class has a `final` induced modifier and [isSealed] is `true` as well.
+  /// The final modifier prohibits this class from being extended, implemented,
+  /// or mixed in.
+  bool get isFinal;
+
+  /// Whether the class is an interface class.
+  ///
+  /// A class is an interface class if it has an explicit `interface` modifier,
+  /// or the class has an `interface` induced modifier and [isSealed] is `true`
+  /// as well. The interface modifier allows the class to be implemented, but
+  /// not extended or mixed in.
+  bool get isInterface;
+
+  /// Whether the class is a mixin application.
+  ///
+  /// A class is a mixin application if it was declared using the syntax
+  /// `class A = B with C;`.
+  bool get isMixinApplication;
+
+  /// Whether the class is a mixin class.
+  ///
+  /// A class is a mixin class if it has an explicit `mixin` modifier.
+  bool get isMixinClass;
+
+  /// Whether the class is a sealed class.
+  ///
+  /// A class is a sealed class if it has an explicit `sealed` modifier.
+  bool get isSealed;
+
+  /// Whether the class can validly be used as a mixin when defining another
+  /// class.
+  ///
+  /// For classes defined by a class declaration or a mixin application, the
+  /// behavior of this method is defined by the Dart Language Specification
+  /// in section 9:
+  /// <blockquote>
+  /// It is a compile-time error if a declared or derived mixin refers to super.
+  /// It is a compile-time error if a declared or derived mixin explicitly
+  /// declares a constructor. It is a compile-time error if a mixin is derived
+  /// from a class whose superclass is not Object.
+  /// </blockquote>
+  bool get isValidMixin;
+
+  /// Whether the class, assuming that it is within scope, can be extended by
+  /// classes in the given [library].
+  bool isExtendableIn2(LibraryElement2 library);
+
+  /// Whether the class, assuming that it is within scope, can be implemented by
+  /// classes, mixins, and enums in the given [library].
+  bool isImplementableIn2(LibraryElement2 library);
+
+  /// Whether the class, assuming that it is within scope, can be mixed-in by
+  /// classes and enums in the given [library].
+  bool isMixableIn2(LibraryElement2 library);
+}
+
+/// The portion of a [ClassElement2] contributed by a single declaration.
+///
+/// The fragment can be defined by either a class declaration (with a class
+/// body), or a mixin application (without a class body).
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ClassFragment implements InterfaceFragment {
+  @override
+  ClassElement2 get element;
+
+  @override
+  ClassFragment? get nextFragment;
+
+  @override
+  ClassFragment? get previousFragment;
+}
+
+/// The initializer of a constant variable, or the default value for a formal
+/// parameter.
+abstract class ConstantInitializer {
+  /// The expression of the initializer.
+  ///
+  /// For variables that have multiple fragments, this is the expression from
+  /// the last fragment. For formal parameters, only the first fragment can
+  /// have the default value.
+  Expression get expression;
+
+  /// The [VariableFragment] that has [expression].
+  ///
+  /// The offsets are inside the [LibraryFragment] that contains [fragment].
+  VariableFragment get fragment;
+
+  /// Returns the result of evaluating [expression], computes it if necessary.
+  ///
+  /// Returns `null` if the value could not be computed because of errors.
+  DartObject? evaluate();
+}
+
+/// An element representing a constructor defined by a class, enum, or extension
+/// type.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ConstructorElement2
+    implements ExecutableElement2, HasSinceSdkVersion {
+  @override
+  ConstructorElement2 get baseElement;
+
+  @override
+  InterfaceElement2 get enclosingElement2;
+
+  @override
+  ConstructorFragment get firstFragment;
+
+  @override
+  List<ConstructorFragment> get fragments;
+
+  /// Whether the constructor is a const constructor.
+  bool get isConst;
+
+  /// Whether the constructor can be used as a default constructor - unnamed,
+  /// and has no required parameters.
+  bool get isDefaultConstructor;
+
+  /// Whether the constructor represents a factory constructor.
+  bool get isFactory;
+
+  /// Whether the constructor represents a generative constructor.
+  bool get isGenerative;
+
+  /// The name of this constructor.
+  ///
+  /// The name of the unnamed constructor is `new`.
+  @override
+  String? get name3;
+
+  /// The constructor to which this constructor is redirecting.
+  ///
+  /// Returns `null` if this constructor does not redirect to another
+  /// constructor or if the library containing this constructor has not yet been
+  /// resolved.
+  ConstructorElement2? get redirectedConstructor2;
+
+  @override
+  InterfaceType get returnType;
+
+  /// The constructor of the superclass that this constructor invokes, or
+  /// `null` if this constructor redirects to another constructor, or if the
+  /// library containing this constructor has not yet been resolved.
+  ConstructorElement2? get superConstructor2;
+}
+
+/// The portion of a [ConstructorElement2] contributed by a single declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ConstructorFragment implements ExecutableFragment {
+  @override
+  ConstructorElement2 get element;
+
+  @override
+  InstanceFragment? get enclosingFragment;
+
+  @override
+  String get name2;
+
+  @override
+  ConstructorFragment? get nextFragment;
+
+  /// The offset of the constructor name.
+  ///
+  /// For a named constructor (e.g., `ClassName.foo()``), this is the offset to
+  /// the part of the constructor name that follows the `.`. For an unnamed
+  /// constructor (e.g., `ClassName();`), this is the offset of the class name
+  /// that appears in the constructor declaration.
+  ///
+  /// For an implicit constructor, this is the offset of the class name in the
+  /// class declaration.
+  @override
+  int get offset;
+
+  /// The offset of the `.` before the name.
+  ///
+  /// It is `null` if the fragment is synthetic, or does not specify an
+  /// explicit name, even if [name2] is `new` in this case.
+  int? get periodOffset;
+
+  @override
+  ConstructorFragment? get previousFragment;
+
+  /// The specified name of the type (e.g. class).
+  ///
+  /// In valid code it is the name of the [enclosingFragment], however it
+  /// could be anything in invalid code, e.g. `class A { A2.named(); }`.
+  ///
+  /// If the fragment is synthetic, the type name is the name of the
+  /// enclosing type, which itself can be `null` if its name token is
+  /// synthetic.
+  String? get typeName;
+
+  /// The offset of the type (e.g. class) name.
+  ///
+  /// It is `null` if the fragment is synthetic.
+  int? get typeNameOffset;
+}
+
 /// Meaning of a URI referenced in a directive.
 ///
 /// Clients may not extend, implement or mix-in this class.
@@ -91,6 +410,191 @@
   LibraryFragment get libraryFragment;
 }
 
+/// The base class for all of the elements in the element model.
+///
+/// Generally speaking, the element model is a semantic model of the program
+/// that represents things that are declared with a name and hence can be
+/// referenced elsewhere in the code. There are two exceptions to the general
+/// case.
+///
+/// First, there are elements in the element model that are created for the
+/// convenience of various kinds of analysis but that don't have any
+/// corresponding declaration within the source code. Such elements are marked
+/// as being <i>synthetic</i>. Examples of synthetic elements include
+/// - default constructors in classes that don't define any explicit
+///   constructors,
+/// - getters and setters that are induced by explicit field declarations,
+/// - fields that are induced by explicit declarations of getters and setters,
+///   and
+/// - functions representing the initialization expression for a variable.
+///
+/// Second, there are elements in the element model that don't have, or are not
+/// required to have a name. These correspond to things like unnamed functions
+/// or extensions. They exist in order to more accurately represent the semantic
+/// structure of the program.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class Element2 {
+  /// The non-[Member] version of this element.
+  ///
+  /// If the receiver is a view on an element, such as a method from an
+  /// interface type with substituted type parameters, this getter will return
+  /// the corresponding element from the class, without any substitutions.
+  ///
+  /// If the receiver is already a non-[Member] element (or a synthetic element,
+  /// such as a synthetic property accessor), this getter will return the
+  /// receiver.
+  Element2 get baseElement;
+
+  /// The children of this element.
+  ///
+  /// There is no guarantee of the order in which the children will be returned.
+  /// In particular, they are not guaranteed to be in lexical order.
+  List<Element2> get children2;
+
+  /// The display name of this element, or an empty string if the element does
+  /// not have a name.
+  ///
+  /// In most cases the name and the display name are the same. They differ in
+  /// cases such as setters where the `name` of some setter (`set s(x)`) is `s=`
+  /// but the `displayName` is `s`.
+  String get displayName;
+
+  /// The element that either physically or logically encloses this element.
+  ///
+  /// Returns `null` if this element is a library because libraries are the
+  /// top-level elements in the model.
+  Element2? get enclosingElement2;
+
+  /// The first fragment in the chain of fragments that are merged to make this
+  /// element.
+  ///
+  /// The other fragments in the chain can be accessed using successive
+  /// invocations of [Fragment.nextFragment].
+  Fragment get firstFragment;
+
+  /// The fragments this element consists of.
+  List<Fragment> get fragments;
+
+  /// The unique integer identifier of this element.
+  int get id;
+
+  /// Whether this element is private.
+  ///
+  /// Private elements are visible only within the library in which they are
+  /// declared.
+  bool get isPrivate;
+
+  /// Whether this element is public.
+  ///
+  /// Public elements are visible within any library that imports the library
+  /// in which they are declared.
+  bool get isPublic;
+
+  /// Whether this element is synthetic.
+  ///
+  /// A synthetic element is an element that is not represented in the source
+  /// code explicitly, but is implied by the source code, such as the default
+  /// constructor for a class that does not explicitly define any constructors.
+  bool get isSynthetic;
+
+  /// The kind of this element.
+  ElementKind get kind;
+
+  /// Library that contains this element.
+  ///
+  /// This will be the element itself if it's a library element. This will be
+  /// `null` if this element is a [MultiplyDefinedElement2] that isn't contained
+  /// in a single library.
+  LibraryElement2? get library2;
+
+  /// The name to use for lookup in maps.
+  ///
+  /// It is usually the same as [name3], with a few special cases.
+  ///
+  /// Just like [name3], it can be `null` if the element does not have
+  /// a name, for example an unnamed extension, or because of parser recovery.
+  ///
+  /// For a [SetterElement] the result has `=` at the end.
+  ///
+  /// For an unary operator `-` the result is `unary-`.
+  /// For a binary operator `-` the result is just `-`.
+  String? get lookupName;
+
+  /// The name of this element.
+  ///
+  /// Returns `null` if this element doesn't have a name.
+  ///
+  /// See [Fragment.name2] for details.
+  String? get name3;
+
+  /// The non-synthetic element that caused this element to be created.
+  ///
+  /// If this element is not synthetic, then the element itself is returned.
+  ///
+  /// If this element is synthetic, then the corresponding non-synthetic
+  /// element is returned. For example, for a synthetic getter of a
+  /// non-synthetic field the field is returned; for a synthetic constructor
+  /// the enclosing class is returned.
+  Element2 get nonSynthetic2;
+
+  /// The analysis session in which this element is defined.
+  AnalysisSession? get session;
+
+  /// Uses the given [visitor] to visit this element.
+  ///
+  /// Returns the value returned by the visitor as a result of visiting this
+  /// element.
+  T? accept2<T>(ElementVisitor2<T> visitor);
+
+  /// The presentation of this element as it should appear when presented to
+  /// users.
+  ///
+  /// If [multiline] is `true`, then the string may be wrapped over multiple
+  /// lines with newlines to improve formatting. For example, function
+  /// signatures may be formatted as if they had trailing commas.
+  ///
+  /// If [preferTypeAlias] is `true` and the element represents a type defined
+  /// by a type alias, then the name of the type alias will be used in the
+  /// returned string rather than the name of the type being aliased.
+  ///
+  /// Clients should not depend on the content of the returned value as it will
+  /// be changed if doing so would improve the UX.
+  String displayString2({bool multiline = false, bool preferTypeAlias = false});
+
+  /// Returns a display name for the given element that includes the path to the
+  /// compilation unit in which the type is defined. If [shortName] is `null`
+  /// then [displayName] will be used as the name of this element. Otherwise
+  /// the provided name will be used.
+  String getExtendedDisplayName2({String? shortName});
+
+  /// Whether the element, assuming that it is within scope, is accessible to
+  /// code in the given [library].
+  ///
+  /// This is defined by the Dart Language Specification in section 6.2:
+  /// <blockquote>
+  /// A declaration <i>m</i> is accessible to a library <i>L</i> if <i>m</i> is
+  /// declared in <i>L</i> or if <i>m</i> is public.
+  /// </blockquote>
+  bool isAccessibleIn2(LibraryElement2 library);
+
+  /// Returns either this element or the most immediate ancestor of this element
+  /// for which the [predicate] returns `true`.
+  ///
+  /// Returns `null` if there is no such element.
+  Element2? thisOrAncestorMatching2(bool Function(Element2) predicate);
+
+  /// Returns either this element or the most immediate ancestor of this element
+  /// that has the given type.
+  ///
+  /// Returns `null` if there is no such element.
+  E? thisOrAncestorOfType2<E extends Element2>();
+
+  /// Uses the given [visitor] to visit all of the children of this element.
+  /// There is no guarantee of the order in which the children will be visited.
+  void visitChildren2<T>(ElementVisitor2<T> visitor);
+}
+
 /// A single annotation associated with an element.
 ///
 /// Clients may not extend, implement or mix-in this class.
@@ -237,6 +741,17 @@
   String toSource();
 }
 
+/// A directive within a library fragment.
+///
+/// Clients may not extend, implement or mix-in this class.
+sealed class ElementDirective implements Annotatable {
+  /// The library fragment that contains this object.
+  LibraryFragment get libraryFragment;
+
+  /// The interpretation of the URI specified in the directive.
+  DirectiveUri get uri;
+}
+
 /// The kind of elements in the element model.
 ///
 /// Clients may not extend, implement or mix-in this class.
@@ -436,6 +951,699 @@
   String get encoding;
 }
 
+/// An object that can be used to visit an element structure.
+///
+/// Clients may not extend, implement or mix-in this class. There are classes
+/// that implement this interface that provide useful default behaviors in
+/// `package:analyzer/dart/element/visitor.dart`. A couple of the most useful
+/// include
+/// * SimpleElementVisitor which implements every visit method by doing nothing,
+/// * RecursiveElementVisitor which will cause every node in a structure to be
+///   visited, and
+/// * ThrowingElementVisitor which implements every visit method by throwing an
+///   exception.
+abstract class ElementVisitor2<R> {
+  R? visitClassElement(ClassElement2 element);
+
+  R? visitConstructorElement(ConstructorElement2 element);
+
+  R? visitEnumElement(EnumElement2 element);
+
+  R? visitExtensionElement(ExtensionElement2 element);
+
+  R? visitExtensionTypeElement(ExtensionTypeElement2 element);
+
+  R? visitFieldElement(FieldElement2 element);
+
+  R? visitFieldFormalParameterElement(FieldFormalParameterElement2 element);
+
+  R? visitFormalParameterElement(FormalParameterElement element);
+
+  R? visitGenericFunctionTypeElement(GenericFunctionTypeElement2 element);
+
+  R? visitGetterElement(GetterElement element);
+
+  R? visitLabelElement(LabelElement2 element);
+
+  R? visitLibraryElement(LibraryElement2 element);
+
+  R? visitLocalFunctionElement(LocalFunctionElement element);
+
+  R? visitLocalVariableElement(LocalVariableElement2 element);
+
+  R? visitMethodElement(MethodElement2 element);
+
+  R? visitMixinElement(MixinElement2 element);
+
+  R? visitMultiplyDefinedElement(MultiplyDefinedElement2 element);
+
+  R? visitPrefixElement(PrefixElement2 element);
+
+  R? visitSetterElement(SetterElement element);
+
+  R? visitSuperFormalParameterElement(SuperFormalParameterElement2 element);
+
+  R? visitTopLevelFunctionElement(TopLevelFunctionElement element);
+
+  R? visitTopLevelVariableElement(TopLevelVariableElement2 element);
+
+  R? visitTypeAliasElement(TypeAliasElement2 element);
+
+  R? visitTypeParameterElement(TypeParameterElement2 element);
+}
+
+/// An element that represents an enum.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class EnumElement2 implements InterfaceElement2 {
+  /// The constants defined by the enum.
+  List<FieldElement2> get constants2;
+
+  @override
+  EnumFragment get firstFragment;
+
+  @override
+  List<EnumFragment> get fragments;
+}
+
+/// The portion of an [EnumElement2] contributed by a single declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class EnumFragment implements InterfaceFragment {
+  /// The constants defined by this fragment of the enum.
+  List<FieldElement2> get constants2;
+
+  @override
+  EnumElement2 get element;
+
+  @override
+  EnumFragment? get nextFragment;
+
+  @override
+  EnumFragment? get previousFragment;
+}
+
+/// An element representing an executable object, including functions, methods,
+/// constructors, getters, and setters.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ExecutableElement2 implements FunctionTypedElement2 {
+  @override
+  ExecutableElement2 get baseElement;
+
+  @override
+  ExecutableFragment get firstFragment;
+
+  @override
+  List<ExecutableFragment> get fragments;
+
+  /// Whether the executable element did not have an explicit return type
+  /// specified for it in the original source.
+  bool get hasImplicitReturnType;
+
+  /// Whether the executable element is abstract.
+  ///
+  /// Executable elements are abstract if they are not external, and have no
+  /// body.
+  bool get isAbstract;
+
+  /// Whether the executable element is an extension type member.
+  bool get isExtensionTypeMember;
+
+  /// Whether the executable element is external.
+  ///
+  /// Executable elements are external if they are explicitly marked as such
+  /// using the 'external' keyword.
+  bool get isExternal;
+
+  /// Whether the element is a static element.
+  ///
+  /// A static element is an element that is not associated with a particular
+  /// instance, but rather with an entire library or class.
+  bool get isStatic;
+}
+
+/// The portion of an [ExecutableElement2] contributed by a single declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ExecutableFragment implements FunctionTypedFragment {
+  @override
+  ExecutableElement2 get element;
+
+  /// Whether the body is marked as being asynchronous.
+  bool get isAsynchronous;
+
+  /// Whether the element is an augmentation.
+  ///
+  /// Executable elements are augmentations if they are explicitly marked as
+  /// such using the 'augment' modifier.
+  bool get isAugmentation;
+
+  /// Whether the body is marked as being a generator.
+  bool get isGenerator;
+
+  /// Whether the body is marked as being synchronous.
+  bool get isSynchronous;
+
+  /// Whether this fragment is synthetic.
+  ///
+  /// A synthetic fragment is a fragment that is not represented in the source
+  /// code explicitly, but is implied by the source code, such as the default
+  /// constructor for a class that does not explicitly define any constructors.
+  bool get isSynthetic;
+
+  @override
+  LibraryFragment get libraryFragment;
+
+  @override
+  ExecutableFragment? get nextFragment;
+
+  @override
+  ExecutableFragment? get previousFragment;
+}
+
+/// An extension.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ExtensionElement2 implements InstanceElement2 {
+  /// The type that is extended by this extension.
+  DartType get extendedType;
+
+  @override
+  ExtensionFragment get firstFragment;
+
+  @override
+  List<ExtensionFragment> get fragments;
+}
+
+/// The portion of an [ExtensionElement2] contributed by a single
+/// declaration.
+///
+/// Clients may not extend, implement, or mix-in this class.
+abstract class ExtensionFragment implements InstanceFragment {
+  @override
+  ExtensionElement2 get element;
+
+  @override
+  ExtensionFragment? get nextFragment;
+
+  /// The offset of the extension name.
+  ///
+  /// If the extension has no name, this is the offset of the `extension`
+  /// keyword.
+  @override
+  int get offset;
+
+  @override
+  ExtensionFragment? get previousFragment;
+}
+
+/// An extension type.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ExtensionTypeElement2 implements InterfaceElement2 {
+  @override
+  ExtensionTypeFragment get firstFragment;
+
+  @override
+  List<ExtensionTypeFragment> get fragments;
+
+  /// The primary constructor of this extension.
+  ConstructorElement2 get primaryConstructor2;
+
+  /// The representation of this extension.
+  FieldElement2 get representation2;
+
+  /// The extension type erasure, obtained by recursively replacing every
+  /// subterm which is an extension type by the corresponding representation
+  /// type.
+  DartType get typeErasure;
+}
+
+/// The portion of an [ExtensionTypeElement2] contributed by a single
+/// declaration.
+///
+/// Clients may not extend, implement, or mix-in this class.
+abstract class ExtensionTypeFragment implements InterfaceFragment {
+  @override
+  ExtensionTypeElement2 get element;
+
+  @override
+  ExtensionTypeFragment? get nextFragment;
+
+  @override
+  ExtensionTypeFragment? get previousFragment;
+
+  ConstructorFragment get primaryConstructor2;
+
+  /// The representation of this extension.
+  FieldFragment get representation2;
+}
+
+/// A field defined within a class, enum, extension, or mixin.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class FieldElement2 implements PropertyInducingElement2 {
+  @override
+  FieldElement2 get baseElement;
+
+  @override
+  InstanceElement2 get enclosingElement2;
+
+  @override
+  FieldFragment get firstFragment;
+
+  @override
+  List<FieldFragment> get fragments;
+
+  /// Whether the field is abstract.
+  ///
+  /// Executable fields are abstract if they are declared with the `abstract`
+  /// keyword.
+  bool get isAbstract;
+
+  /// Whether the field was explicitly marked as being covariant.
+  bool get isCovariant;
+
+  /// Whether the element is an enum constant.
+  bool get isEnumConstant;
+
+  /// Whether the field was explicitly marked as being external.
+  bool get isExternal;
+
+  /// Whether the field can be type promoted.
+  bool get isPromotable;
+}
+
+/// A field formal parameter defined within a constructor element.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class FieldFormalParameterElement2 implements FormalParameterElement {
+  /// The field element associated with this field formal parameter.
+  ///
+  /// Returns `null` if the parameter references a field that doesn't exist.
+  FieldElement2? get field2;
+
+  @override
+  FieldFormalParameterFragment get firstFragment;
+
+  @override
+  List<FieldFormalParameterFragment> get fragments;
+}
+
+/// The portion of a [FieldFormalParameterElement2] contributed by a single
+/// declaration.
+///
+/// Clients may not extend, implement, or mix-in this class.
+abstract class FieldFormalParameterFragment implements FormalParameterFragment {
+  @override
+  FieldFormalParameterElement2 get element;
+
+  @override
+  FieldFormalParameterFragment? get nextFragment;
+
+  @override
+  FieldFormalParameterFragment? get previousFragment;
+}
+
+/// The portion of a [FieldElement2] contributed by a single declaration.
+///
+/// Clients may not extend, implement, or mix-in this class.
+abstract class FieldFragment implements PropertyInducingFragment {
+  @override
+  FieldElement2 get element;
+
+  @override
+  FieldFragment? get nextFragment;
+
+  /// The offset of the field name.
+  ///
+  /// If the field declaration is implicit, this is the offset of the name of
+  /// the containing element (e.g., for the `values` field of an enum, this is
+  /// the offset of the enum name).
+  @override
+  int get offset;
+
+  @override
+  FieldFragment? get previousFragment;
+}
+
+/// A formal parameter defined by an executable element.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class FormalParameterElement
+    implements
+        PromotableElement2,
+        Annotatable,
+        HasSinceSdkVersion,
+        LocalElement2 {
+  @override
+  FormalParameterElement get baseElement;
+
+  /// The code of the default value.
+  ///
+  /// Returns `null` if no default value.
+  String? get defaultValueCode;
+
+  @override
+  FormalParameterFragment get firstFragment;
+
+  /// The formal parameters defined by this formal parameter.
+  ///
+  /// A parameter will only define other parameters if it is a function typed
+  /// formal parameter.
+  List<FormalParameterElement> get formalParameters;
+
+  @override
+  List<FormalParameterFragment> get fragments;
+
+  /// Whether the parameter has a default value.
+  bool get hasDefaultValue;
+
+  /// Whether the parameter is covariant, meaning it is allowed to have a
+  /// narrower type in an override.
+  bool get isCovariant;
+
+  /// Whether the parameter is an initializing formal parameter.
+  bool get isInitializingFormal;
+
+  /// Whether the parameter is a named parameter.
+  ///
+  /// Named parameters that are annotated with the `@required` annotation are
+  /// considered optional. Named parameters that are annotated with the
+  /// `required` syntax are considered required.
+  bool get isNamed;
+
+  /// Whether the parameter is an optional parameter.
+  ///
+  /// Optional parameters can either be positional or named. Named parameters
+  /// that are annotated with the `@required` annotation are considered
+  /// optional. Named parameters that are annotated with the `required` syntax
+  /// are considered required.
+  bool get isOptional;
+
+  /// Whether the parameter is both an optional and named parameter.
+  ///
+  /// Named parameters that are annotated with the `@required` annotation are
+  /// considered optional. Named parameters that are annotated with the
+  /// `required` syntax are considered required.
+  bool get isOptionalNamed;
+
+  /// Whether the parameter is both an optional and positional parameter.
+  bool get isOptionalPositional;
+
+  /// Whether the parameter is a positional parameter.
+  ///
+  /// Positional parameters can either be required or optional.
+  bool get isPositional;
+
+  /// Whether the parameter is either a required positional parameter, or a
+  /// named parameter with the `required` keyword.
+  ///
+  /// Note: the presence or absence of the `@required` annotation does not
+  /// change the meaning of this getter. The parameter `{@required int x}`
+  /// will return `false` and the parameter `{@required required int x}`
+  /// will return `true`.
+  bool get isRequired;
+
+  /// Whether the parameter is both a required and named parameter.
+  ///
+  /// Named parameters that are annotated with the `@required` annotation are
+  /// considered optional. Named parameters that are annotated with the
+  /// `required` syntax are considered required.
+  bool get isRequiredNamed;
+
+  /// Whether the parameter is both a required and positional parameter.
+  bool get isRequiredPositional;
+
+  /// Whether the parameter is a super formal parameter.
+  bool get isSuperFormal;
+
+  /// The type parameters defined by this parameter.
+  ///
+  /// A parameter will only define type parameters if it is a function typed
+  /// parameter.
+  List<TypeParameterElement2> get typeParameters2;
+
+  /// Appends the type, name and possibly the default value of this parameter
+  /// to the given [buffer].
+  void appendToWithoutDelimiters2(StringBuffer buffer);
+}
+
+/// The portion of a [FormalParameterElement] contributed by a single
+/// declaration.
+///
+/// Clients may not extend, implement, or mix-in this class.
+abstract class FormalParameterFragment
+    implements PromotableFragment, Annotatable, LocalFragment {
+  @override
+  FormalParameterElement get element;
+
+  @override
+  FormalParameterFragment? get nextFragment;
+
+  /// The offset of the parameter name.
+  ///
+  /// If the parameter is implicit (because it's the parameter of an implicit
+  /// setter that's induced by a field or top level variable declaration), this
+  /// is the offset of the field or top level variable name.
+  @override
+  int get offset;
+
+  @override
+  FormalParameterFragment? get previousFragment;
+}
+
+/// A fragment that wholly or partially defines an element.
+///
+/// When an element is defined by one or more fragments, those fragments form an
+/// augmentation chain. This is represented in the element model as a
+/// doubly-linked list.
+///
+/// In valid code the first fragment is the base declaration and all of the
+/// other fragments are augmentations. This can be violated in the element model
+/// in the case of invalid code, such as when an augmentation is declared even
+/// though there is no base declaration.
+abstract class Fragment {
+  /// The children of this fragment.
+  ///
+  /// There is no guarantee of the order in which the children will be returned.
+  /// In particular, they are not guaranteed to be in lexical order.
+  List<Fragment> get children3;
+
+  /// The element composed from this fragment and possibly other fragments.
+  Element2 get element;
+
+  /// The fragment that either physically or logically encloses this fragment.
+  ///
+  /// Returns `null` if this fragment is the root fragment of a library because
+  /// there are no fragments above the root fragment of a library.
+  Fragment? get enclosingFragment;
+
+  /// The library fragment that contains this fragment.
+  ///
+  /// This will be the fragment itself if it is a library fragment.
+  LibraryFragment? get libraryFragment;
+
+  /// The name of the fragment.
+  ///
+  /// Never empty.
+  ///
+  /// If a fragment, e.g. an [ExtensionFragment], does not have a name,
+  /// then the name is `null`.
+  ///
+  /// For an unnamed [ConstructorFragment] the name is `new`, but [nameOffset2]
+  /// is `null`. If there is an explicit `ClassName.new`, the name is also
+  /// `new`, and [nameOffset2] is not `null`. For a synthetic default unnamed
+  /// [ConstructorElement2] there is always a synthetic [ConstructorFragment]
+  /// with the name `new`, and [nameOffset2] is `null`.
+  ///
+  /// If the fragment declaration node does not have the name specified, and
+  /// the parser inserted a synthetic token, then the name is `null`, and
+  /// [nameOffset2] is `null`.
+  ///
+  /// For a synthetic [GetterFragment] or [SetterFragment] the name is the
+  /// name of the corresponding non-synthetic [PropertyInducingFragment],
+  /// which is usually not `null`, but could be. And `nameOffset2` is `null`
+  /// for such synthetic fragments.
+  ///
+  /// For a [SetterFragment] this is the identifier, without `=` at the end.
+  ///
+  /// For both unary and binary `-` operator this is `-`.
+  String? get name2;
+
+  /// The offset of the [name2] of this element.
+  ///
+  /// If a fragment, e.g. an [ExtensionFragment], does not have a name,
+  /// then the name offset is `null`.
+  ///
+  /// If the fragment declaration node does not have the name specified, and
+  /// the parser inserted a synthetic token, then the name is `null`, and
+  /// the name offset is `null`.
+  ///
+  /// For a synthetic fragment, e.g. [ConstructorFragment] the name offset
+  /// is `null`.
+  int? get nameOffset2;
+
+  /// The next fragment in the augmentation chain.
+  ///
+  /// Returns `null` if this is the last fragment in the chain.
+  Fragment? get nextFragment;
+
+  /// A canonical offset to the fragment within the source file.
+  ///
+  /// If the fragment has a name, this is equal to [nameOffset2]. Otherwise it
+  /// is the offset of some character within the fragment; see subclasses for
+  /// more information.
+  ///
+  /// If the fragment is of a kind that would normally have a name, but there is
+  /// no name due to error recovery, then the exact offset is unspecified, but
+  /// is guaranteed to be within the span of the tokens that constitute the
+  /// fragment's declaration.
+  int get offset;
+
+  /// The previous fragment in the augmentation chain.
+  ///
+  /// Returns `null` if this is the first fragment in the chain.
+  Fragment? get previousFragment;
+}
+
+/// An element that has a [FunctionType] as its [type].
+///
+/// This also provides convenient access to the parameters and return type.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class FunctionTypedElement2 implements TypeParameterizedElement2 {
+  @override
+  FunctionTypedFragment get firstFragment;
+
+  /// The formal parameters defined by this element.
+  List<FormalParameterElement> get formalParameters;
+
+  @override
+  List<FunctionTypedFragment> get fragments;
+
+  /// The return type defined by this element.
+  DartType get returnType;
+
+  /// The type defined by this element.
+  FunctionType get type;
+}
+
+/// The portion of a [FunctionTypedElement2] contributed by a single declaration.
+///
+/// Clients may not extend, implement, or mix-in this class.
+abstract class FunctionTypedFragment implements TypeParameterizedFragment {
+  @override
+  FunctionTypedElement2 get element;
+
+  /// The formal parameters defined by this fragment.
+  List<FormalParameterFragment> get formalParameters;
+
+  @override
+  FunctionTypedFragment? get nextFragment;
+
+  @override
+  FunctionTypedFragment? get previousFragment;
+}
+
+/// The pseudo-declaration that defines a generic function type.
+///
+/// Clients may not extend, implement, or mix-in this class.
+abstract class GenericFunctionTypeElement2 implements FunctionTypedElement2 {
+  @override
+  GenericFunctionTypeFragment get firstFragment;
+
+  @override
+  List<GenericFunctionTypeFragment> get fragments;
+}
+
+/// The portion of a [GenericFunctionTypeElement2] coming from a single
+/// declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class GenericFunctionTypeFragment implements FunctionTypedFragment {
+  @override
+  GenericFunctionTypeElement2 get element;
+
+  @override
+  GenericFunctionTypeFragment? get nextFragment;
+
+  /// The offset of the generic function type.
+  ///
+  /// Generic function types are not named, so the offset is the offset of the
+  /// first token in the generic function type.
+  @override
+  int get offset;
+
+  @override
+  GenericFunctionTypeFragment? get previousFragment;
+}
+
+/// A getter.
+///
+/// Getters can either be defined explicitly or they can be induced by either a
+/// top-level variable or a field. Induced getters are synthetic.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class GetterElement implements PropertyAccessorElement2 {
+  @override
+  GetterElement get baseElement;
+
+  /// The setter that corresponds to (has the same name as) this getter, or
+  /// `null` if there is no corresponding setter.
+  SetterElement? get correspondingSetter2;
+
+  @override
+  GetterFragment get firstFragment;
+
+  @override
+  List<GetterFragment> get fragments;
+}
+
+/// The portion of a [GetterElement] contributed by a single declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class GetterFragment implements PropertyAccessorFragment {
+  @override
+  GetterElement get element;
+
+  @override
+  GetterFragment? get nextFragment;
+
+  /// The offset of the getter name.
+  ///
+  /// If the getter is implicit (because it's induced by a field or top level
+  /// variable declaration), this is the offset of the field or top level
+  /// variable name.
+  @override
+  int get offset;
+
+  @override
+  GetterFragment? get previousFragment;
+}
+
+/// The interface that is implemented by elements that can have `@Since()`
+/// annotation.
+abstract class HasSinceSdkVersion {
+  /// The version where the associated SDK API was added.
+  ///
+  /// A `@Since()` annotation can be applied to a library declaration,
+  /// any public declaration in a library, or in a class, or to an optional
+  /// parameter, etc.
+  ///
+  /// The returned version is "effective", so that if a library is annotated
+  /// then all elements of the library inherit it; or if a class is annotated
+  /// then all members and constructors of the class inherit it.
+  ///
+  /// If multiple `@Since()` annotations apply to the same element, the latest
+  /// version takes precedence.
+  ///
+  /// Returns `null` if the element is not declared in the SDK, or doesn't have
+  /// a `@Since()` annotation applied to it.
+  Version? get sinceSdkVersion;
+}
+
 /// A combinator that causes some of the names in a namespace to be hidden when
 /// being imported.
 ///
@@ -446,6 +1654,771 @@
   List<String> get hiddenNames;
 }
 
+/// An element whose instance members can refer to `this`.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class InstanceElement2
+    implements
+        TypeDefiningElement2,
+        TypeParameterizedElement2,
+        HasSinceSdkVersion {
+  @override
+  InstanceElement2 get baseElement;
+
+  @override
+  LibraryElement2 get enclosingElement2;
+
+  /// The fields declared in this element.
+  List<FieldElement2> get fields2;
+
+  @override
+  InstanceFragment get firstFragment;
+
+  @override
+  List<InstanceFragment> get fragments;
+
+  /// The getters declared in this element.
+  List<GetterElement> get getters2;
+
+  /// The methods declared in this element.
+  List<MethodElement2> get methods2;
+
+  /// The setters declared in this element.
+  List<SetterElement> get setters2;
+
+  /// The type of a `this` expression.
+  DartType get thisType;
+
+  /// Returns the field from [fields2] that has the given [name].
+  FieldElement2? getField2(String name);
+
+  /// Returns the getter from [getters2] that has the given [name].
+  GetterElement? getGetter2(String name);
+
+  /// Returns the method from [methods2] that has the given [name].
+  MethodElement2? getMethod2(String name);
+
+  /// Returns the setter from [setters2] that has the given [name].
+  SetterElement? getSetter2(String name);
+
+  /// Returns the element representing the getter that results from looking up
+  /// the given [name] in this class with respect to the given [library],
+  /// or `null` if the look up fails.
+  ///
+  /// The behavior of this method is defined by the Dart Language Specification
+  /// in section 17.18 Lookup.
+  GetterElement? lookUpGetter2({
+    required String name,
+    required LibraryElement2 library,
+  });
+
+  /// Returns the element representing the method that results from looking up
+  /// the given [name] in this class with respect to the given [library],
+  /// or `null` if the look up fails.
+  ///
+  /// The behavior of this method is defined by the Dart Language Specification
+  /// in section 17.18 Lookup.
+  MethodElement2? lookUpMethod2({
+    required String name,
+    required LibraryElement2 library,
+  });
+
+  /// Returns the element representing the setter that results from looking up
+  /// the given [name] in this class with respect to the given [library],
+  /// or `null` if the look up fails.
+  ///
+  /// The behavior of this method is defined by the Dart Language Specification
+  /// in section 17.18 Lookup.
+  SetterElement? lookUpSetter2({
+    required String name,
+    required LibraryElement2 library,
+  });
+}
+
+/// The portion of an [InstanceElement2] contributed by a single declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class InstanceFragment
+    implements TypeDefiningFragment, TypeParameterizedFragment {
+  @override
+  InstanceElement2 get element;
+
+  @override
+  LibraryFragment? get enclosingFragment;
+
+  /// The fields declared in this fragment.
+  List<FieldFragment> get fields2;
+
+  /// The getters declared in this fragment.
+  List<GetterFragment> get getters;
+
+  /// Whether the fragment is an augmentation.
+  ///
+  /// If `true`, the declaration has the explicit `augment` modifier.
+  bool get isAugmentation;
+
+  @override
+  LibraryFragment get libraryFragment;
+
+  /// The methods declared in this fragment.
+  List<MethodFragment> get methods2;
+
+  @override
+  InstanceFragment? get nextFragment;
+
+  @override
+  InstanceFragment? get previousFragment;
+
+  /// The setters declared in this fragment.
+  List<SetterFragment> get setters;
+}
+
+/// An element that defines an [InterfaceType].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class InterfaceElement2 implements InstanceElement2 {
+  /// All the supertypes defined for this element and its supertypes.
+  ///
+  /// This includes superclasses, mixins, interfaces, and superclass
+  /// constraints.
+  List<InterfaceType> get allSupertypes;
+
+  /// The constructors defined for this element.
+  ///
+  /// The list is empty for [MixinElement2].
+  List<ConstructorElement2> get constructors2;
+
+  @override
+  InterfaceFragment get firstFragment;
+
+  @override
+  List<InterfaceFragment> get fragments;
+
+  /// Returns a map of all concrete members that this type inherits from
+  /// superclasses and mixins, keyed by the member's [Name].
+  ///
+  /// Members declared in this type have no effect on the map. This means that:
+  /// - If this type contains a member named `foo`, but none of its superclasses
+  ///   or mixins contains a member named `foo`, then there will be no entry for
+  ///   `foo` in the map.
+  /// - If this type contains a member named `foo`, and one of its superclasses
+  ///   or mixins contains a member named `foo`, then there will be an entry for
+  ///   `foo` in this map, pointing to the declaration inherited from the
+  ///   superclass or mixin.
+  ///
+  /// This method is potentially expensive, since it needs to consider all
+  /// possible inherited names. If you only need to look up a certain specific
+  /// name (or names), use [getInheritedConcreteMember] instead.
+  Map<Name, ExecutableElement2> get inheritedConcreteMembers;
+
+  /// Returns a map of all members that this type inherits from supertypes via
+  /// `extends`, `with`, `implements`, or `on` clauses, keyed by the member's
+  /// [Name].
+  ///
+  /// Members declared in this type have no effect on the map. This means that:
+  /// - If this type contains a member named `foo`, but none of its supertypes
+  ///   contains a member named `foo`, then there will be no entry for `foo` in
+  ///   the map.
+  /// - If this type contains a member named `foo`, and one of its supertypes
+  ///   contains a member named `foo`, then there will be an entry for `foo` in
+  ///   this map, pointing to the declaration inherited from the supertype.
+  ///
+  /// This method is potentially expensive, since it needs to consider all
+  /// possible inherited names. If you only need to look up a certain specific
+  /// name (or names), use [getInheritedMember] instead.
+  Map<Name, ExecutableElement2> get inheritedMembers;
+
+  /// Returns a map of all members in the type's interface, keyed by the
+  /// member's [Name].
+  ///
+  /// Note that some names are not declared directly on [thisType], but are
+  /// inherited from supertypes.
+  ///
+  /// This method is potentially expensive, since it needs to consider all
+  /// possible interface names. If you only need to look up a certain specific
+  /// name (or names), use [getInterfaceMember] instead.
+  Map<Name, ExecutableElement2> get interfaceMembers;
+
+  /// The interfaces that are implemented by this class.
+  ///
+  /// <b>Note:</b> Because the element model represents the state of the code,
+  /// it is possible for it to be semantically invalid. In particular, it is not
+  /// safe to assume that the inheritance structure of a class does not contain
+  /// a cycle. Clients that traverse the inheritance structure must explicitly
+  /// guard against infinite loops.
+  List<InterfaceType> get interfaces;
+
+  /// The mixins that are applied to the class being extended in order to
+  /// derive the superclass of this class.
+  ///
+  /// [ClassElement2] and [EnumElement2] can have mixins.
+  ///
+  /// [MixinElement2] cannot have mixins, so an empty list is returned.
+  ///
+  /// <b>Note:</b> Because the element model represents the state of the code,
+  /// it is possible for it to be semantically invalid. In particular, it is not
+  /// safe to assume that the inheritance structure of a class does not contain
+  /// a cycle. Clients that traverse the inheritance structure must explicitly
+  /// guard against infinite loops.
+  List<InterfaceType> get mixins;
+
+  /// The superclass of this element.
+  ///
+  /// For [ClassElement2] returns `null` only if this class is `Object`. If the
+  /// superclass is not explicitly specified, or the superclass cannot be
+  /// resolved, then the implicit superclass `Object` is returned.
+  ///
+  /// For [EnumElement2] returns `Enum` from `dart:core`.
+  ///
+  /// For [MixinElement2] always returns `null`.
+  ///
+  /// <b>Note:</b> Because the element model represents the state of the code,
+  /// it is possible for it to be semantically invalid. In particular, it is not
+  /// safe to assume that the inheritance structure of a class does not contain
+  /// a cycle. Clients that traverse the inheritance structure must explicitly
+  /// guard against infinite loops.
+  InterfaceType? get supertype;
+
+  @override
+  InterfaceType get thisType;
+
+  /// The unnamed constructor declared directly in this class.
+  ///
+  /// If the class does not declare any constructors, a synthetic default
+  /// constructor will be returned.
+  ConstructorElement2? get unnamedConstructor2;
+
+  /// Returns the most specific member with the given [name] that this type
+  /// inherits from a superclass or mixin.
+  ///
+  /// Returns `null` if no member is inherited.
+  ///
+  /// This method is semantically equivalent to calling
+  /// [inheritedConcreteMembers] and then using the `[]` operator, but it
+  /// potentially has better performance, since it does not need to consider all
+  /// possible inherited names.
+  ExecutableElement2? getInheritedConcreteMember(Name name);
+
+  /// Returns the most specific member with the given [name] that this type
+  /// inherits from a supertype via an `extends`, `with`, `implements`, or `on`
+  /// clause.
+  ///
+  /// Returns `null` if no member is inherited because the member is not
+  /// declared at all, or because there is no the most specific signature.
+  ///
+  /// This method is semantically equivalent to calling [inheritedMembers] and
+  /// then using the `[]` operator, but it potentially has better performance,
+  /// since it does not need to consider all possible inherited names.
+  ExecutableElement2? getInheritedMember(Name name);
+
+  /// Returns the most specific member with the given [name] in this type's
+  /// interface.
+  ///
+  /// Returns `null` if there is no member with the given [name] in this type's
+  /// interface, either because the member is not declared at all, or because of
+  /// a conflict between inherited members.
+  ///
+  /// This method is semantically equivalent to calling [interfaceMembers] and
+  /// then using the `[]` operator, but it potentially has better performance,
+  /// since it does not need to consider all possible interface names.
+  ExecutableElement2? getInterfaceMember(Name name);
+
+  /// Returns the constructor from [constructors2] that has the given [name].
+  ConstructorElement2? getNamedConstructor2(String name);
+
+  /// Returns all members of mixins, superclasses, and interfaces that a member
+  /// with the given [name], defined in this element, would override; or `null`
+  /// if no members would be overridden.
+  ///
+  /// Transitive overrides are not included unless there is a direct path to
+  /// them. For example, if classes `A`, `B`, and `C` are defined as follows:
+  ///
+  ///     class A { void m() {} }
+  ///     class B extends A { void m() {} }
+  ///     class C extends B { void m() {} }
+  ///
+  /// Then a [getOverridden] query for name `m` on class `C` would return just a
+  /// single result: the element for `B.m`.
+  ///
+  /// However, if the example were changed so that `class C` both `extends B`
+  /// *and* `implements A`, then a list containing both `A.m` and `B.m` would be
+  /// returned.
+  List<ExecutableElement2>? getOverridden(Name name);
+
+  /// Create the [InterfaceType] for this element with the given
+  /// [typeArguments] and [nullabilitySuffix].
+  InterfaceType instantiate({
+    required List<DartType> typeArguments,
+    required NullabilitySuffix nullabilitySuffix,
+  });
+
+  /// Returns the element representing the method that results from looking up
+  /// the given [methodName] in this class with respect to the given [library],
+  /// ignoring abstract methods, or `null` if the look up fails.
+  ///
+  /// The behavior of this method is defined by the Dart Language Specification
+  /// in section 16.15.1:
+  /// <blockquote>
+  /// The result of looking up method <i>m</i> in class <i>C</i> with respect to
+  /// library <i>L</i> is: If <i>C</i> declares an instance method named
+  /// <i>m</i> that is accessible to <i>L</i>, then that method is the result of
+  /// the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the
+  /// result of the lookup is the result of looking up method <i>m</i> in
+  /// <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
+  /// failed.
+  /// </blockquote>
+  // TODO(scheglov): Deprecate and remove it.
+  MethodElement2? lookUpConcreteMethod(
+    String methodName,
+    LibraryElement2 library,
+  );
+
+  /// Returns the element representing the method that results from looking up
+  /// the given [methodName] in the superclass of this class with respect to the
+  /// given [library], or `null` if the look up fails.
+  ///
+  /// The behavior of this method is defined by the Dart Language Specification
+  /// in section 16.15.1:
+  /// <blockquote>
+  /// The result of looking up method <i>m</i> in class <i>C</i> with respect to
+  /// library <i>L</i> is:  If <i>C</i> declares an instance method named
+  /// <i>m</i> that is accessible to <i>L</i>, then that method is the result of
+  /// the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the
+  /// result of the lookup is the result of looking up method <i>m</i> in
+  /// <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
+  /// failed.
+  /// </blockquote>
+  // TODO(scheglov): Deprecate and remove it.
+  MethodElement2? lookUpInheritedMethod2({
+    required String methodName,
+    required LibraryElement2 library,
+  });
+}
+
+/// The portion of an [InterfaceElement2] contributed by a single declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class InterfaceFragment implements InstanceFragment {
+  /// The constructors declared in this fragment.
+  ///
+  /// The list is empty for [MixinFragment].
+  List<ConstructorFragment> get constructors2;
+
+  @override
+  InterfaceElement2 get element;
+
+  /// The interfaces that are implemented by this fragment.
+  List<InterfaceType> get interfaces;
+
+  /// The mixins that are applied by this fragment.
+  ///
+  /// [ClassFragment] and [EnumFragment] can have mixins.
+  ///
+  /// [MixinFragment] cannot have mixins, so the empty list is returned.
+  List<InterfaceType> get mixins;
+
+  @override
+  InterfaceFragment? get nextFragment;
+
+  @override
+  InterfaceFragment? get previousFragment;
+
+  /// The superclass declared by this fragment.
+  InterfaceType? get supertype;
+}
+
+/// A pattern variable that is a join of other pattern variables, created
+/// for a logical-or patterns, or shared `case` bodies in `switch` statements.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class JoinPatternVariableElement2 implements PatternVariableElement2 {
+  @override
+  JoinPatternVariableFragment get firstFragment;
+
+  @override
+  List<JoinPatternVariableFragment> get fragments;
+
+  /// Whether the [variables2] are consistent.
+  ///
+  /// The variables are consistent if they are present in all branches, and have
+  /// the same type and finality.
+  bool get isConsistent;
+
+  /// The variables that join into this variable.
+  List<PatternVariableElement2> get variables2;
+}
+
+/// The portion of a [JoinPatternVariableElement2] contributed by a single
+/// declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class JoinPatternVariableFragment implements PatternVariableFragment {
+  @override
+  JoinPatternVariableElement2 get element;
+
+  /// Whether the [variables2] are consistent.
+  ///
+  /// The variables are consistent if they are present in all branches, and have
+  /// the same type and finality.
+  bool get isConsistent;
+
+  @override
+  JoinPatternVariableFragment? get nextFragment;
+
+  /// The offset of the first variable in the join.
+  @override
+  int get offset;
+
+  @override
+  JoinPatternVariableFragment? get previousFragment;
+
+  /// The variables that join into this variable.
+  List<PatternVariableFragment> get variables2;
+}
+
+/// A label associated with a statement.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class LabelElement2 implements Element2 {
+  @override
+  // TODO(brianwilkerson): We shouldn't be inheriting this member.
+  ExecutableElement2? get enclosingElement2;
+
+  @override
+  LabelFragment get firstFragment;
+
+  @override
+  List<LabelFragment> get fragments;
+
+  @override
+  LibraryElement2 get library2;
+}
+
+/// The portion of a [LabelElement2] contributed by a single declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class LabelFragment implements Fragment {
+  @override
+  LabelElement2 get element;
+
+  @override
+  LabelFragment? get nextFragment;
+
+  @override
+  LabelFragment? get previousFragment;
+}
+
+/// A library.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class LibraryElement2
+    implements Element2, Annotatable, HasSinceSdkVersion {
+  /// The classes defined in this library.
+  ///
+  /// There is no guarantee of the order in which the classes will be returned.
+  /// In particular, they are not guaranteed to be in lexical order.
+  List<ClassElement2> get classes;
+
+  /// The entry point for this library.
+  ///
+  /// Returns `null` if this library doesn't have an entry point.
+  ///
+  /// The entry point is defined to be a zero, one, or two argument top-level
+  /// function whose name is `main`.
+  TopLevelFunctionElement? get entryPoint2;
+
+  /// The enums defined in this library.
+  ///
+  /// There is no guarantee of the order in which the enums will be returned.
+  /// In particular, they are not guaranteed to be in lexical order.
+  List<EnumElement2> get enums;
+
+  /// The libraries that are exported from this library.
+  ///
+  /// There is no guarantee of the order in which the libraries will be
+  /// returned. In particular, they are not guaranteed to be in lexical order.
+  // TODO(brianwilkerson): Consider removing this from the public API. It isn't
+  //  clear that it's useful, given that it ignores hide and show clauses.
+  List<LibraryElement2> get exportedLibraries2;
+
+  /// The export [Namespace] of this library.
+  Namespace get exportNamespace;
+
+  /// The extensions defined in this library.
+  ///
+  /// There is no guarantee of the order in which the extensions will be
+  /// returned. In particular, they are not guaranteed to be in lexical order.
+  List<ExtensionElement2> get extensions;
+
+  /// The extension types defined in this library.
+  ///
+  /// There is no guarantee of the order in which the extension types will be
+  /// returned. In particular, they are not guaranteed to be in lexical order.
+  List<ExtensionTypeElement2> get extensionTypes;
+
+  /// The set of features available to this library.
+  ///
+  /// Determined by the combination of the language version for the enclosing
+  /// package, enabled experiments, and the presence of a `// @dart` language
+  /// version override comment at the top of the files that make up the library.
+  FeatureSet get featureSet;
+
+  @override
+  LibraryFragment get firstFragment;
+
+  /// The fragments this library consists of.
+  ///
+  /// This includes the defining fragment, and fragments included using the
+  /// `part` directive.
+  @override
+  List<LibraryFragment> get fragments;
+
+  /// The getters defined in this library.
+  ///
+  /// There is no guarantee of the order in which the getters will be returned.
+  /// In particular, they are not guaranteed to be in lexical order.
+  List<GetterElement> get getters;
+
+  /// The identifier that uniquely identifies this element among the children
+  /// of this element's parent.
+  String get identifier;
+
+  /// Whether the library is the `dart:async` library.
+  bool get isDartAsync;
+
+  /// Whether the library is the `dart:core` library.
+  bool get isDartCore;
+
+  /// Whether the library is part of the SDK.
+  bool get isInSdk;
+
+  /// The language version for this library.
+  LibraryLanguageVersion get languageVersion;
+
+  @override
+  LibraryElement2 get library2;
+
+  /// The element representing the synthetic function `loadLibrary`.
+  ///
+  /// Technically the function is implicitly defined for this library only if
+  /// the library is imported using a deferred import, but the element is always
+  /// defined for performance reasons.
+  TopLevelFunctionElement get loadLibraryFunction2;
+
+  /// The mixins defined in this library.
+  ///
+  /// There is no guarantee of the order in which the mixins will be returned.
+  /// In particular, they are not guaranteed to be in lexical order.
+  List<MixinElement2> get mixins;
+
+  /// The public [Namespace] of this library.
+  Namespace get publicNamespace;
+
+  /// The analysis session in which this library is defined.
+  @override
+  AnalysisSession get session;
+
+  /// The setters defined in this library.
+  ///
+  /// There is no guarantee of the order in which the setters will be returned.
+  /// In particular, they are not guaranteed to be in lexical order.
+  List<SetterElement> get setters;
+
+  /// The functions defined in this library.
+  ///
+  /// There is no guarantee of the order in which the functions will be
+  /// returned. In particular, they are not guaranteed to be in lexical order.
+  List<TopLevelFunctionElement> get topLevelFunctions;
+
+  /// The top level variables defined in this library.
+  ///
+  /// There is no guarantee of the order in which the top level variables will
+  /// be returned. In particular, they are not guaranteed to be in lexical
+  /// order.
+  List<TopLevelVariableElement2> get topLevelVariables;
+
+  /// The type aliases defined in this library.
+  ///
+  /// There is no guarantee of the order in which the type aliases will be
+  /// returned. In particular, they are not guaranteed to be in lexical order.
+  List<TypeAliasElement2> get typeAliases;
+
+  /// The [TypeProvider] that is used in this library.
+  TypeProvider get typeProvider;
+
+  /// The [TypeSystem] that is used in this library.
+  TypeSystem get typeSystem;
+
+  /// The canonical URI of the library.
+  ///
+  /// This is the same URI as `firstFragment.source.uri` returns.
+  Uri get uri;
+
+  /// Returns the class defined in this library that has the given [name].
+  ClassElement2? getClass2(String name);
+
+  /// Returns the enum defined in this library that has the given [name].
+  EnumElement2? getEnum2(String name);
+
+  /// Returns the extension defined in this library that has the given [name].
+  ExtensionElement2? getExtension(String name);
+
+  /// Returns the extension type defined in this library that has the
+  /// given [name].
+  ExtensionTypeElement2? getExtensionType(String name);
+
+  /// Returns the getter defined in this library that has the given [name].
+  GetterElement? getGetter(String name);
+
+  /// Returns the mixin defined in this library that has the given [name].
+  MixinElement2? getMixin2(String name);
+
+  /// Returns the setter defined in this library that has the given [name].
+  SetterElement? getSetter(String name);
+
+  /// Returns the function defined in this library that has the given [name].
+  TopLevelFunctionElement? getTopLevelFunction(String name);
+
+  /// Returns the top-level variable defined in this library that has the
+  /// given [name].
+  TopLevelVariableElement2? getTopLevelVariable(String name);
+
+  /// Returns the type alias defined in this library that has the given [name].
+  TypeAliasElement2? getTypeAlias(String name);
+}
+
+/// An `export` directive within a library fragment.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class LibraryExport implements ElementDirective {
+  /// The combinators that were specified as part of the `export` directive.
+  ///
+  /// The combinators are in the order in which they were specified.
+  List<NamespaceCombinator> get combinators;
+
+  /// The [LibraryElement2], if [uri] is a [DirectiveUriWithLibrary].
+  LibraryElement2? get exportedLibrary2;
+
+  /// The offset of the `export` keyword.
+  int get exportKeywordOffset;
+}
+
+/// The portion of a [LibraryElement2] coming from a single compilation unit.
+abstract class LibraryFragment implements Fragment, Annotatable {
+  /// The extension elements accessible within this fragment.
+  List<ExtensionElement2> get accessibleExtensions2;
+
+  /// The fragments of the classes declared in this fragment.
+  List<ClassFragment> get classes2;
+
+  @override
+  LibraryElement2 get element;
+
+  @override
+  LibraryFragment? get enclosingFragment;
+
+  /// The fragments of the enums declared in this fragment.
+  List<EnumFragment> get enums2;
+
+  /// The fragments of the extensions declared in this fragment.
+  List<ExtensionFragment> get extensions2;
+
+  /// The fragments of the extension types declared in this fragment.
+  List<ExtensionTypeFragment> get extensionTypes2;
+
+  /// The fragments of the top-level functions declared in this fragment.
+  List<TopLevelFunctionFragment> get functions2;
+
+  /// The fragments of the top-level getters declared in this fragment.
+  List<GetterFragment> get getters;
+
+  /// The libraries that are imported by this unit.
+  ///
+  /// This includes all of the libraries that are imported using a prefix, and
+  /// those that are imported without a prefix.
+  List<LibraryElement2> get importedLibraries2;
+
+  /// The libraries exported by this unit.
+  List<LibraryExport> get libraryExports2;
+
+  /// The libraries imported by this unit.
+  List<LibraryImport> get libraryImports2;
+
+  /// The [LineInfo] for the fragment.
+  LineInfo get lineInfo;
+
+  /// The fragments of the mixins declared in this fragment.
+  List<MixinFragment> get mixins2;
+
+  @override
+  LibraryFragment? get nextFragment;
+
+  /// If this is the first fragment in the library and the library has `library`
+  /// declaration that specifies a name, the offset of the name; otherwise zero.
+  @override
+  int get offset;
+
+  /// The `part` directives within this fragment.
+  List<PartInclude> get partIncludes;
+
+  /// The prefixes used by [libraryImports2].
+  ///
+  /// Each prefix can be used in more than one `import` directive.
+  List<PrefixElement2> get prefixes;
+
+  @override
+  LibraryFragment? get previousFragment;
+
+  /// The scope used to resolve names within the fragment.
+  ///
+  /// It includes all of the elements that are declared in the library, and all
+  /// of the elements imported into this fragment or parent fragments.
+  Scope get scope;
+
+  /// The fragments of the top-level setters declared in this fragment.
+  List<SetterFragment> get setters;
+
+  /// The source associated with this fragment.
+  Source get source;
+
+  /// The fragments of the top-level variables declared in this fragment.
+  List<TopLevelVariableFragment> get topLevelVariables2;
+
+  /// The fragments of the type aliases declared in this fragment.
+  List<TypeAliasFragment> get typeAliases2;
+}
+
+/// An `import` directive within a library fragment.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class LibraryImport implements ElementDirective {
+  /// The combinators that were specified as part of the `import` directive.
+  ///
+  /// The combinators are in the order in which they were specified.
+  List<NamespaceCombinator> get combinators;
+
+  /// The [LibraryElement2], if [uri] is a [DirectiveUriWithLibrary].
+  LibraryElement2? get importedLibrary2;
+
+  /// The offset of the `import` keyword.
+  int get importKeywordOffset;
+
+  /// Whether this import is synthetic.
+  ///
+  /// A synthetic import is an import that is not represented in the source
+  /// code explicitly, but is implied by the source code. This only happens for
+  /// an implicit import of `dart:core`.
+  bool get isSynthetic;
+
+  /// The [Namespace] that this directive contributes to the containing library.
+  Namespace get namespace;
+
+  /// The prefix fragment that was specified as part of the import directive.
+  ///
+  /// Returns `null` if there was no prefix specified.
+  PrefixFragment? get prefix2;
+}
+
 class LibraryLanguageVersion {
   /// The version for the whole package that contains this library.
   final Version package;
@@ -461,6 +2434,345 @@
   }
 }
 
+/// An element that can be (but is not required to be) defined within a method
+/// or function (an [ExecutableFragment]).
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class LocalElement2 implements Element2 {}
+
+/// The portion of an [LocalElement2] contributed by a single declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class LocalFragment implements Fragment {}
+
+/// A local function.
+///
+/// This can be either a local function, a closure, or the initialization
+/// expression for a field or variable.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class LocalFunctionElement
+    implements ExecutableElement2, LocalElement2 {
+  @override
+  LocalFunctionFragment get firstFragment;
+
+  @override
+  List<LocalFunctionFragment> get fragments;
+}
+
+/// The portion of a [LocalFunctionElement] contributed by a single
+/// declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class LocalFunctionFragment
+    implements ExecutableFragment, LocalFragment {
+  @override
+  LocalFunctionElement get element;
+
+  @override
+  LocalFunctionFragment? get nextFragment;
+
+  /// The offset of the local function name.
+  ///
+  /// If the local function has no name (because it's a function expression),
+  /// this is the offset of the `(` that begins the function expression.
+  @override
+  int get offset;
+
+  @override
+  LocalFunctionFragment? get previousFragment;
+}
+
+/// A local variable.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class LocalVariableElement2
+    implements PromotableElement2, LocalElement2, Annotatable {
+  @override
+  LocalVariableElement2 get baseElement;
+
+  @override
+  LocalVariableFragment get firstFragment;
+
+  @override
+  List<LocalVariableFragment> get fragments;
+
+  /// Whether the variable has an initializer at declaration.
+  bool get hasInitializer;
+}
+
+/// The portion of a [LocalVariableElement2] contributed by a single
+/// declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class LocalVariableFragment
+    implements PromotableFragment, LocalFragment {
+  @override
+  LocalVariableElement2 get element;
+
+  /// Whether the variable has an initializer at declaration.
+  bool get hasInitializer;
+
+  /// The offset of the name in this element.
+  int get nameOffset;
+
+  @override
+  LocalVariableFragment? get nextFragment;
+
+  @override
+  LocalVariableFragment? get previousFragment;
+}
+
+/// The metadata (annotations) associated with an element or fragment.
+abstract class Metadata {
+  /// The annotations associated with the associated element or fragment.
+  ///
+  /// If the metadata is associated with an element that has fragments, the list
+  /// will include all of the annotations from all of the fragments.
+  ///
+  /// The list will be empty if the associated element or fragment does not have
+  /// any annotations or if the library containing the holder has not yet been
+  /// fully resolved.
+  List<ElementAnnotation> get annotations;
+
+  /// Whether the receiver has an annotation of the form `@alwaysThrows`.
+  bool get hasAlwaysThrows;
+
+  /// Whether the receiver has an annotation of the form `@awaitNotRequired`.
+  bool get hasAwaitNotRequired;
+
+  /// Whether the receiver has an annotation of the form `@deprecated`
+  /// or `@Deprecated('..')`.
+  bool get hasDeprecated;
+
+  /// Whether the receiver has an annotation of the form `@doNotStore`.
+  bool get hasDoNotStore;
+
+  /// Whether the receiver has an annotation of the form `@doNotSubmit`.
+  bool get hasDoNotSubmit;
+
+  /// Whether the receiver has an annotation of the form `@factory`.
+  bool get hasFactory;
+
+  /// Whether the receiver has an annotation of the form `@immutable`.
+  bool get hasImmutable;
+
+  /// Whether the receiver has an annotation of the form `@internal`.
+  bool get hasInternal;
+
+  /// Whether the receiver has an annotation of the form `@isTest`.
+  bool get hasIsTest;
+
+  /// Whether the receiver has an annotation of the form `@isTestGroup`.
+  bool get hasIsTestGroup;
+
+  /// Whether the receiver has an annotation of the form `@JS(..)`.
+  bool get hasJS;
+
+  /// Whether the receiver has an annotation of the form `@literal`.
+  bool get hasLiteral;
+
+  /// Whether the receiver has an annotation of the form `@mustBeConst`.
+  bool get hasMustBeConst;
+
+  /// Whether the receiver has an annotation of the form `@mustBeOverridden`.
+  bool get hasMustBeOverridden;
+
+  /// Whether the receiver has an annotation of the form `@mustCallSuper`.
+  bool get hasMustCallSuper;
+
+  /// Whether the receiver has an annotation of the form `@nonVirtual`.
+  bool get hasNonVirtual;
+
+  /// Whether the receiver has an annotation of the form `@optionalTypeArgs`.
+  bool get hasOptionalTypeArgs;
+
+  /// Whether the receiver has an annotation of the form `@override`.
+  bool get hasOverride;
+
+  /// Whether the receiver has an annotation of the form `@protected`.
+  bool get hasProtected;
+
+  /// Whether the receiver has an annotation of the form `@redeclare`.
+  bool get hasRedeclare;
+
+  /// Whether the receiver has an annotation of the form `@reopen`.
+  bool get hasReopen;
+
+  /// Whether the receiver has an annotation of the form `@required`.
+  bool get hasRequired;
+
+  /// Whether the receiver has an annotation of the form `@sealed`.
+  bool get hasSealed;
+
+  /// Whether the receiver has an annotation of the form `@useResult`
+  /// or `@UseResult('..')`.
+  bool get hasUseResult;
+
+  /// Whether the receiver has an annotation of the form `@visibleForOverriding`.
+  bool get hasVisibleForOverriding;
+
+  /// Whether the receiver has an annotation of the form `@visibleForTemplate`.
+  bool get hasVisibleForTemplate;
+
+  /// Whether the receiver has an annotation of the form `@visibleForTesting`.
+  bool get hasVisibleForTesting;
+
+  /// Whether the receiver has an annotation of the form
+  /// `@visibleOutsideTemplate`.
+  bool get hasVisibleOutsideTemplate;
+
+  /// Whether the receiver has an annotation of the form `@widgetFactory`.
+  bool get hasWidgetFactory;
+}
+
+/// A method.
+///
+/// The method can be either an instance method, an operator, or a static
+/// method.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class MethodElement2
+    implements ExecutableElement2, HasSinceSdkVersion {
+  /// The name of the method that can be implemented by a class to allow its
+  /// instances to be invoked as if they were a function.
+  static final String CALL_METHOD_NAME = "call";
+
+  /// The name of the method that will be invoked if an attempt is made to
+  /// invoke an undefined method on an object.
+  static final String NO_SUCH_METHOD_METHOD_NAME = "noSuchMethod";
+
+  @override
+  MethodElement2 get baseElement;
+
+  @override
+  MethodFragment get firstFragment;
+
+  @override
+  List<MethodFragment> get fragments;
+
+  /// Whether the method defines an operator.
+  ///
+  /// The test might be based on the name of the executable element, in which
+  /// case the result will be correct when the name is legal.
+  bool get isOperator;
+}
+
+/// The portion of a [MethodElement2] contributed by a single declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class MethodFragment implements ExecutableFragment {
+  @override
+  MethodElement2 get element;
+
+  @override
+  InstanceFragment? get enclosingFragment;
+
+  @override
+  MethodFragment? get nextFragment;
+
+  @override
+  MethodFragment? get previousFragment;
+}
+
+/// An element that represents a mixin.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class MixinElement2 implements InterfaceElement2 {
+  @override
+  MixinFragment get firstFragment;
+
+  @override
+  List<MixinFragment> get fragments;
+
+  /// Whether the mixin is a base mixin.
+  ///
+  /// A mixin is a base mixin if it has an explicit `base` modifier.
+  /// The base modifier allows a mixin to be mixed in, but not implemented.
+  bool get isBase;
+
+  /// The superclass constraints defined for this mixin.
+  ///
+  /// If the declaration does not have an `on` clause, then the list will
+  /// contain the type for the class `Object`.
+  ///
+  /// <b>Note:</b> Because the element model represents the state of the code,
+  /// it is possible for it to be semantically invalid. In particular, it is not
+  /// safe to assume that the inheritance structure of a class does not contain
+  /// a cycle. Clients that traverse the inheritance structure must explicitly
+  /// guard against infinite loops.
+  List<InterfaceType> get superclassConstraints;
+
+  /// Whether the element, assuming that it is within scope, is
+  /// implementable to classes, mixins, and enums in the given [library].
+  bool isImplementableIn2(LibraryElement2 library);
+}
+
+/// The portion of a [PrefixElement2] contributed by a single declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class MixinFragment implements InterfaceFragment {
+  @override
+  MixinElement2 get element;
+
+  @override
+  MixinFragment? get nextFragment;
+
+  @override
+  MixinFragment? get previousFragment;
+
+  /// The superclass constraints defined for this mixin.
+  ///
+  /// If the declaration does not have an `on` clause, then the list will
+  /// contain the type for the class `Object`.
+  ///
+  /// <b>Note:</b> Because the element model represents the state of the code,
+  /// it is possible for it to be semantically invalid. In particular, it is not
+  /// safe to assume that the inheritance structure of a class does not contain
+  /// a cycle. Clients that traverse the inheritance structure must explicitly
+  /// guard against infinite loops.
+  List<InterfaceType> get superclassConstraints;
+}
+
+/// A pseudo-element that represents multiple elements defined within a single
+/// scope that have the same name. This situation is not allowed by the
+/// language, so objects implementing this interface always represent an error.
+/// As a result, most of the normal operations on elements do not make sense
+/// and will return useless results.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class MultiplyDefinedElement2 implements Element2 {
+  /// The elements that were defined within the scope to have the same name.
+  List<Element2> get conflictingElements2;
+
+  @override
+  MultiplyDefinedFragment get firstFragment;
+
+  @override
+  List<MultiplyDefinedFragment> get fragments;
+}
+
+/// The fragment for a [MultiplyDefinedElement2].
+///
+/// It has no practical use, and exists for consistency, so that the
+/// corresponding element has a fragment.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class MultiplyDefinedFragment implements Fragment {
+  @override
+  MultiplyDefinedElement2 get element;
+
+  @override
+  Null get nextFragment;
+
+  /// Always returns zero.
+  @override
+  int get offset;
+
+  @override
+  Null get previousFragment;
+}
+
 /// An object that controls how namespaces are combined.
 ///
 /// Clients may not extend, implement or mix-in this class.
@@ -473,6 +2785,316 @@
   int get offset;
 }
 
+/// A 'part' directive within a library fragment.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class PartInclude implements ElementDirective {
+  /// The [LibraryFragment], if [uri] is a [DirectiveUriWithUnit].
+  LibraryFragment? get includedFragment;
+}
+
+/// A pattern variable.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class PatternVariableElement2 implements LocalVariableElement2 {
+  @override
+  PatternVariableFragment get firstFragment;
+
+  @override
+  List<PatternVariableFragment> get fragments;
+
+  /// The variable in which this variable joins with other pattern variables
+  /// with the same name, in a logical-or pattern, or shared case scope.
+  JoinPatternVariableElement2? get join2;
+}
+
+/// The portion of a [PatternVariableElement2] contributed by a single
+/// declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class PatternVariableFragment implements LocalVariableFragment {
+  @override
+  PatternVariableElement2 get element;
+
+  /// The variable in which this variable joins with other pattern variables
+  /// with the same name, in a logical-or pattern, or shared case scope.
+  JoinPatternVariableFragment? get join2;
+
+  @override
+  PatternVariableFragment? get nextFragment;
+
+  @override
+  PatternVariableFragment? get previousFragment;
+}
+
+/// A prefix used to import one or more libraries into another library.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class PrefixElement2 implements Element2 {
+  /// There is no enclosing element for import prefixes, which are elements,
+  /// but exist inside a single [LibraryFragment], not an element.
+  @override
+  Null get enclosingElement2;
+
+  @override
+  PrefixFragment get firstFragment;
+
+  @override
+  List<PrefixFragment> get fragments;
+
+  /// The imports that share this prefix.
+  List<LibraryImport> get imports;
+
+  @override
+  LibraryElement2 get library2;
+
+  /// The name lookup scope for this import prefix.
+  ///
+  /// It consists of elements imported into the enclosing library with this
+  /// prefix. The namespace combinators of the import directives are taken
+  /// into account.
+  Scope get scope;
+}
+
+/// The portion of a [PrefixElement2] contributed by a single declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class PrefixFragment implements Fragment {
+  @override
+  PrefixElement2 get element;
+
+  @override
+  LibraryFragment? get enclosingFragment;
+
+  /// Whether the [LibraryImport] is deferred.
+  bool get isDeferred;
+
+  @override
+  PrefixFragment? get nextFragment;
+
+  @override
+  PrefixFragment? get previousFragment;
+}
+
+/// A variable that might be subject to type promotion.  This might be a local
+/// variable or a parameter.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class PromotableElement2 implements VariableElement2 {
+  @override
+  PromotableFragment get firstFragment;
+
+  @override
+  List<PromotableFragment> get fragments;
+}
+
+/// The portion of a [PromotableElement2] contributed by a single declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class PromotableFragment implements VariableFragment {
+  @override
+  PromotableElement2 get element;
+
+  @override
+  PromotableFragment? get nextFragment;
+
+  @override
+  PromotableFragment? get previousFragment;
+}
+
+/// A getter or a setter.
+///
+/// Property accessors can either be defined explicitly or they can be induced
+/// by either a top-level variable or a field. Induced property accessors are
+/// synthetic.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class PropertyAccessorElement2 implements ExecutableElement2 {
+  @override
+  PropertyAccessorElement2 get baseElement;
+
+  @override
+  Element2 get enclosingElement2;
+
+  @override
+  PropertyAccessorFragment get firstFragment;
+
+  @override
+  List<PropertyAccessorFragment> get fragments;
+
+  /// The field or top-level variable associated with this getter.
+  ///
+  /// If this getter was explicitly defined (is not synthetic) then the variable
+  /// associated with it will be synthetic.
+  PropertyInducingElement2? get variable3;
+}
+
+/// The portion of a [GetterElement] contributed by a single declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class PropertyAccessorFragment implements ExecutableFragment {
+  @override
+  PropertyAccessorElement2 get element;
+
+  @override
+  PropertyAccessorFragment? get nextFragment;
+
+  @override
+  PropertyAccessorFragment? get previousFragment;
+
+  /// The field or top-level variable associated with this property accessors.
+  ///
+  /// If this property accessor was explicitly defined (is not synthetic) then
+  /// the variable associated with it will be synthetic.
+  PropertyInducingFragment? get variable3;
+}
+
+/// A variable that has an associated getter and possibly a setter. Note that
+/// explicitly defined variables implicitly define a synthetic getter and that
+/// non-`final` explicitly defined variables implicitly define a synthetic
+/// setter. Symmetrically, synthetic fields are implicitly created for
+/// explicitly defined getters and setters. The following rules apply:
+///
+/// * Every explicit variable is represented by a non-synthetic
+///   [PropertyInducingElement2].
+/// * Every explicit variable induces a synthetic [GetterElement],
+///   possibly a synthetic [SetterElement.
+/// * Every explicit getter by a non-synthetic [GetterElement].
+/// * Every explicit setter by a non-synthetic [SetterElement].
+/// * Every explicit getter or setter (or pair thereof if they have the same
+///   name) induces a variable that is represented by a synthetic
+///   [PropertyInducingElement2].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class PropertyInducingElement2
+    implements VariableElement2, Annotatable, HasSinceSdkVersion {
+  @override
+  PropertyInducingFragment get firstFragment;
+
+  @override
+  List<PropertyInducingFragment> get fragments;
+
+  /// The getter associated with this variable.
+  ///
+  /// If this variable was explicitly defined (is not synthetic) then the
+  /// getter associated with it will be synthetic.
+  GetterElement? get getter2;
+
+  /// Whether any fragment of this variable has an initializer at declaration.
+  bool get hasInitializer;
+
+  @override
+  LibraryElement2 get library2;
+
+  /// The setter associated with this variable.
+  ///
+  /// Returns `null` if the variable is effectively `final` and therefore does
+  /// not have a setter associated with it.
+  ///
+  /// This can happen either because the variable is explicitly defined as
+  /// being `final` or because the variable is induced by an explicit getter
+  /// that does not have a corresponding setter. If this variable was
+  /// explicitly defined (is not synthetic) then the setter associated with
+  /// it will be synthetic.
+  SetterElement? get setter2;
+}
+
+/// The portion of a [PropertyInducingElement2] contributed by a single
+/// declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class PropertyInducingFragment
+    implements VariableFragment, Annotatable {
+  @override
+  PropertyInducingElement2 get element;
+
+  /// The getter associated with this variable.
+  ///
+  /// If this variable was explicitly defined (is not synthetic) then the
+  /// getter associated with it will be synthetic.
+  GetterFragment? get getter2;
+
+  /// Whether the variable has an initializer at declaration.
+  bool get hasInitializer;
+
+  /// Whether the element is an augmentation.
+  ///
+  /// Property inducing fragments are augmentations if they are explicitly
+  /// marked as such using the 'augment' modifier.
+  bool get isAugmentation;
+
+  /// Whether this fragment is synthetic.
+  ///
+  /// A synthetic fragment is a fragment that is not represented in the source
+  /// code explicitly, but is implied by the source code, such as the default
+  /// constructor for a class that does not explicitly define any constructors.
+  bool get isSynthetic;
+
+  @override
+  LibraryFragment get libraryFragment;
+
+  @override
+  PropertyInducingFragment? get nextFragment;
+
+  @override
+  PropertyInducingFragment? get previousFragment;
+
+  /// The setter associated with this variable.
+  ///
+  /// Returns `null` if the variable is effectively `final` and therefore
+  /// doesn't have a setter associated with it.
+  ///
+  /// This can happen either because the variable is explicitly defined as
+  /// being `final` or because the variable is induced by an explicit getter
+  /// that does not have a corresponding setter. If this variable was
+  /// explicitly defined (is not synthetic) then the setter associated with
+  /// it will be synthetic.
+  SetterFragment? get setter2;
+}
+
+/// A setter.
+///
+/// Setters can either be defined explicitly or they can be induced by either a
+/// top-level variable or a field. Induced setters are synthetic.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class SetterElement implements PropertyAccessorElement2 {
+  @override
+  SetterElement get baseElement;
+
+  /// The getter that corresponds to (has the same name as) this setter, or
+  /// `null` if there is no corresponding getter.
+  GetterElement? get correspondingGetter2;
+
+  @override
+  SetterFragment get firstFragment;
+
+  @override
+  List<SetterFragment> get fragments;
+}
+
+/// The portion of a [SetterElement] contributed by a single declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class SetterFragment implements PropertyAccessorFragment {
+  @override
+  SetterElement get element;
+
+  @override
+  SetterFragment? get nextFragment;
+
+  /// The offset of the setter name.
+  ///
+  /// If the setter is implicit (because it's induced by a field or top level
+  /// variable declaration), this is the offset of the field or top level
+  /// variable name.
+  @override
+  int get offset;
+
+  @override
+  SetterFragment? get previousFragment;
+}
+
 /// A combinator that cause some of the names in a namespace to be visible (and
 /// the rest hidden) when being imported.
 ///
@@ -482,3 +3104,384 @@
   /// are defined in the imported library.
   List<String> get shownNames;
 }
+
+/// A super formal parameter.
+///
+/// Super formal parameters can only be defined within a constructor element.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class SuperFormalParameterElement2 implements FormalParameterElement {
+  @override
+  SuperFormalParameterFragment get firstFragment;
+
+  @override
+  List<SuperFormalParameterFragment> get fragments;
+
+  /// The associated super-constructor parameter, from the super-constructor
+  /// that is referenced by the implicit or explicit super-constructor
+  /// invocation.
+  ///
+  /// Can be `null` for erroneous code - not existing super-constructor,
+  /// no corresponding parameter in the super-constructor.
+  FormalParameterElement? get superConstructorParameter2;
+}
+
+/// The portion of a [SuperFormalParameterElement2] contributed by a single
+/// declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class SuperFormalParameterFragment implements FormalParameterFragment {
+  @override
+  SuperFormalParameterElement2 get element;
+
+  @override
+  SuperFormalParameterFragment? get nextFragment;
+
+  @override
+  SuperFormalParameterFragment? get previousFragment;
+}
+
+/// A top-level function.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TopLevelFunctionElement
+    implements ExecutableElement2, HasSinceSdkVersion {
+  /// The name of the function used as an entry point.
+  static const String MAIN_FUNCTION_NAME = "main";
+
+  /// The name of the synthetic function defined for libraries that are
+  /// deferred.
+  static final String LOAD_LIBRARY_NAME = "loadLibrary";
+
+  @override
+  TopLevelFunctionElement get baseElement;
+
+  @override
+  TopLevelFunctionFragment get firstFragment;
+
+  @override
+  List<TopLevelFunctionFragment> get fragments;
+
+  /// Whether the function represents `identical` from the `dart:core` library.
+  bool get isDartCoreIdentical;
+
+  /// Whether the function is an entry point.
+  ///
+  /// A top-level function is an entry point if it has the name `main`.
+  bool get isEntryPoint;
+}
+
+/// The portion of a [TopLevelFunctionElement] contributed by a single
+/// declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TopLevelFunctionFragment implements ExecutableFragment {
+  @override
+  TopLevelFunctionElement get element;
+
+  @override
+  TopLevelFunctionFragment? get nextFragment;
+
+  @override
+  TopLevelFunctionFragment? get previousFragment;
+}
+
+/// A top-level variable.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TopLevelVariableElement2 implements PropertyInducingElement2 {
+  @override
+  TopLevelVariableElement2 get baseElement;
+
+  @override
+  TopLevelVariableFragment get firstFragment;
+
+  @override
+  List<TopLevelVariableFragment> get fragments;
+
+  /// Whether the field was explicitly marked as being external.
+  bool get isExternal;
+}
+
+/// The portion of a [TopLevelVariableElement2] contributed by a single
+/// declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TopLevelVariableFragment implements PropertyInducingFragment {
+  @override
+  TopLevelVariableElement2 get element;
+
+  @override
+  TopLevelVariableFragment? get nextFragment;
+
+  @override
+  TopLevelVariableFragment? get previousFragment;
+}
+
+/// A type alias (`typedef`).
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TypeAliasElement2
+    implements
+        TypeParameterizedElement2,
+        TypeDefiningElement2,
+        HasSinceSdkVersion {
+  /// If the aliased type has structure, return the corresponding element.
+  /// For example, it could be [GenericFunctionTypeElement2].
+  ///
+  /// If there is no structure, return `null`.
+  Element2? get aliasedElement2;
+
+  /// The aliased type.
+  ///
+  /// If non-function type aliases feature is enabled for the enclosing library,
+  /// this type might be just anything. If the feature is disabled, return
+  /// a [FunctionType].
+  DartType get aliasedType;
+
+  @override
+  LibraryElement2 get enclosingElement2;
+
+  @override
+  TypeAliasFragment get firstFragment;
+
+  @override
+  List<TypeAliasFragment> get fragments;
+
+  /// Returns the type resulting from instantiating this typedef with the given
+  /// [typeArguments] and [nullabilitySuffix].
+  ///
+  /// Note that this always instantiates the typedef itself, so for a
+  /// [TypeAliasElement2] the returned [DartType] might still be a generic
+  /// type, with type formals. For example, if the typedef is:
+  ///
+  ///     typedef F<T> = void Function<U>(T, U);
+  ///
+  /// then `F<int>` will produce `void Function<U>(int, U)`.
+  DartType instantiate({
+    required List<DartType> typeArguments,
+    required NullabilitySuffix nullabilitySuffix,
+  });
+}
+
+/// The portion of a [TypeAliasElement2] contributed by a single declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TypeAliasFragment
+    implements TypeParameterizedFragment, TypeDefiningFragment {
+  @override
+  TypeAliasElement2 get element;
+
+  @override
+  LibraryFragment? get enclosingFragment;
+
+  @override
+  TypeAliasFragment? get nextFragment;
+
+  @override
+  TypeAliasFragment? get previousFragment;
+}
+
+/// An element that defines a type.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TypeDefiningElement2 implements Element2, Annotatable {
+  // TODO(brianwilkerson): Evaluate to see whether this type is actually needed
+  //  after converting clients to the new API.
+
+  @override
+  TypeDefiningFragment get firstFragment;
+
+  @override
+  List<TypeDefiningFragment> get fragments;
+}
+
+/// The portion of a [TypeDefiningElement2] contributed by a single declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TypeDefiningFragment implements Fragment, Annotatable {
+  @override
+  TypeDefiningElement2 get element;
+
+  @override
+  TypeDefiningFragment? get nextFragment;
+
+  /// The offset of the type name.
+  ///
+  /// If the type in the language specification and not in any source file
+  /// (e.g., `dynamic`), this value is zero.
+  @override
+  int get offset;
+
+  @override
+  TypeDefiningFragment? get previousFragment;
+}
+
+/// A type parameter.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TypeParameterElement2 implements TypeDefiningElement2 {
+  @override
+  TypeParameterElement2 get baseElement;
+
+  /// The type representing the bound associated with this parameter.
+  ///
+  /// Returns `null` if this parameter does not have an explicit bound. Being
+  /// able to distinguish between an implicit and explicit bound is needed by
+  /// the instantiate to bounds algorithm.`
+  DartType? get bound;
+
+  @override
+  TypeParameterFragment get firstFragment;
+
+  @override
+  List<TypeParameterFragment> get fragments;
+
+  /// Returns the [TypeParameterType] with the given [nullabilitySuffix] for
+  /// this type parameter.
+  TypeParameterType instantiate({required NullabilitySuffix nullabilitySuffix});
+}
+
+/// The portion of a [TypeParameterElement2] contributed by a single
+/// declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TypeParameterFragment implements TypeDefiningFragment {
+  @override
+  TypeParameterElement2 get element;
+
+  @override
+  TypeParameterFragment? get nextFragment;
+
+  @override
+  TypeParameterFragment? get previousFragment;
+}
+
+/// An element that has type parameters, such as a class, typedef, or method.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TypeParameterizedElement2 implements Element2, Annotatable {
+  @override
+  TypeParameterizedFragment get firstFragment;
+
+  @override
+  List<TypeParameterizedFragment> get fragments;
+
+  /// If the element defines a type, indicates whether the type may safely
+  /// appear without explicit type arguments as the bounds of a type parameter
+  /// declaration.
+  ///
+  /// If the element does not define a type, returns `true`.
+  bool get isSimplyBounded;
+
+  @override
+  LibraryElement2 get library2;
+
+  /// The type parameters declared by this element directly.
+  ///
+  /// This does not include type parameters that are declared by any enclosing
+  /// elements.
+  List<TypeParameterElement2> get typeParameters2;
+}
+
+/// The portion of a [TypeParameterizedElement2] contributed by a single
+/// declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TypeParameterizedFragment implements Fragment, Annotatable {
+  @override
+  TypeParameterizedElement2 get element;
+
+  @override
+  TypeParameterizedFragment? get nextFragment;
+
+  @override
+  TypeParameterizedFragment? get previousFragment;
+
+  /// The type parameters declared by this fragment directly.
+  ///
+  /// This does not include type parameters that are declared by any enclosing
+  /// fragments.
+  List<TypeParameterFragment> get typeParameters2;
+}
+
+/// A variable.
+///
+/// There are more specific subclasses for more specific kinds of variables.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class VariableElement2 implements Element2 {
+  /// The constant initializer for this constant variable, or the default
+  /// value for this formal parameter.
+  ///
+  /// Is `null` if this variable is not a constant, or does not have the
+  /// initializer or the default value specified.
+  ConstantInitializer? get constantInitializer2;
+
+  @override
+  VariableFragment get firstFragment;
+
+  @override
+  List<VariableFragment> get fragments;
+
+  /// Whether the variable element did not have an explicit type specified
+  /// for it.
+  bool get hasImplicitType;
+
+  /// Whether the variable was declared with the 'const' modifier.
+  bool get isConst;
+
+  /// Whether the variable was declared with the 'final' modifier.
+  ///
+  /// Variables that are declared with the 'const' modifier will return `false`
+  /// even though they are implicitly final.
+  bool get isFinal;
+
+  /// Whether the variable uses late evaluation semantics.
+  bool get isLate;
+
+  /// Whether the element is a static variable, as per section 8 of the Dart
+  /// Language Specification:
+  ///
+  /// > A static variable is a variable that is not associated with a particular
+  /// > instance, but rather with an entire library or class. Static variables
+  /// > include library variables and class variables. Class variables are
+  /// > variables whose declaration is immediately nested inside a class
+  /// > declaration and includes the modifier static. A library variable is
+  /// > implicitly static.
+  bool get isStatic;
+
+  /// The declared type of this variable.
+  DartType get type;
+
+  /// Returns a representation of the value of this variable.
+  ///
+  /// If the value had not previously been computed, it will be computed as a
+  /// result of invoking this method.
+  ///
+  /// Returns `null` if either this variable was not declared with the 'const'
+  /// modifier or if the value of this variable could not be computed because of
+  /// errors.
+  DartObject? computeConstantValue();
+}
+
+/// The portion of a [VariableElement2] contributed by a single declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class VariableFragment implements Fragment {
+  @override
+  VariableElement2 get element;
+
+  /// The initializer for this constant variable fragment, or the default value
+  /// for this formal parameter fragment.
+  ///
+  /// Is `null` if this variable fragment is not a constant, or does not have
+  /// the initializer or the default value specified.
+  Expression? get initializer;
+
+  @override
+  VariableFragment? get nextFragment;
+
+  @override
+  VariableFragment? get previousFragment;
+}
diff --git a/pkg/analyzer/lib/dart/element/element2.dart b/pkg/analyzer/lib/dart/element/element2.dart
index 4343e0d..ea1b25d 100644
--- a/pkg/analyzer/lib/dart/element/element2.dart
+++ b/pkg/analyzer/lib/dart/element/element2.dart
@@ -46,3021 +46,4 @@
 /// @docImport 'package:analyzer/src/dart/element/member.dart';
 library;
 
-import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/analysis/session.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/constant/value.dart';
-import 'package:analyzer/dart/element/element.dart'
-    show
-        DirectiveUri,
-        ElementAnnotation,
-        ElementKind,
-        LibraryLanguageVersion,
-        NamespaceCombinator;
-import 'package:analyzer/dart/element/nullability_suffix.dart';
-import 'package:analyzer/dart/element/scope.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/dart/element/type_provider.dart';
-import 'package:analyzer/dart/element/type_system.dart';
-import 'package:analyzer/source/line_info.dart';
-import 'package:analyzer/source/source.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager3.dart' show Name;
-import 'package:analyzer/src/dart/resolver/scope.dart';
-import 'package:pub_semver/pub_semver.dart';
-
-export 'package:analyzer/dart/element/element.dart'
-    show
-        DirectiveUri,
-        DirectiveUriWithLibrary,
-        DirectiveUriWithRelativeUri,
-        DirectiveUriWithRelativeUriString,
-        DirectiveUriWithSource,
-        DirectiveUriWithUnit,
-        ElementAnnotation,
-        ElementKind,
-        ElementLocation,
-        HideElementCombinator,
-        NamespaceCombinator,
-        ShowElementCombinator;
-export 'package:analyzer/src/dart/element/inheritance_manager3.dart' show Name;
-
-/// An element or fragment that can have either annotations (metadata), a
-/// documentation comment, or both associated with it.
-abstract class Annotatable {
-  /// The content of the documentation comment (including delimiters) for this
-  /// element or fragment.
-  ///
-  /// If the receiver is an element that has fragments, the comment will be a
-  /// concatenation of the comments from all of the fragments.
-  ///
-  /// Returns `null` if the receiver doesn't have documentation.
-  String? get documentationComment;
-
-  /// The metadata associated with the element or fragment.
-  ///
-  /// If the receiver is an element that has fragments, the list will include
-  /// all of the metadata from all of the fragments.
-  ///
-  /// The list will be empty if the receiver does not have any metadata or if
-  /// the library containing this element has not yet been fully resolved.
-  Metadata get metadata2;
-}
-
-/// A pattern variable that is explicitly declared.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class BindPatternVariableElement2 implements PatternVariableElement2 {
-  @override
-  BindPatternVariableFragment get firstFragment;
-
-  @override
-  List<BindPatternVariableFragment> get fragments;
-}
-
-/// The portion of a [BindPatternVariableElement2] contributed by a single
-/// declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class BindPatternVariableFragment implements PatternVariableFragment {
-  @override
-  BindPatternVariableElement2 get element;
-
-  @override
-  BindPatternVariableFragment? get nextFragment;
-
-  @override
-  BindPatternVariableFragment? get previousFragment;
-}
-
-/// A class.
-///
-/// The class can be defined by either a class declaration (with a class body),
-/// or a mixin application (without a class body).
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class ClassElement2 implements InterfaceElement2 {
-  @override
-  ClassFragment get firstFragment;
-
-  @override
-  List<ClassFragment> get fragments;
-
-  /// Whether the class or its superclass declares a non-final instance field.
-  bool get hasNonFinalField;
-
-  /// Whether the class is abstract.
-  ///
-  /// A class is abstract if it has an explicit `abstract` modifier. Note, that
-  /// this definition of <i>abstract</i> is different from <i>has unimplemented
-  /// members</i>.
-  bool get isAbstract;
-
-  /// Whether this class is a base class.
-  ///
-  /// A class is a base class if it has an explicit `base` modifier, or the
-  /// class has a `base` induced modifier and [isSealed] is `true` as well.
-  /// The base modifier allows the class to be extended but not implemented.
-  bool get isBase;
-
-  /// Whether the class can be instantiated.
-  bool get isConstructable;
-
-  /// Whether the class represents the class 'Enum' defined in `dart:core`.
-  bool get isDartCoreEnum;
-
-  /// Whether the class represents the class 'Object' defined in `dart:core`.
-  bool get isDartCoreObject;
-
-  /// Whether the class is exhaustive.
-  ///
-  /// A class is exhaustive if it has the property where, in a switch, if you
-  /// cover all of the subtypes of this element, then the compiler knows that
-  /// you have covered all possible instances of the type.
-  bool get isExhaustive;
-
-  /// Whether the class is a final class.
-  ///
-  /// A class is a final class if it has an explicit `final` modifier, or the
-  /// class has a `final` induced modifier and [isSealed] is `true` as well.
-  /// The final modifier prohibits this class from being extended, implemented,
-  /// or mixed in.
-  bool get isFinal;
-
-  /// Whether the class is an interface class.
-  ///
-  /// A class is an interface class if it has an explicit `interface` modifier,
-  /// or the class has an `interface` induced modifier and [isSealed] is `true`
-  /// as well. The interface modifier allows the class to be implemented, but
-  /// not extended or mixed in.
-  bool get isInterface;
-
-  /// Whether the class is a mixin application.
-  ///
-  /// A class is a mixin application if it was declared using the syntax
-  /// `class A = B with C;`.
-  bool get isMixinApplication;
-
-  /// Whether the class is a mixin class.
-  ///
-  /// A class is a mixin class if it has an explicit `mixin` modifier.
-  bool get isMixinClass;
-
-  /// Whether the class is a sealed class.
-  ///
-  /// A class is a sealed class if it has an explicit `sealed` modifier.
-  bool get isSealed;
-
-  /// Whether the class can validly be used as a mixin when defining another
-  /// class.
-  ///
-  /// For classes defined by a class declaration or a mixin application, the
-  /// behavior of this method is defined by the Dart Language Specification
-  /// in section 9:
-  /// <blockquote>
-  /// It is a compile-time error if a declared or derived mixin refers to super.
-  /// It is a compile-time error if a declared or derived mixin explicitly
-  /// declares a constructor. It is a compile-time error if a mixin is derived
-  /// from a class whose superclass is not Object.
-  /// </blockquote>
-  bool get isValidMixin;
-
-  /// Whether the class, assuming that it is within scope, can be extended by
-  /// classes in the given [library].
-  bool isExtendableIn2(LibraryElement2 library);
-
-  /// Whether the class, assuming that it is within scope, can be implemented by
-  /// classes, mixins, and enums in the given [library].
-  bool isImplementableIn2(LibraryElement2 library);
-
-  /// Whether the class, assuming that it is within scope, can be mixed-in by
-  /// classes and enums in the given [library].
-  bool isMixableIn2(LibraryElement2 library);
-}
-
-/// The portion of a [ClassElement2] contributed by a single declaration.
-///
-/// The fragment can be defined by either a class declaration (with a class
-/// body), or a mixin application (without a class body).
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class ClassFragment implements InterfaceFragment {
-  @override
-  ClassElement2 get element;
-
-  @override
-  ClassFragment? get nextFragment;
-
-  @override
-  ClassFragment? get previousFragment;
-}
-
-/// The initializer of a constant variable, or the default value for a formal
-/// parameter.
-abstract class ConstantInitializer {
-  /// The expression of the initializer.
-  ///
-  /// For variables that have multiple fragments, this is the expression from
-  /// the last fragment. For formal parameters, only the first fragment can
-  /// have the default value.
-  Expression get expression;
-
-  /// The [VariableFragment] that has [expression].
-  ///
-  /// The offsets are inside the [LibraryFragment] that contains [fragment].
-  VariableFragment get fragment;
-
-  /// Returns the result of evaluating [expression], computes it if necessary.
-  ///
-  /// Returns `null` if the value could not be computed because of errors.
-  DartObject? evaluate();
-}
-
-/// An element representing a constructor defined by a class, enum, or extension
-/// type.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class ConstructorElement2
-    implements ExecutableElement2, HasSinceSdkVersion {
-  @override
-  ConstructorElement2 get baseElement;
-
-  @override
-  InterfaceElement2 get enclosingElement2;
-
-  @override
-  ConstructorFragment get firstFragment;
-
-  @override
-  List<ConstructorFragment> get fragments;
-
-  /// Whether the constructor is a const constructor.
-  bool get isConst;
-
-  /// Whether the constructor can be used as a default constructor - unnamed,
-  /// and has no required parameters.
-  bool get isDefaultConstructor;
-
-  /// Whether the constructor represents a factory constructor.
-  bool get isFactory;
-
-  /// Whether the constructor represents a generative constructor.
-  bool get isGenerative;
-
-  /// The name of this constructor.
-  ///
-  /// The name of the unnamed constructor is `new`.
-  @override
-  String? get name3;
-
-  /// The constructor to which this constructor is redirecting.
-  ///
-  /// Returns `null` if this constructor does not redirect to another
-  /// constructor or if the library containing this constructor has not yet been
-  /// resolved.
-  ConstructorElement2? get redirectedConstructor2;
-
-  @override
-  InterfaceType get returnType;
-
-  /// The constructor of the superclass that this constructor invokes, or
-  /// `null` if this constructor redirects to another constructor, or if the
-  /// library containing this constructor has not yet been resolved.
-  ConstructorElement2? get superConstructor2;
-}
-
-/// The portion of a [ConstructorElement2] contributed by a single declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class ConstructorFragment implements ExecutableFragment {
-  @override
-  ConstructorElement2 get element;
-
-  @override
-  InstanceFragment? get enclosingFragment;
-
-  @override
-  String get name2;
-
-  @override
-  ConstructorFragment? get nextFragment;
-
-  /// The offset of the constructor name.
-  ///
-  /// For a named constructor (e.g., `ClassName.foo()``), this is the offset to
-  /// the part of the constructor name that follows the `.`. For an unnamed
-  /// constructor (e.g., `ClassName();`), this is the offset of the class name
-  /// that appears in the constructor declaration.
-  ///
-  /// For an implicit constructor, this is the offset of the class name in the
-  /// class declaration.
-  @override
-  int get offset;
-
-  /// The offset of the `.` before the name.
-  ///
-  /// It is `null` if the fragment is synthetic, or does not specify an
-  /// explicit name, even if [name2] is `new` in this case.
-  int? get periodOffset;
-
-  @override
-  ConstructorFragment? get previousFragment;
-
-  /// The specified name of the type (e.g. class).
-  ///
-  /// In valid code it is the name of the [enclosingFragment], however it
-  /// could be anything in invalid code, e.g. `class A { A2.named(); }`.
-  ///
-  /// If the fragment is synthetic, the type name is the name of the
-  /// enclosing type, which itself can be `null` if its name token is
-  /// synthetic.
-  String? get typeName;
-
-  /// The offset of the type (e.g. class) name.
-  ///
-  /// It is `null` if the fragment is synthetic.
-  int? get typeNameOffset;
-}
-
-/// The base class for all of the elements in the element model.
-///
-/// Generally speaking, the element model is a semantic model of the program
-/// that represents things that are declared with a name and hence can be
-/// referenced elsewhere in the code. There are two exceptions to the general
-/// case.
-///
-/// First, there are elements in the element model that are created for the
-/// convenience of various kinds of analysis but that don't have any
-/// corresponding declaration within the source code. Such elements are marked
-/// as being <i>synthetic</i>. Examples of synthetic elements include
-/// - default constructors in classes that don't define any explicit
-///   constructors,
-/// - getters and setters that are induced by explicit field declarations,
-/// - fields that are induced by explicit declarations of getters and setters,
-///   and
-/// - functions representing the initialization expression for a variable.
-///
-/// Second, there are elements in the element model that don't have, or are not
-/// required to have a name. These correspond to things like unnamed functions
-/// or extensions. They exist in order to more accurately represent the semantic
-/// structure of the program.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class Element2 {
-  /// The non-[Member] version of this element.
-  ///
-  /// If the receiver is a view on an element, such as a method from an
-  /// interface type with substituted type parameters, this getter will return
-  /// the corresponding element from the class, without any substitutions.
-  ///
-  /// If the receiver is already a non-[Member] element (or a synthetic element,
-  /// such as a synthetic property accessor), this getter will return the
-  /// receiver.
-  Element2 get baseElement;
-
-  /// The children of this element.
-  ///
-  /// There is no guarantee of the order in which the children will be returned.
-  /// In particular, they are not guaranteed to be in lexical order.
-  List<Element2> get children2;
-
-  /// The display name of this element, or an empty string if the element does
-  /// not have a name.
-  ///
-  /// In most cases the name and the display name are the same. They differ in
-  /// cases such as setters where the `name` of some setter (`set s(x)`) is `s=`
-  /// but the `displayName` is `s`.
-  String get displayName;
-
-  /// The element that either physically or logically encloses this element.
-  ///
-  /// Returns `null` if this element is a library because libraries are the
-  /// top-level elements in the model.
-  Element2? get enclosingElement2;
-
-  /// The first fragment in the chain of fragments that are merged to make this
-  /// element.
-  ///
-  /// The other fragments in the chain can be accessed using successive
-  /// invocations of [Fragment.nextFragment].
-  Fragment get firstFragment;
-
-  /// The fragments this element consists of.
-  List<Fragment> get fragments;
-
-  /// The unique integer identifier of this element.
-  int get id;
-
-  /// Whether this element is private.
-  ///
-  /// Private elements are visible only within the library in which they are
-  /// declared.
-  bool get isPrivate;
-
-  /// Whether this element is public.
-  ///
-  /// Public elements are visible within any library that imports the library
-  /// in which they are declared.
-  bool get isPublic;
-
-  /// Whether this element is synthetic.
-  ///
-  /// A synthetic element is an element that is not represented in the source
-  /// code explicitly, but is implied by the source code, such as the default
-  /// constructor for a class that does not explicitly define any constructors.
-  bool get isSynthetic;
-
-  /// The kind of this element.
-  ElementKind get kind;
-
-  /// Library that contains this element.
-  ///
-  /// This will be the element itself if it's a library element. This will be
-  /// `null` if this element is a [MultiplyDefinedElement2] that isn't contained
-  /// in a single library.
-  LibraryElement2? get library2;
-
-  /// The name to use for lookup in maps.
-  ///
-  /// It is usually the same as [name3], with a few special cases.
-  ///
-  /// Just like [name3], it can be `null` if the element does not have
-  /// a name, for example an unnamed extension, or because of parser recovery.
-  ///
-  /// For a [SetterElement] the result has `=` at the end.
-  ///
-  /// For an unary operator `-` the result is `unary-`.
-  /// For a binary operator `-` the result is just `-`.
-  String? get lookupName;
-
-  /// The name of this element.
-  ///
-  /// Returns `null` if this element doesn't have a name.
-  ///
-  /// See [Fragment.name2] for details.
-  String? get name3;
-
-  /// The non-synthetic element that caused this element to be created.
-  ///
-  /// If this element is not synthetic, then the element itself is returned.
-  ///
-  /// If this element is synthetic, then the corresponding non-synthetic
-  /// element is returned. For example, for a synthetic getter of a
-  /// non-synthetic field the field is returned; for a synthetic constructor
-  /// the enclosing class is returned.
-  Element2 get nonSynthetic2;
-
-  /// The analysis session in which this element is defined.
-  AnalysisSession? get session;
-
-  /// Uses the given [visitor] to visit this element.
-  ///
-  /// Returns the value returned by the visitor as a result of visiting this
-  /// element.
-  T? accept2<T>(ElementVisitor2<T> visitor);
-
-  /// The presentation of this element as it should appear when presented to
-  /// users.
-  ///
-  /// If [multiline] is `true`, then the string may be wrapped over multiple
-  /// lines with newlines to improve formatting. For example, function
-  /// signatures may be formatted as if they had trailing commas.
-  ///
-  /// If [preferTypeAlias] is `true` and the element represents a type defined
-  /// by a type alias, then the name of the type alias will be used in the
-  /// returned string rather than the name of the type being aliased.
-  ///
-  /// Clients should not depend on the content of the returned value as it will
-  /// be changed if doing so would improve the UX.
-  String displayString2({bool multiline = false, bool preferTypeAlias = false});
-
-  /// Returns a display name for the given element that includes the path to the
-  /// compilation unit in which the type is defined. If [shortName] is `null`
-  /// then [displayName] will be used as the name of this element. Otherwise
-  /// the provided name will be used.
-  String getExtendedDisplayName2({String? shortName});
-
-  /// Whether the element, assuming that it is within scope, is accessible to
-  /// code in the given [library].
-  ///
-  /// This is defined by the Dart Language Specification in section 6.2:
-  /// <blockquote>
-  /// A declaration <i>m</i> is accessible to a library <i>L</i> if <i>m</i> is
-  /// declared in <i>L</i> or if <i>m</i> is public.
-  /// </blockquote>
-  bool isAccessibleIn2(LibraryElement2 library);
-
-  /// Returns either this element or the most immediate ancestor of this element
-  /// for which the [predicate] returns `true`.
-  ///
-  /// Returns `null` if there is no such element.
-  Element2? thisOrAncestorMatching2(bool Function(Element2) predicate);
-
-  /// Returns either this element or the most immediate ancestor of this element
-  /// that has the given type.
-  ///
-  /// Returns `null` if there is no such element.
-  E? thisOrAncestorOfType2<E extends Element2>();
-
-  /// Uses the given [visitor] to visit all of the children of this element.
-  /// There is no guarantee of the order in which the children will be visited.
-  void visitChildren2<T>(ElementVisitor2<T> visitor);
-}
-
-/// A directive within a library fragment.
-///
-/// Clients may not extend, implement or mix-in this class.
-sealed class ElementDirective implements Annotatable {
-  /// The library fragment that contains this object.
-  LibraryFragment get libraryFragment;
-
-  /// The interpretation of the URI specified in the directive.
-  DirectiveUri get uri;
-}
-
-/// An object that can be used to visit an element structure.
-///
-/// Clients may not extend, implement or mix-in this class. There are classes
-/// that implement this interface that provide useful default behaviors in
-/// `package:analyzer/dart/element/visitor.dart`. A couple of the most useful
-/// include
-/// * SimpleElementVisitor which implements every visit method by doing nothing,
-/// * RecursiveElementVisitor which will cause every node in a structure to be
-///   visited, and
-/// * ThrowingElementVisitor which implements every visit method by throwing an
-///   exception.
-abstract class ElementVisitor2<R> {
-  R? visitClassElement(ClassElement2 element);
-
-  R? visitConstructorElement(ConstructorElement2 element);
-
-  R? visitEnumElement(EnumElement2 element);
-
-  R? visitExtensionElement(ExtensionElement2 element);
-
-  R? visitExtensionTypeElement(ExtensionTypeElement2 element);
-
-  R? visitFieldElement(FieldElement2 element);
-
-  R? visitFieldFormalParameterElement(FieldFormalParameterElement2 element);
-
-  R? visitFormalParameterElement(FormalParameterElement element);
-
-  R? visitGenericFunctionTypeElement(GenericFunctionTypeElement2 element);
-
-  R? visitGetterElement(GetterElement element);
-
-  R? visitLabelElement(LabelElement2 element);
-
-  R? visitLibraryElement(LibraryElement2 element);
-
-  R? visitLocalFunctionElement(LocalFunctionElement element);
-
-  R? visitLocalVariableElement(LocalVariableElement2 element);
-
-  R? visitMethodElement(MethodElement2 element);
-
-  R? visitMixinElement(MixinElement2 element);
-
-  R? visitMultiplyDefinedElement(MultiplyDefinedElement2 element);
-
-  R? visitPrefixElement(PrefixElement2 element);
-
-  R? visitSetterElement(SetterElement element);
-
-  R? visitSuperFormalParameterElement(SuperFormalParameterElement2 element);
-
-  R? visitTopLevelFunctionElement(TopLevelFunctionElement element);
-
-  R? visitTopLevelVariableElement(TopLevelVariableElement2 element);
-
-  R? visitTypeAliasElement(TypeAliasElement2 element);
-
-  R? visitTypeParameterElement(TypeParameterElement2 element);
-}
-
-/// An element that represents an enum.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class EnumElement2 implements InterfaceElement2 {
-  /// The constants defined by the enum.
-  List<FieldElement2> get constants2;
-
-  @override
-  EnumFragment get firstFragment;
-
-  @override
-  List<EnumFragment> get fragments;
-}
-
-/// The portion of an [EnumElement2] contributed by a single declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class EnumFragment implements InterfaceFragment {
-  /// The constants defined by this fragment of the enum.
-  List<FieldElement2> get constants2;
-
-  @override
-  EnumElement2 get element;
-
-  @override
-  EnumFragment? get nextFragment;
-
-  @override
-  EnumFragment? get previousFragment;
-}
-
-/// An element representing an executable object, including functions, methods,
-/// constructors, getters, and setters.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class ExecutableElement2 implements FunctionTypedElement2 {
-  @override
-  ExecutableElement2 get baseElement;
-
-  @override
-  ExecutableFragment get firstFragment;
-
-  @override
-  List<ExecutableFragment> get fragments;
-
-  /// Whether the executable element did not have an explicit return type
-  /// specified for it in the original source.
-  bool get hasImplicitReturnType;
-
-  /// Whether the executable element is abstract.
-  ///
-  /// Executable elements are abstract if they are not external, and have no
-  /// body.
-  bool get isAbstract;
-
-  /// Whether the executable element is an extension type member.
-  bool get isExtensionTypeMember;
-
-  /// Whether the executable element is external.
-  ///
-  /// Executable elements are external if they are explicitly marked as such
-  /// using the 'external' keyword.
-  bool get isExternal;
-
-  /// Whether the element is a static element.
-  ///
-  /// A static element is an element that is not associated with a particular
-  /// instance, but rather with an entire library or class.
-  bool get isStatic;
-}
-
-/// The portion of an [ExecutableElement2] contributed by a single declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class ExecutableFragment implements FunctionTypedFragment {
-  @override
-  ExecutableElement2 get element;
-
-  /// Whether the body is marked as being asynchronous.
-  bool get isAsynchronous;
-
-  /// Whether the element is an augmentation.
-  ///
-  /// Executable elements are augmentations if they are explicitly marked as
-  /// such using the 'augment' modifier.
-  bool get isAugmentation;
-
-  /// Whether the body is marked as being a generator.
-  bool get isGenerator;
-
-  /// Whether the body is marked as being synchronous.
-  bool get isSynchronous;
-
-  /// Whether this fragment is synthetic.
-  ///
-  /// A synthetic fragment is a fragment that is not represented in the source
-  /// code explicitly, but is implied by the source code, such as the default
-  /// constructor for a class that does not explicitly define any constructors.
-  bool get isSynthetic;
-
-  @override
-  LibraryFragment get libraryFragment;
-
-  @override
-  ExecutableFragment? get nextFragment;
-
-  @override
-  ExecutableFragment? get previousFragment;
-}
-
-/// An extension.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class ExtensionElement2 implements InstanceElement2 {
-  /// The type that is extended by this extension.
-  DartType get extendedType;
-
-  @override
-  ExtensionFragment get firstFragment;
-
-  @override
-  List<ExtensionFragment> get fragments;
-}
-
-/// The portion of an [ExtensionElement2] contributed by a single
-/// declaration.
-///
-/// Clients may not extend, implement, or mix-in this class.
-abstract class ExtensionFragment implements InstanceFragment {
-  @override
-  ExtensionElement2 get element;
-
-  @override
-  ExtensionFragment? get nextFragment;
-
-  /// The offset of the extension name.
-  ///
-  /// If the extension has no name, this is the offset of the `extension`
-  /// keyword.
-  @override
-  int get offset;
-
-  @override
-  ExtensionFragment? get previousFragment;
-}
-
-/// An extension type.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class ExtensionTypeElement2 implements InterfaceElement2 {
-  @override
-  ExtensionTypeFragment get firstFragment;
-
-  @override
-  List<ExtensionTypeFragment> get fragments;
-
-  /// The primary constructor of this extension.
-  ConstructorElement2 get primaryConstructor2;
-
-  /// The representation of this extension.
-  FieldElement2 get representation2;
-
-  /// The extension type erasure, obtained by recursively replacing every
-  /// subterm which is an extension type by the corresponding representation
-  /// type.
-  DartType get typeErasure;
-}
-
-/// The portion of an [ExtensionTypeElement2] contributed by a single
-/// declaration.
-///
-/// Clients may not extend, implement, or mix-in this class.
-abstract class ExtensionTypeFragment implements InterfaceFragment {
-  @override
-  ExtensionTypeElement2 get element;
-
-  @override
-  ExtensionTypeFragment? get nextFragment;
-
-  @override
-  ExtensionTypeFragment? get previousFragment;
-
-  ConstructorFragment get primaryConstructor2;
-
-  /// The representation of this extension.
-  FieldFragment get representation2;
-}
-
-/// A field defined within a class, enum, extension, or mixin.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class FieldElement2 implements PropertyInducingElement2 {
-  @override
-  FieldElement2 get baseElement;
-
-  @override
-  InstanceElement2 get enclosingElement2;
-
-  @override
-  FieldFragment get firstFragment;
-
-  @override
-  List<FieldFragment> get fragments;
-
-  /// Whether the field is abstract.
-  ///
-  /// Executable fields are abstract if they are declared with the `abstract`
-  /// keyword.
-  bool get isAbstract;
-
-  /// Whether the field was explicitly marked as being covariant.
-  bool get isCovariant;
-
-  /// Whether the element is an enum constant.
-  bool get isEnumConstant;
-
-  /// Whether the field was explicitly marked as being external.
-  bool get isExternal;
-
-  /// Whether the field can be type promoted.
-  bool get isPromotable;
-}
-
-/// A field formal parameter defined within a constructor element.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class FieldFormalParameterElement2 implements FormalParameterElement {
-  /// The field element associated with this field formal parameter.
-  ///
-  /// Returns `null` if the parameter references a field that doesn't exist.
-  FieldElement2? get field2;
-
-  @override
-  FieldFormalParameterFragment get firstFragment;
-
-  @override
-  List<FieldFormalParameterFragment> get fragments;
-}
-
-/// The portion of a [FieldFormalParameterElement2] contributed by a single
-/// declaration.
-///
-/// Clients may not extend, implement, or mix-in this class.
-abstract class FieldFormalParameterFragment implements FormalParameterFragment {
-  @override
-  FieldFormalParameterElement2 get element;
-
-  @override
-  FieldFormalParameterFragment? get nextFragment;
-
-  @override
-  FieldFormalParameterFragment? get previousFragment;
-}
-
-/// The portion of a [FieldElement2] contributed by a single declaration.
-///
-/// Clients may not extend, implement, or mix-in this class.
-abstract class FieldFragment implements PropertyInducingFragment {
-  @override
-  FieldElement2 get element;
-
-  @override
-  FieldFragment? get nextFragment;
-
-  /// The offset of the field name.
-  ///
-  /// If the field declaration is implicit, this is the offset of the name of
-  /// the containing element (e.g., for the `values` field of an enum, this is
-  /// the offset of the enum name).
-  @override
-  int get offset;
-
-  @override
-  FieldFragment? get previousFragment;
-}
-
-/// A formal parameter defined by an executable element.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class FormalParameterElement
-    implements
-        PromotableElement2,
-        Annotatable,
-        HasSinceSdkVersion,
-        LocalElement2 {
-  @override
-  FormalParameterElement get baseElement;
-
-  /// The code of the default value.
-  ///
-  /// Returns `null` if no default value.
-  String? get defaultValueCode;
-
-  @override
-  FormalParameterFragment get firstFragment;
-
-  /// The formal parameters defined by this formal parameter.
-  ///
-  /// A parameter will only define other parameters if it is a function typed
-  /// formal parameter.
-  List<FormalParameterElement> get formalParameters;
-
-  @override
-  List<FormalParameterFragment> get fragments;
-
-  /// Whether the parameter has a default value.
-  bool get hasDefaultValue;
-
-  /// Whether the parameter is covariant, meaning it is allowed to have a
-  /// narrower type in an override.
-  bool get isCovariant;
-
-  /// Whether the parameter is an initializing formal parameter.
-  bool get isInitializingFormal;
-
-  /// Whether the parameter is a named parameter.
-  ///
-  /// Named parameters that are annotated with the `@required` annotation are
-  /// considered optional. Named parameters that are annotated with the
-  /// `required` syntax are considered required.
-  bool get isNamed;
-
-  /// Whether the parameter is an optional parameter.
-  ///
-  /// Optional parameters can either be positional or named. Named parameters
-  /// that are annotated with the `@required` annotation are considered
-  /// optional. Named parameters that are annotated with the `required` syntax
-  /// are considered required.
-  bool get isOptional;
-
-  /// Whether the parameter is both an optional and named parameter.
-  ///
-  /// Named parameters that are annotated with the `@required` annotation are
-  /// considered optional. Named parameters that are annotated with the
-  /// `required` syntax are considered required.
-  bool get isOptionalNamed;
-
-  /// Whether the parameter is both an optional and positional parameter.
-  bool get isOptionalPositional;
-
-  /// Whether the parameter is a positional parameter.
-  ///
-  /// Positional parameters can either be required or optional.
-  bool get isPositional;
-
-  /// Whether the parameter is either a required positional parameter, or a
-  /// named parameter with the `required` keyword.
-  ///
-  /// Note: the presence or absence of the `@required` annotation does not
-  /// change the meaning of this getter. The parameter `{@required int x}`
-  /// will return `false` and the parameter `{@required required int x}`
-  /// will return `true`.
-  bool get isRequired;
-
-  /// Whether the parameter is both a required and named parameter.
-  ///
-  /// Named parameters that are annotated with the `@required` annotation are
-  /// considered optional. Named parameters that are annotated with the
-  /// `required` syntax are considered required.
-  bool get isRequiredNamed;
-
-  /// Whether the parameter is both a required and positional parameter.
-  bool get isRequiredPositional;
-
-  /// Whether the parameter is a super formal parameter.
-  bool get isSuperFormal;
-
-  /// The type parameters defined by this parameter.
-  ///
-  /// A parameter will only define type parameters if it is a function typed
-  /// parameter.
-  List<TypeParameterElement2> get typeParameters2;
-
-  /// Appends the type, name and possibly the default value of this parameter
-  /// to the given [buffer].
-  void appendToWithoutDelimiters2(StringBuffer buffer);
-}
-
-/// The portion of a [FormalParameterElement] contributed by a single
-/// declaration.
-///
-/// Clients may not extend, implement, or mix-in this class.
-abstract class FormalParameterFragment
-    implements PromotableFragment, Annotatable, LocalFragment {
-  @override
-  FormalParameterElement get element;
-
-  @override
-  FormalParameterFragment? get nextFragment;
-
-  /// The offset of the parameter name.
-  ///
-  /// If the parameter is implicit (because it's the parameter of an implicit
-  /// setter that's induced by a field or top level variable declaration), this
-  /// is the offset of the field or top level variable name.
-  @override
-  int get offset;
-
-  @override
-  FormalParameterFragment? get previousFragment;
-}
-
-/// A fragment that wholly or partially defines an element.
-///
-/// When an element is defined by one or more fragments, those fragments form an
-/// augmentation chain. This is represented in the element model as a
-/// doubly-linked list.
-///
-/// In valid code the first fragment is the base declaration and all of the
-/// other fragments are augmentations. This can be violated in the element model
-/// in the case of invalid code, such as when an augmentation is declared even
-/// though there is no base declaration.
-abstract class Fragment {
-  /// The children of this fragment.
-  ///
-  /// There is no guarantee of the order in which the children will be returned.
-  /// In particular, they are not guaranteed to be in lexical order.
-  List<Fragment> get children3;
-
-  /// The element composed from this fragment and possibly other fragments.
-  Element2 get element;
-
-  /// The fragment that either physically or logically encloses this fragment.
-  ///
-  /// Returns `null` if this fragment is the root fragment of a library because
-  /// there are no fragments above the root fragment of a library.
-  Fragment? get enclosingFragment;
-
-  /// The library fragment that contains this fragment.
-  ///
-  /// This will be the fragment itself if it is a library fragment.
-  LibraryFragment? get libraryFragment;
-
-  /// The name of the fragment.
-  ///
-  /// Never empty.
-  ///
-  /// If a fragment, e.g. an [ExtensionFragment], does not have a name,
-  /// then the name is `null`.
-  ///
-  /// For an unnamed [ConstructorFragment] the name is `new`, but [nameOffset2]
-  /// is `null`. If there is an explicit `ClassName.new`, the name is also
-  /// `new`, and [nameOffset2] is not `null`. For a synthetic default unnamed
-  /// [ConstructorElement2] there is always a synthetic [ConstructorFragment]
-  /// with the name `new`, and [nameOffset2] is `null`.
-  ///
-  /// If the fragment declaration node does not have the name specified, and
-  /// the parser inserted a synthetic token, then the name is `null`, and
-  /// [nameOffset2] is `null`.
-  ///
-  /// For a synthetic [GetterFragment] or [SetterFragment] the name is the
-  /// name of the corresponding non-synthetic [PropertyInducingFragment],
-  /// which is usually not `null`, but could be. And `nameOffset2` is `null`
-  /// for such synthetic fragments.
-  ///
-  /// For a [SetterFragment] this is the identifier, without `=` at the end.
-  ///
-  /// For both unary and binary `-` operator this is `-`.
-  String? get name2;
-
-  /// The offset of the [name2] of this element.
-  ///
-  /// If a fragment, e.g. an [ExtensionFragment], does not have a name,
-  /// then the name offset is `null`.
-  ///
-  /// If the fragment declaration node does not have the name specified, and
-  /// the parser inserted a synthetic token, then the name is `null`, and
-  /// the name offset is `null`.
-  ///
-  /// For a synthetic fragment, e.g. [ConstructorFragment] the name offset
-  /// is `null`.
-  int? get nameOffset2;
-
-  /// The next fragment in the augmentation chain.
-  ///
-  /// Returns `null` if this is the last fragment in the chain.
-  Fragment? get nextFragment;
-
-  /// A canonical offset to the fragment within the source file.
-  ///
-  /// If the fragment has a name, this is equal to [nameOffset2]. Otherwise it
-  /// is the offset of some character within the fragment; see subclasses for
-  /// more information.
-  ///
-  /// If the fragment is of a kind that would normally have a name, but there is
-  /// no name due to error recovery, then the exact offset is unspecified, but
-  /// is guaranteed to be within the span of the tokens that constitute the
-  /// fragment's declaration.
-  int get offset;
-
-  /// The previous fragment in the augmentation chain.
-  ///
-  /// Returns `null` if this is the first fragment in the chain.
-  Fragment? get previousFragment;
-}
-
-/// An element that has a [FunctionType] as its [type].
-///
-/// This also provides convenient access to the parameters and return type.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class FunctionTypedElement2 implements TypeParameterizedElement2 {
-  @override
-  FunctionTypedFragment get firstFragment;
-
-  /// The formal parameters defined by this element.
-  List<FormalParameterElement> get formalParameters;
-
-  @override
-  List<FunctionTypedFragment> get fragments;
-
-  /// The return type defined by this element.
-  DartType get returnType;
-
-  /// The type defined by this element.
-  FunctionType get type;
-}
-
-/// The portion of a [FunctionTypedElement2] contributed by a single declaration.
-///
-/// Clients may not extend, implement, or mix-in this class.
-abstract class FunctionTypedFragment implements TypeParameterizedFragment {
-  @override
-  FunctionTypedElement2 get element;
-
-  /// The formal parameters defined by this fragment.
-  List<FormalParameterFragment> get formalParameters;
-
-  @override
-  FunctionTypedFragment? get nextFragment;
-
-  @override
-  FunctionTypedFragment? get previousFragment;
-}
-
-/// The pseudo-declaration that defines a generic function type.
-///
-/// Clients may not extend, implement, or mix-in this class.
-abstract class GenericFunctionTypeElement2 implements FunctionTypedElement2 {
-  @override
-  GenericFunctionTypeFragment get firstFragment;
-
-  @override
-  List<GenericFunctionTypeFragment> get fragments;
-}
-
-/// The portion of a [GenericFunctionTypeElement2] coming from a single
-/// declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class GenericFunctionTypeFragment implements FunctionTypedFragment {
-  @override
-  GenericFunctionTypeElement2 get element;
-
-  @override
-  GenericFunctionTypeFragment? get nextFragment;
-
-  /// The offset of the generic function type.
-  ///
-  /// Generic function types are not named, so the offset is the offset of the
-  /// first token in the generic function type.
-  @override
-  int get offset;
-
-  @override
-  GenericFunctionTypeFragment? get previousFragment;
-}
-
-/// A getter.
-///
-/// Getters can either be defined explicitly or they can be induced by either a
-/// top-level variable or a field. Induced getters are synthetic.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class GetterElement implements PropertyAccessorElement2 {
-  @override
-  GetterElement get baseElement;
-
-  /// The setter that corresponds to (has the same name as) this getter, or
-  /// `null` if there is no corresponding setter.
-  SetterElement? get correspondingSetter2;
-
-  @override
-  GetterFragment get firstFragment;
-
-  @override
-  List<GetterFragment> get fragments;
-}
-
-/// The portion of a [GetterElement] contributed by a single declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class GetterFragment implements PropertyAccessorFragment {
-  @override
-  GetterElement get element;
-
-  @override
-  GetterFragment? get nextFragment;
-
-  /// The offset of the getter name.
-  ///
-  /// If the getter is implicit (because it's induced by a field or top level
-  /// variable declaration), this is the offset of the field or top level
-  /// variable name.
-  @override
-  int get offset;
-
-  @override
-  GetterFragment? get previousFragment;
-}
-
-/// The interface that is implemented by elements that can have `@Since()`
-/// annotation.
-abstract class HasSinceSdkVersion {
-  /// The version where the associated SDK API was added.
-  ///
-  /// A `@Since()` annotation can be applied to a library declaration,
-  /// any public declaration in a library, or in a class, or to an optional
-  /// parameter, etc.
-  ///
-  /// The returned version is "effective", so that if a library is annotated
-  /// then all elements of the library inherit it; or if a class is annotated
-  /// then all members and constructors of the class inherit it.
-  ///
-  /// If multiple `@Since()` annotations apply to the same element, the latest
-  /// version takes precedence.
-  ///
-  /// Returns `null` if the element is not declared in the SDK, or doesn't have
-  /// a `@Since()` annotation applied to it.
-  Version? get sinceSdkVersion;
-}
-
-/// An element whose instance members can refer to `this`.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class InstanceElement2
-    implements
-        TypeDefiningElement2,
-        TypeParameterizedElement2,
-        HasSinceSdkVersion {
-  @override
-  InstanceElement2 get baseElement;
-
-  @override
-  LibraryElement2 get enclosingElement2;
-
-  /// The fields declared in this element.
-  List<FieldElement2> get fields2;
-
-  @override
-  InstanceFragment get firstFragment;
-
-  @override
-  List<InstanceFragment> get fragments;
-
-  /// The getters declared in this element.
-  List<GetterElement> get getters2;
-
-  /// The methods declared in this element.
-  List<MethodElement2> get methods2;
-
-  /// The setters declared in this element.
-  List<SetterElement> get setters2;
-
-  /// The type of a `this` expression.
-  DartType get thisType;
-
-  /// Returns the field from [fields2] that has the given [name].
-  FieldElement2? getField2(String name);
-
-  /// Returns the getter from [getters2] that has the given [name].
-  GetterElement? getGetter2(String name);
-
-  /// Returns the method from [methods2] that has the given [name].
-  MethodElement2? getMethod2(String name);
-
-  /// Returns the setter from [setters2] that has the given [name].
-  SetterElement? getSetter2(String name);
-
-  /// Returns the element representing the getter that results from looking up
-  /// the given [name] in this class with respect to the given [library],
-  /// or `null` if the look up fails.
-  ///
-  /// The behavior of this method is defined by the Dart Language Specification
-  /// in section 17.18 Lookup.
-  GetterElement? lookUpGetter2({
-    required String name,
-    required LibraryElement2 library,
-  });
-
-  /// Returns the element representing the method that results from looking up
-  /// the given [name] in this class with respect to the given [library],
-  /// or `null` if the look up fails.
-  ///
-  /// The behavior of this method is defined by the Dart Language Specification
-  /// in section 17.18 Lookup.
-  MethodElement2? lookUpMethod2({
-    required String name,
-    required LibraryElement2 library,
-  });
-
-  /// Returns the element representing the setter that results from looking up
-  /// the given [name] in this class with respect to the given [library],
-  /// or `null` if the look up fails.
-  ///
-  /// The behavior of this method is defined by the Dart Language Specification
-  /// in section 17.18 Lookup.
-  SetterElement? lookUpSetter2({
-    required String name,
-    required LibraryElement2 library,
-  });
-}
-
-/// The portion of an [InstanceElement2] contributed by a single declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class InstanceFragment
-    implements TypeDefiningFragment, TypeParameterizedFragment {
-  @override
-  InstanceElement2 get element;
-
-  @override
-  LibraryFragment? get enclosingFragment;
-
-  /// The fields declared in this fragment.
-  List<FieldFragment> get fields2;
-
-  /// The getters declared in this fragment.
-  List<GetterFragment> get getters;
-
-  /// Whether the fragment is an augmentation.
-  ///
-  /// If `true`, the declaration has the explicit `augment` modifier.
-  bool get isAugmentation;
-
-  @override
-  LibraryFragment get libraryFragment;
-
-  /// The methods declared in this fragment.
-  List<MethodFragment> get methods2;
-
-  @override
-  InstanceFragment? get nextFragment;
-
-  @override
-  InstanceFragment? get previousFragment;
-
-  /// The setters declared in this fragment.
-  List<SetterFragment> get setters;
-}
-
-/// An element that defines an [InterfaceType].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class InterfaceElement2 implements InstanceElement2 {
-  /// All the supertypes defined for this element and its supertypes.
-  ///
-  /// This includes superclasses, mixins, interfaces, and superclass
-  /// constraints.
-  List<InterfaceType> get allSupertypes;
-
-  /// The constructors defined for this element.
-  ///
-  /// The list is empty for [MixinElement2].
-  List<ConstructorElement2> get constructors2;
-
-  @override
-  InterfaceFragment get firstFragment;
-
-  @override
-  List<InterfaceFragment> get fragments;
-
-  /// Returns a map of all concrete members that this type inherits from
-  /// superclasses and mixins, keyed by the member's [Name].
-  ///
-  /// Members declared in this type have no effect on the map. This means that:
-  /// - If this type contains a member named `foo`, but none of its superclasses
-  ///   or mixins contains a member named `foo`, then there will be no entry for
-  ///   `foo` in the map.
-  /// - If this type contains a member named `foo`, and one of its superclasses
-  ///   or mixins contains a member named `foo`, then there will be an entry for
-  ///   `foo` in this map, pointing to the declaration inherited from the
-  ///   superclass or mixin.
-  ///
-  /// This method is potentially expensive, since it needs to consider all
-  /// possible inherited names. If you only need to look up a certain specific
-  /// name (or names), use [getInheritedConcreteMember] instead.
-  Map<Name, ExecutableElement2> get inheritedConcreteMembers;
-
-  /// Returns a map of all members that this type inherits from supertypes via
-  /// `extends`, `with`, `implements`, or `on` clauses, keyed by the member's
-  /// [Name].
-  ///
-  /// Members declared in this type have no effect on the map. This means that:
-  /// - If this type contains a member named `foo`, but none of its supertypes
-  ///   contains a member named `foo`, then there will be no entry for `foo` in
-  ///   the map.
-  /// - If this type contains a member named `foo`, and one of its supertypes
-  ///   contains a member named `foo`, then there will be an entry for `foo` in
-  ///   this map, pointing to the declaration inherited from the supertype.
-  ///
-  /// This method is potentially expensive, since it needs to consider all
-  /// possible inherited names. If you only need to look up a certain specific
-  /// name (or names), use [getInheritedMember] instead.
-  Map<Name, ExecutableElement2> get inheritedMembers;
-
-  /// Returns a map of all members in the type's interface, keyed by the
-  /// member's [Name].
-  ///
-  /// Note that some names are not declared directly on [thisType], but are
-  /// inherited from supertypes.
-  ///
-  /// This method is potentially expensive, since it needs to consider all
-  /// possible interface names. If you only need to look up a certain specific
-  /// name (or names), use [getInterfaceMember] instead.
-  Map<Name, ExecutableElement2> get interfaceMembers;
-
-  /// The interfaces that are implemented by this class.
-  ///
-  /// <b>Note:</b> Because the element model represents the state of the code,
-  /// it is possible for it to be semantically invalid. In particular, it is not
-  /// safe to assume that the inheritance structure of a class does not contain
-  /// a cycle. Clients that traverse the inheritance structure must explicitly
-  /// guard against infinite loops.
-  List<InterfaceType> get interfaces;
-
-  /// The mixins that are applied to the class being extended in order to
-  /// derive the superclass of this class.
-  ///
-  /// [ClassElement2] and [EnumElement2] can have mixins.
-  ///
-  /// [MixinElement2] cannot have mixins, so an empty list is returned.
-  ///
-  /// <b>Note:</b> Because the element model represents the state of the code,
-  /// it is possible for it to be semantically invalid. In particular, it is not
-  /// safe to assume that the inheritance structure of a class does not contain
-  /// a cycle. Clients that traverse the inheritance structure must explicitly
-  /// guard against infinite loops.
-  List<InterfaceType> get mixins;
-
-  /// The superclass of this element.
-  ///
-  /// For [ClassElement2] returns `null` only if this class is `Object`. If the
-  /// superclass is not explicitly specified, or the superclass cannot be
-  /// resolved, then the implicit superclass `Object` is returned.
-  ///
-  /// For [EnumElement2] returns `Enum` from `dart:core`.
-  ///
-  /// For [MixinElement2] always returns `null`.
-  ///
-  /// <b>Note:</b> Because the element model represents the state of the code,
-  /// it is possible for it to be semantically invalid. In particular, it is not
-  /// safe to assume that the inheritance structure of a class does not contain
-  /// a cycle. Clients that traverse the inheritance structure must explicitly
-  /// guard against infinite loops.
-  InterfaceType? get supertype;
-
-  @override
-  InterfaceType get thisType;
-
-  /// The unnamed constructor declared directly in this class.
-  ///
-  /// If the class does not declare any constructors, a synthetic default
-  /// constructor will be returned.
-  ConstructorElement2? get unnamedConstructor2;
-
-  /// Returns the most specific member with the given [name] that this type
-  /// inherits from a superclass or mixin.
-  ///
-  /// Returns `null` if no member is inherited.
-  ///
-  /// This method is semantically equivalent to calling
-  /// [inheritedConcreteMembers] and then using the `[]` operator, but it
-  /// potentially has better performance, since it does not need to consider all
-  /// possible inherited names.
-  ExecutableElement2? getInheritedConcreteMember(Name name);
-
-  /// Returns the most specific member with the given [name] that this type
-  /// inherits from a supertype via an `extends`, `with`, `implements`, or `on`
-  /// clause.
-  ///
-  /// Returns `null` if no member is inherited because the member is not
-  /// declared at all, or because there is no the most specific signature.
-  ///
-  /// This method is semantically equivalent to calling [inheritedMembers] and
-  /// then using the `[]` operator, but it potentially has better performance,
-  /// since it does not need to consider all possible inherited names.
-  ExecutableElement2? getInheritedMember(Name name);
-
-  /// Returns the most specific member with the given [name] in this type's
-  /// interface.
-  ///
-  /// Returns `null` if there is no member with the given [name] in this type's
-  /// interface, either because the member is not declared at all, or because of
-  /// a conflict between inherited members.
-  ///
-  /// This method is semantically equivalent to calling [interfaceMembers] and
-  /// then using the `[]` operator, but it potentially has better performance,
-  /// since it does not need to consider all possible interface names.
-  ExecutableElement2? getInterfaceMember(Name name);
-
-  /// Returns the constructor from [constructors2] that has the given [name].
-  ConstructorElement2? getNamedConstructor2(String name);
-
-  /// Returns all members of mixins, superclasses, and interfaces that a member
-  /// with the given [name], defined in this element, would override; or `null`
-  /// if no members would be overridden.
-  ///
-  /// Transitive overrides are not included unless there is a direct path to
-  /// them. For example, if classes `A`, `B`, and `C` are defined as follows:
-  ///
-  ///     class A { void m() {} }
-  ///     class B extends A { void m() {} }
-  ///     class C extends B { void m() {} }
-  ///
-  /// Then a [getOverridden] query for name `m` on class `C` would return just a
-  /// single result: the element for `B.m`.
-  ///
-  /// However, if the example were changed so that `class C` both `extends B`
-  /// *and* `implements A`, then a list containing both `A.m` and `B.m` would be
-  /// returned.
-  List<ExecutableElement2>? getOverridden(Name name);
-
-  /// Create the [InterfaceType] for this element with the given
-  /// [typeArguments] and [nullabilitySuffix].
-  InterfaceType instantiate({
-    required List<DartType> typeArguments,
-    required NullabilitySuffix nullabilitySuffix,
-  });
-
-  /// Returns the element representing the method that results from looking up
-  /// the given [methodName] in this class with respect to the given [library],
-  /// ignoring abstract methods, or `null` if the look up fails.
-  ///
-  /// The behavior of this method is defined by the Dart Language Specification
-  /// in section 16.15.1:
-  /// <blockquote>
-  /// The result of looking up method <i>m</i> in class <i>C</i> with respect to
-  /// library <i>L</i> is: If <i>C</i> declares an instance method named
-  /// <i>m</i> that is accessible to <i>L</i>, then that method is the result of
-  /// the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the
-  /// result of the lookup is the result of looking up method <i>m</i> in
-  /// <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
-  /// failed.
-  /// </blockquote>
-  // TODO(scheglov): Deprecate and remove it.
-  MethodElement2? lookUpConcreteMethod(
-    String methodName,
-    LibraryElement2 library,
-  );
-
-  /// Returns the element representing the method that results from looking up
-  /// the given [methodName] in the superclass of this class with respect to the
-  /// given [library], or `null` if the look up fails.
-  ///
-  /// The behavior of this method is defined by the Dart Language Specification
-  /// in section 16.15.1:
-  /// <blockquote>
-  /// The result of looking up method <i>m</i> in class <i>C</i> with respect to
-  /// library <i>L</i> is:  If <i>C</i> declares an instance method named
-  /// <i>m</i> that is accessible to <i>L</i>, then that method is the result of
-  /// the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the
-  /// result of the lookup is the result of looking up method <i>m</i> in
-  /// <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
-  /// failed.
-  /// </blockquote>
-  // TODO(scheglov): Deprecate and remove it.
-  MethodElement2? lookUpInheritedMethod2({
-    required String methodName,
-    required LibraryElement2 library,
-  });
-}
-
-/// The portion of an [InterfaceElement2] contributed by a single declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class InterfaceFragment implements InstanceFragment {
-  /// The constructors declared in this fragment.
-  ///
-  /// The list is empty for [MixinFragment].
-  List<ConstructorFragment> get constructors2;
-
-  @override
-  InterfaceElement2 get element;
-
-  /// The interfaces that are implemented by this fragment.
-  List<InterfaceType> get interfaces;
-
-  /// The mixins that are applied by this fragment.
-  ///
-  /// [ClassFragment] and [EnumFragment] can have mixins.
-  ///
-  /// [MixinFragment] cannot have mixins, so the empty list is returned.
-  List<InterfaceType> get mixins;
-
-  @override
-  InterfaceFragment? get nextFragment;
-
-  @override
-  InterfaceFragment? get previousFragment;
-
-  /// The superclass declared by this fragment.
-  InterfaceType? get supertype;
-}
-
-/// A pattern variable that is a join of other pattern variables, created
-/// for a logical-or patterns, or shared `case` bodies in `switch` statements.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class JoinPatternVariableElement2 implements PatternVariableElement2 {
-  @override
-  JoinPatternVariableFragment get firstFragment;
-
-  @override
-  List<JoinPatternVariableFragment> get fragments;
-
-  /// Whether the [variables2] are consistent.
-  ///
-  /// The variables are consistent if they are present in all branches, and have
-  /// the same type and finality.
-  bool get isConsistent;
-
-  /// The variables that join into this variable.
-  List<PatternVariableElement2> get variables2;
-}
-
-/// The portion of a [JoinPatternVariableElement2] contributed by a single
-/// declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class JoinPatternVariableFragment implements PatternVariableFragment {
-  @override
-  JoinPatternVariableElement2 get element;
-
-  /// Whether the [variables2] are consistent.
-  ///
-  /// The variables are consistent if they are present in all branches, and have
-  /// the same type and finality.
-  bool get isConsistent;
-
-  @override
-  JoinPatternVariableFragment? get nextFragment;
-
-  /// The offset of the first variable in the join.
-  @override
-  int get offset;
-
-  @override
-  JoinPatternVariableFragment? get previousFragment;
-
-  /// The variables that join into this variable.
-  List<PatternVariableFragment> get variables2;
-}
-
-/// A label associated with a statement.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class LabelElement2 implements Element2 {
-  @override
-  // TODO(brianwilkerson): We shouldn't be inheriting this member.
-  ExecutableElement2? get enclosingElement2;
-
-  @override
-  LabelFragment get firstFragment;
-
-  @override
-  List<LabelFragment> get fragments;
-
-  @override
-  LibraryElement2 get library2;
-}
-
-/// The portion of a [LabelElement2] contributed by a single declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class LabelFragment implements Fragment {
-  @override
-  LabelElement2 get element;
-
-  @override
-  LabelFragment? get nextFragment;
-
-  @override
-  LabelFragment? get previousFragment;
-}
-
-/// A library.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class LibraryElement2
-    implements Element2, Annotatable, HasSinceSdkVersion {
-  /// The classes defined in this library.
-  ///
-  /// There is no guarantee of the order in which the classes will be returned.
-  /// In particular, they are not guaranteed to be in lexical order.
-  List<ClassElement2> get classes;
-
-  /// The entry point for this library.
-  ///
-  /// Returns `null` if this library doesn't have an entry point.
-  ///
-  /// The entry point is defined to be a zero, one, or two argument top-level
-  /// function whose name is `main`.
-  TopLevelFunctionElement? get entryPoint2;
-
-  /// The enums defined in this library.
-  ///
-  /// There is no guarantee of the order in which the enums will be returned.
-  /// In particular, they are not guaranteed to be in lexical order.
-  List<EnumElement2> get enums;
-
-  /// The libraries that are exported from this library.
-  ///
-  /// There is no guarantee of the order in which the libraries will be
-  /// returned. In particular, they are not guaranteed to be in lexical order.
-  // TODO(brianwilkerson): Consider removing this from the public API. It isn't
-  //  clear that it's useful, given that it ignores hide and show clauses.
-  List<LibraryElement2> get exportedLibraries2;
-
-  /// The export [Namespace] of this library.
-  Namespace get exportNamespace;
-
-  /// The extensions defined in this library.
-  ///
-  /// There is no guarantee of the order in which the extensions will be
-  /// returned. In particular, they are not guaranteed to be in lexical order.
-  List<ExtensionElement2> get extensions;
-
-  /// The extension types defined in this library.
-  ///
-  /// There is no guarantee of the order in which the extension types will be
-  /// returned. In particular, they are not guaranteed to be in lexical order.
-  List<ExtensionTypeElement2> get extensionTypes;
-
-  /// The set of features available to this library.
-  ///
-  /// Determined by the combination of the language version for the enclosing
-  /// package, enabled experiments, and the presence of a `// @dart` language
-  /// version override comment at the top of the files that make up the library.
-  FeatureSet get featureSet;
-
-  @override
-  LibraryFragment get firstFragment;
-
-  /// The fragments this library consists of.
-  ///
-  /// This includes the defining fragment, and fragments included using the
-  /// `part` directive.
-  @override
-  List<LibraryFragment> get fragments;
-
-  /// The getters defined in this library.
-  ///
-  /// There is no guarantee of the order in which the getters will be returned.
-  /// In particular, they are not guaranteed to be in lexical order.
-  List<GetterElement> get getters;
-
-  /// The identifier that uniquely identifies this element among the children
-  /// of this element's parent.
-  String get identifier;
-
-  /// Whether the library is the `dart:async` library.
-  bool get isDartAsync;
-
-  /// Whether the library is the `dart:core` library.
-  bool get isDartCore;
-
-  /// Whether the library is part of the SDK.
-  bool get isInSdk;
-
-  /// The language version for this library.
-  LibraryLanguageVersion get languageVersion;
-
-  @override
-  LibraryElement2 get library2;
-
-  /// The element representing the synthetic function `loadLibrary`.
-  ///
-  /// Technically the function is implicitly defined for this library only if
-  /// the library is imported using a deferred import, but the element is always
-  /// defined for performance reasons.
-  TopLevelFunctionElement get loadLibraryFunction2;
-
-  /// The mixins defined in this library.
-  ///
-  /// There is no guarantee of the order in which the mixins will be returned.
-  /// In particular, they are not guaranteed to be in lexical order.
-  List<MixinElement2> get mixins;
-
-  /// The public [Namespace] of this library.
-  Namespace get publicNamespace;
-
-  /// The analysis session in which this library is defined.
-  @override
-  AnalysisSession get session;
-
-  /// The setters defined in this library.
-  ///
-  /// There is no guarantee of the order in which the setters will be returned.
-  /// In particular, they are not guaranteed to be in lexical order.
-  List<SetterElement> get setters;
-
-  /// The functions defined in this library.
-  ///
-  /// There is no guarantee of the order in which the functions will be
-  /// returned. In particular, they are not guaranteed to be in lexical order.
-  List<TopLevelFunctionElement> get topLevelFunctions;
-
-  /// The top level variables defined in this library.
-  ///
-  /// There is no guarantee of the order in which the top level variables will
-  /// be returned. In particular, they are not guaranteed to be in lexical
-  /// order.
-  List<TopLevelVariableElement2> get topLevelVariables;
-
-  /// The type aliases defined in this library.
-  ///
-  /// There is no guarantee of the order in which the type aliases will be
-  /// returned. In particular, they are not guaranteed to be in lexical order.
-  List<TypeAliasElement2> get typeAliases;
-
-  /// The [TypeProvider] that is used in this library.
-  TypeProvider get typeProvider;
-
-  /// The [TypeSystem] that is used in this library.
-  TypeSystem get typeSystem;
-
-  /// The canonical URI of the library.
-  ///
-  /// This is the same URI as `firstFragment.source.uri` returns.
-  Uri get uri;
-
-  /// Returns the class defined in this library that has the given [name].
-  ClassElement2? getClass2(String name);
-
-  /// Returns the enum defined in this library that has the given [name].
-  EnumElement2? getEnum2(String name);
-
-  /// Returns the extension defined in this library that has the given [name].
-  ExtensionElement2? getExtension(String name);
-
-  /// Returns the extension type defined in this library that has the
-  /// given [name].
-  ExtensionTypeElement2? getExtensionType(String name);
-
-  /// Returns the getter defined in this library that has the given [name].
-  GetterElement? getGetter(String name);
-
-  /// Returns the mixin defined in this library that has the given [name].
-  MixinElement2? getMixin2(String name);
-
-  /// Returns the setter defined in this library that has the given [name].
-  SetterElement? getSetter(String name);
-
-  /// Returns the function defined in this library that has the given [name].
-  TopLevelFunctionElement? getTopLevelFunction(String name);
-
-  /// Returns the top-level variable defined in this library that has the
-  /// given [name].
-  TopLevelVariableElement2? getTopLevelVariable(String name);
-
-  /// Returns the type alias defined in this library that has the given [name].
-  TypeAliasElement2? getTypeAlias(String name);
-}
-
-/// An `export` directive within a library fragment.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class LibraryExport implements ElementDirective {
-  /// The combinators that were specified as part of the `export` directive.
-  ///
-  /// The combinators are in the order in which they were specified.
-  List<NamespaceCombinator> get combinators;
-
-  /// The [LibraryElement2], if [uri] is a [DirectiveUriWithLibrary].
-  LibraryElement2? get exportedLibrary2;
-
-  /// The offset of the `export` keyword.
-  int get exportKeywordOffset;
-}
-
-/// The portion of a [LibraryElement2] coming from a single compilation unit.
-abstract class LibraryFragment implements Fragment, Annotatable {
-  /// The extension elements accessible within this fragment.
-  List<ExtensionElement2> get accessibleExtensions2;
-
-  /// The fragments of the classes declared in this fragment.
-  List<ClassFragment> get classes2;
-
-  @override
-  LibraryElement2 get element;
-
-  @override
-  LibraryFragment? get enclosingFragment;
-
-  /// The fragments of the enums declared in this fragment.
-  List<EnumFragment> get enums2;
-
-  /// The fragments of the extensions declared in this fragment.
-  List<ExtensionFragment> get extensions2;
-
-  /// The fragments of the extension types declared in this fragment.
-  List<ExtensionTypeFragment> get extensionTypes2;
-
-  /// The fragments of the top-level functions declared in this fragment.
-  List<TopLevelFunctionFragment> get functions2;
-
-  /// The fragments of the top-level getters declared in this fragment.
-  List<GetterFragment> get getters;
-
-  /// The libraries that are imported by this unit.
-  ///
-  /// This includes all of the libraries that are imported using a prefix, and
-  /// those that are imported without a prefix.
-  List<LibraryElement2> get importedLibraries2;
-
-  /// The libraries exported by this unit.
-  List<LibraryExport> get libraryExports2;
-
-  /// The libraries imported by this unit.
-  List<LibraryImport> get libraryImports2;
-
-  /// The [LineInfo] for the fragment.
-  LineInfo get lineInfo;
-
-  /// The fragments of the mixins declared in this fragment.
-  List<MixinFragment> get mixins2;
-
-  @override
-  LibraryFragment? get nextFragment;
-
-  /// If this is the first fragment in the library and the library has `library`
-  /// declaration that specifies a name, the offset of the name; otherwise zero.
-  @override
-  int get offset;
-
-  /// The `part` directives within this fragment.
-  List<PartInclude> get partIncludes;
-
-  /// The prefixes used by [libraryImports2].
-  ///
-  /// Each prefix can be used in more than one `import` directive.
-  List<PrefixElement2> get prefixes;
-
-  @override
-  LibraryFragment? get previousFragment;
-
-  /// The scope used to resolve names within the fragment.
-  ///
-  /// It includes all of the elements that are declared in the library, and all
-  /// of the elements imported into this fragment or parent fragments.
-  Scope get scope;
-
-  /// The fragments of the top-level setters declared in this fragment.
-  List<SetterFragment> get setters;
-
-  /// The source associated with this fragment.
-  Source get source;
-
-  /// The fragments of the top-level variables declared in this fragment.
-  List<TopLevelVariableFragment> get topLevelVariables2;
-
-  /// The fragments of the type aliases declared in this fragment.
-  List<TypeAliasFragment> get typeAliases2;
-}
-
-/// An `import` directive within a library fragment.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class LibraryImport implements ElementDirective {
-  /// The combinators that were specified as part of the `import` directive.
-  ///
-  /// The combinators are in the order in which they were specified.
-  List<NamespaceCombinator> get combinators;
-
-  /// The [LibraryElement2], if [uri] is a [DirectiveUriWithLibrary].
-  LibraryElement2? get importedLibrary2;
-
-  /// The offset of the `import` keyword.
-  int get importKeywordOffset;
-
-  /// Whether this import is synthetic.
-  ///
-  /// A synthetic import is an import that is not represented in the source
-  /// code explicitly, but is implied by the source code. This only happens for
-  /// an implicit import of `dart:core`.
-  bool get isSynthetic;
-
-  /// The [Namespace] that this directive contributes to the containing library.
-  Namespace get namespace;
-
-  /// The prefix fragment that was specified as part of the import directive.
-  ///
-  /// Returns `null` if there was no prefix specified.
-  PrefixFragment? get prefix2;
-}
-
-/// An element that can be (but is not required to be) defined within a method
-/// or function (an [ExecutableFragment]).
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class LocalElement2 implements Element2 {}
-
-/// The portion of an [LocalElement2] contributed by a single declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class LocalFragment implements Fragment {}
-
-/// A local function.
-///
-/// This can be either a local function, a closure, or the initialization
-/// expression for a field or variable.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class LocalFunctionElement
-    implements ExecutableElement2, LocalElement2 {
-  @override
-  LocalFunctionFragment get firstFragment;
-
-  @override
-  List<LocalFunctionFragment> get fragments;
-}
-
-/// The portion of a [LocalFunctionElement] contributed by a single
-/// declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class LocalFunctionFragment
-    implements ExecutableFragment, LocalFragment {
-  @override
-  LocalFunctionElement get element;
-
-  @override
-  LocalFunctionFragment? get nextFragment;
-
-  /// The offset of the local function name.
-  ///
-  /// If the local function has no name (because it's a function expression),
-  /// this is the offset of the `(` that begins the function expression.
-  @override
-  int get offset;
-
-  @override
-  LocalFunctionFragment? get previousFragment;
-}
-
-/// A local variable.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class LocalVariableElement2
-    implements PromotableElement2, LocalElement2, Annotatable {
-  @override
-  LocalVariableElement2 get baseElement;
-
-  @override
-  LocalVariableFragment get firstFragment;
-
-  @override
-  List<LocalVariableFragment> get fragments;
-
-  /// Whether the variable has an initializer at declaration.
-  bool get hasInitializer;
-}
-
-/// The portion of a [LocalVariableElement2] contributed by a single
-/// declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class LocalVariableFragment
-    implements PromotableFragment, LocalFragment {
-  @override
-  LocalVariableElement2 get element;
-
-  /// Whether the variable has an initializer at declaration.
-  bool get hasInitializer;
-
-  /// The offset of the name in this element.
-  int get nameOffset;
-
-  @override
-  LocalVariableFragment? get nextFragment;
-
-  @override
-  LocalVariableFragment? get previousFragment;
-}
-
-/// The metadata (annotations) associated with an element or fragment.
-abstract class Metadata {
-  /// The annotations associated with the associated element or fragment.
-  ///
-  /// If the metadata is associated with an element that has fragments, the list
-  /// will include all of the annotations from all of the fragments.
-  ///
-  /// The list will be empty if the associated element or fragment does not have
-  /// any annotations or if the library containing the holder has not yet been
-  /// fully resolved.
-  List<ElementAnnotation> get annotations;
-
-  /// Whether the receiver has an annotation of the form `@alwaysThrows`.
-  bool get hasAlwaysThrows;
-
-  /// Whether the receiver has an annotation of the form `@awaitNotRequired`.
-  bool get hasAwaitNotRequired;
-
-  /// Whether the receiver has an annotation of the form `@deprecated`
-  /// or `@Deprecated('..')`.
-  bool get hasDeprecated;
-
-  /// Whether the receiver has an annotation of the form `@doNotStore`.
-  bool get hasDoNotStore;
-
-  /// Whether the receiver has an annotation of the form `@doNotSubmit`.
-  bool get hasDoNotSubmit;
-
-  /// Whether the receiver has an annotation of the form `@factory`.
-  bool get hasFactory;
-
-  /// Whether the receiver has an annotation of the form `@immutable`.
-  bool get hasImmutable;
-
-  /// Whether the receiver has an annotation of the form `@internal`.
-  bool get hasInternal;
-
-  /// Whether the receiver has an annotation of the form `@isTest`.
-  bool get hasIsTest;
-
-  /// Whether the receiver has an annotation of the form `@isTestGroup`.
-  bool get hasIsTestGroup;
-
-  /// Whether the receiver has an annotation of the form `@JS(..)`.
-  bool get hasJS;
-
-  /// Whether the receiver has an annotation of the form `@literal`.
-  bool get hasLiteral;
-
-  /// Whether the receiver has an annotation of the form `@mustBeConst`.
-  bool get hasMustBeConst;
-
-  /// Whether the receiver has an annotation of the form `@mustBeOverridden`.
-  bool get hasMustBeOverridden;
-
-  /// Whether the receiver has an annotation of the form `@mustCallSuper`.
-  bool get hasMustCallSuper;
-
-  /// Whether the receiver has an annotation of the form `@nonVirtual`.
-  bool get hasNonVirtual;
-
-  /// Whether the receiver has an annotation of the form `@optionalTypeArgs`.
-  bool get hasOptionalTypeArgs;
-
-  /// Whether the receiver has an annotation of the form `@override`.
-  bool get hasOverride;
-
-  /// Whether the receiver has an annotation of the form `@protected`.
-  bool get hasProtected;
-
-  /// Whether the receiver has an annotation of the form `@redeclare`.
-  bool get hasRedeclare;
-
-  /// Whether the receiver has an annotation of the form `@reopen`.
-  bool get hasReopen;
-
-  /// Whether the receiver has an annotation of the form `@required`.
-  bool get hasRequired;
-
-  /// Whether the receiver has an annotation of the form `@sealed`.
-  bool get hasSealed;
-
-  /// Whether the receiver has an annotation of the form `@useResult`
-  /// or `@UseResult('..')`.
-  bool get hasUseResult;
-
-  /// Whether the receiver has an annotation of the form `@visibleForOverriding`.
-  bool get hasVisibleForOverriding;
-
-  /// Whether the receiver has an annotation of the form `@visibleForTemplate`.
-  bool get hasVisibleForTemplate;
-
-  /// Whether the receiver has an annotation of the form `@visibleForTesting`.
-  bool get hasVisibleForTesting;
-
-  /// Whether the receiver has an annotation of the form
-  /// `@visibleOutsideTemplate`.
-  bool get hasVisibleOutsideTemplate;
-
-  /// Whether the receiver has an annotation of the form `@widgetFactory`.
-  bool get hasWidgetFactory;
-}
-
-/// A method.
-///
-/// The method can be either an instance method, an operator, or a static
-/// method.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class MethodElement2
-    implements ExecutableElement2, HasSinceSdkVersion {
-  /// The name of the method that can be implemented by a class to allow its
-  /// instances to be invoked as if they were a function.
-  static final String CALL_METHOD_NAME = "call";
-
-  /// The name of the method that will be invoked if an attempt is made to
-  /// invoke an undefined method on an object.
-  static final String NO_SUCH_METHOD_METHOD_NAME = "noSuchMethod";
-
-  @override
-  MethodElement2 get baseElement;
-
-  @override
-  MethodFragment get firstFragment;
-
-  @override
-  List<MethodFragment> get fragments;
-
-  /// Whether the method defines an operator.
-  ///
-  /// The test might be based on the name of the executable element, in which
-  /// case the result will be correct when the name is legal.
-  bool get isOperator;
-}
-
-/// The portion of a [MethodElement2] contributed by a single declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class MethodFragment implements ExecutableFragment {
-  @override
-  MethodElement2 get element;
-
-  @override
-  InstanceFragment? get enclosingFragment;
-
-  @override
-  MethodFragment? get nextFragment;
-
-  @override
-  MethodFragment? get previousFragment;
-}
-
-/// An element that represents a mixin.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class MixinElement2 implements InterfaceElement2 {
-  @override
-  MixinFragment get firstFragment;
-
-  @override
-  List<MixinFragment> get fragments;
-
-  /// Whether the mixin is a base mixin.
-  ///
-  /// A mixin is a base mixin if it has an explicit `base` modifier.
-  /// The base modifier allows a mixin to be mixed in, but not implemented.
-  bool get isBase;
-
-  /// The superclass constraints defined for this mixin.
-  ///
-  /// If the declaration does not have an `on` clause, then the list will
-  /// contain the type for the class `Object`.
-  ///
-  /// <b>Note:</b> Because the element model represents the state of the code,
-  /// it is possible for it to be semantically invalid. In particular, it is not
-  /// safe to assume that the inheritance structure of a class does not contain
-  /// a cycle. Clients that traverse the inheritance structure must explicitly
-  /// guard against infinite loops.
-  List<InterfaceType> get superclassConstraints;
-
-  /// Whether the element, assuming that it is within scope, is
-  /// implementable to classes, mixins, and enums in the given [library].
-  bool isImplementableIn2(LibraryElement2 library);
-}
-
-/// The portion of a [PrefixElement2] contributed by a single declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class MixinFragment implements InterfaceFragment {
-  @override
-  MixinElement2 get element;
-
-  @override
-  MixinFragment? get nextFragment;
-
-  @override
-  MixinFragment? get previousFragment;
-
-  /// The superclass constraints defined for this mixin.
-  ///
-  /// If the declaration does not have an `on` clause, then the list will
-  /// contain the type for the class `Object`.
-  ///
-  /// <b>Note:</b> Because the element model represents the state of the code,
-  /// it is possible for it to be semantically invalid. In particular, it is not
-  /// safe to assume that the inheritance structure of a class does not contain
-  /// a cycle. Clients that traverse the inheritance structure must explicitly
-  /// guard against infinite loops.
-  List<InterfaceType> get superclassConstraints;
-}
-
-/// A pseudo-element that represents multiple elements defined within a single
-/// scope that have the same name. This situation is not allowed by the
-/// language, so objects implementing this interface always represent an error.
-/// As a result, most of the normal operations on elements do not make sense
-/// and will return useless results.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class MultiplyDefinedElement2 implements Element2 {
-  /// The elements that were defined within the scope to have the same name.
-  List<Element2> get conflictingElements2;
-
-  @override
-  MultiplyDefinedFragment get firstFragment;
-
-  @override
-  List<MultiplyDefinedFragment> get fragments;
-}
-
-/// The fragment for a [MultiplyDefinedElement2].
-///
-/// It has no practical use, and exists for consistency, so that the
-/// corresponding element has a fragment.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class MultiplyDefinedFragment implements Fragment {
-  @override
-  MultiplyDefinedElement2 get element;
-
-  @override
-  Null get nextFragment;
-
-  /// Always returns zero.
-  @override
-  int get offset;
-
-  @override
-  Null get previousFragment;
-}
-
-/// A 'part' directive within a library fragment.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class PartInclude implements ElementDirective {
-  /// The [LibraryFragment], if [uri] is a [DirectiveUriWithUnit].
-  LibraryFragment? get includedFragment;
-}
-
-/// A pattern variable.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class PatternVariableElement2 implements LocalVariableElement2 {
-  @override
-  PatternVariableFragment get firstFragment;
-
-  @override
-  List<PatternVariableFragment> get fragments;
-
-  /// The variable in which this variable joins with other pattern variables
-  /// with the same name, in a logical-or pattern, or shared case scope.
-  JoinPatternVariableElement2? get join2;
-}
-
-/// The portion of a [PatternVariableElement2] contributed by a single
-/// declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class PatternVariableFragment implements LocalVariableFragment {
-  @override
-  PatternVariableElement2 get element;
-
-  /// The variable in which this variable joins with other pattern variables
-  /// with the same name, in a logical-or pattern, or shared case scope.
-  JoinPatternVariableFragment? get join2;
-
-  @override
-  PatternVariableFragment? get nextFragment;
-
-  @override
-  PatternVariableFragment? get previousFragment;
-}
-
-/// A prefix used to import one or more libraries into another library.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class PrefixElement2 implements Element2 {
-  /// There is no enclosing element for import prefixes, which are elements,
-  /// but exist inside a single [LibraryFragment], not an element.
-  @override
-  Null get enclosingElement2;
-
-  @override
-  PrefixFragment get firstFragment;
-
-  @override
-  List<PrefixFragment> get fragments;
-
-  /// The imports that share this prefix.
-  List<LibraryImport> get imports;
-
-  @override
-  LibraryElement2 get library2;
-
-  /// The name lookup scope for this import prefix.
-  ///
-  /// It consists of elements imported into the enclosing library with this
-  /// prefix. The namespace combinators of the import directives are taken
-  /// into account.
-  Scope get scope;
-}
-
-/// The portion of a [PrefixElement2] contributed by a single declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class PrefixFragment implements Fragment {
-  @override
-  PrefixElement2 get element;
-
-  @override
-  LibraryFragment? get enclosingFragment;
-
-  /// Whether the [LibraryImport] is deferred.
-  bool get isDeferred;
-
-  @override
-  PrefixFragment? get nextFragment;
-
-  @override
-  PrefixFragment? get previousFragment;
-}
-
-/// A variable that might be subject to type promotion.  This might be a local
-/// variable or a parameter.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class PromotableElement2 implements VariableElement2 {
-  @override
-  PromotableFragment get firstFragment;
-
-  @override
-  List<PromotableFragment> get fragments;
-}
-
-/// The portion of a [PromotableElement2] contributed by a single declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class PromotableFragment implements VariableFragment {
-  @override
-  PromotableElement2 get element;
-
-  @override
-  PromotableFragment? get nextFragment;
-
-  @override
-  PromotableFragment? get previousFragment;
-}
-
-/// A getter or a setter.
-///
-/// Property accessors can either be defined explicitly or they can be induced
-/// by either a top-level variable or a field. Induced property accessors are
-/// synthetic.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class PropertyAccessorElement2 implements ExecutableElement2 {
-  @override
-  PropertyAccessorElement2 get baseElement;
-
-  @override
-  Element2 get enclosingElement2;
-
-  @override
-  PropertyAccessorFragment get firstFragment;
-
-  @override
-  List<PropertyAccessorFragment> get fragments;
-
-  /// The field or top-level variable associated with this getter.
-  ///
-  /// If this getter was explicitly defined (is not synthetic) then the variable
-  /// associated with it will be synthetic.
-  PropertyInducingElement2? get variable3;
-}
-
-/// The portion of a [GetterElement] contributed by a single declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class PropertyAccessorFragment implements ExecutableFragment {
-  @override
-  PropertyAccessorElement2 get element;
-
-  @override
-  PropertyAccessorFragment? get nextFragment;
-
-  @override
-  PropertyAccessorFragment? get previousFragment;
-
-  /// The field or top-level variable associated with this property accessors.
-  ///
-  /// If this property accessor was explicitly defined (is not synthetic) then
-  /// the variable associated with it will be synthetic.
-  PropertyInducingFragment? get variable3;
-}
-
-/// A variable that has an associated getter and possibly a setter. Note that
-/// explicitly defined variables implicitly define a synthetic getter and that
-/// non-`final` explicitly defined variables implicitly define a synthetic
-/// setter. Symmetrically, synthetic fields are implicitly created for
-/// explicitly defined getters and setters. The following rules apply:
-///
-/// * Every explicit variable is represented by a non-synthetic
-///   [PropertyInducingElement2].
-/// * Every explicit variable induces a synthetic [GetterElement],
-///   possibly a synthetic [SetterElement.
-/// * Every explicit getter by a non-synthetic [GetterElement].
-/// * Every explicit setter by a non-synthetic [SetterElement].
-/// * Every explicit getter or setter (or pair thereof if they have the same
-///   name) induces a variable that is represented by a synthetic
-///   [PropertyInducingElement2].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class PropertyInducingElement2
-    implements VariableElement2, Annotatable, HasSinceSdkVersion {
-  @override
-  PropertyInducingFragment get firstFragment;
-
-  @override
-  List<PropertyInducingFragment> get fragments;
-
-  /// The getter associated with this variable.
-  ///
-  /// If this variable was explicitly defined (is not synthetic) then the
-  /// getter associated with it will be synthetic.
-  GetterElement? get getter2;
-
-  /// Whether any fragment of this variable has an initializer at declaration.
-  bool get hasInitializer;
-
-  @override
-  LibraryElement2 get library2;
-
-  /// The setter associated with this variable.
-  ///
-  /// Returns `null` if the variable is effectively `final` and therefore does
-  /// not have a setter associated with it.
-  ///
-  /// This can happen either because the variable is explicitly defined as
-  /// being `final` or because the variable is induced by an explicit getter
-  /// that does not have a corresponding setter. If this variable was
-  /// explicitly defined (is not synthetic) then the setter associated with
-  /// it will be synthetic.
-  SetterElement? get setter2;
-}
-
-/// The portion of a [PropertyInducingElement2] contributed by a single
-/// declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class PropertyInducingFragment
-    implements VariableFragment, Annotatable {
-  @override
-  PropertyInducingElement2 get element;
-
-  /// The getter associated with this variable.
-  ///
-  /// If this variable was explicitly defined (is not synthetic) then the
-  /// getter associated with it will be synthetic.
-  GetterFragment? get getter2;
-
-  /// Whether the variable has an initializer at declaration.
-  bool get hasInitializer;
-
-  /// Whether the element is an augmentation.
-  ///
-  /// Property inducing fragments are augmentations if they are explicitly
-  /// marked as such using the 'augment' modifier.
-  bool get isAugmentation;
-
-  /// Whether this fragment is synthetic.
-  ///
-  /// A synthetic fragment is a fragment that is not represented in the source
-  /// code explicitly, but is implied by the source code, such as the default
-  /// constructor for a class that does not explicitly define any constructors.
-  bool get isSynthetic;
-
-  @override
-  LibraryFragment get libraryFragment;
-
-  @override
-  PropertyInducingFragment? get nextFragment;
-
-  @override
-  PropertyInducingFragment? get previousFragment;
-
-  /// The setter associated with this variable.
-  ///
-  /// Returns `null` if the variable is effectively `final` and therefore
-  /// doesn't have a setter associated with it.
-  ///
-  /// This can happen either because the variable is explicitly defined as
-  /// being `final` or because the variable is induced by an explicit getter
-  /// that does not have a corresponding setter. If this variable was
-  /// explicitly defined (is not synthetic) then the setter associated with
-  /// it will be synthetic.
-  SetterFragment? get setter2;
-}
-
-/// A setter.
-///
-/// Setters can either be defined explicitly or they can be induced by either a
-/// top-level variable or a field. Induced setters are synthetic.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class SetterElement implements PropertyAccessorElement2 {
-  @override
-  SetterElement get baseElement;
-
-  /// The getter that corresponds to (has the same name as) this setter, or
-  /// `null` if there is no corresponding getter.
-  GetterElement? get correspondingGetter2;
-
-  @override
-  SetterFragment get firstFragment;
-
-  @override
-  List<SetterFragment> get fragments;
-}
-
-/// The portion of a [SetterElement] contributed by a single declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class SetterFragment implements PropertyAccessorFragment {
-  @override
-  SetterElement get element;
-
-  @override
-  SetterFragment? get nextFragment;
-
-  /// The offset of the setter name.
-  ///
-  /// If the setter is implicit (because it's induced by a field or top level
-  /// variable declaration), this is the offset of the field or top level
-  /// variable name.
-  @override
-  int get offset;
-
-  @override
-  SetterFragment? get previousFragment;
-}
-
-/// A super formal parameter.
-///
-/// Super formal parameters can only be defined within a constructor element.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class SuperFormalParameterElement2 implements FormalParameterElement {
-  @override
-  SuperFormalParameterFragment get firstFragment;
-
-  @override
-  List<SuperFormalParameterFragment> get fragments;
-
-  /// The associated super-constructor parameter, from the super-constructor
-  /// that is referenced by the implicit or explicit super-constructor
-  /// invocation.
-  ///
-  /// Can be `null` for erroneous code - not existing super-constructor,
-  /// no corresponding parameter in the super-constructor.
-  FormalParameterElement? get superConstructorParameter2;
-}
-
-/// The portion of a [SuperFormalParameterElement2] contributed by a single
-/// declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class SuperFormalParameterFragment implements FormalParameterFragment {
-  @override
-  SuperFormalParameterElement2 get element;
-
-  @override
-  SuperFormalParameterFragment? get nextFragment;
-
-  @override
-  SuperFormalParameterFragment? get previousFragment;
-}
-
-/// A top-level function.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class TopLevelFunctionElement
-    implements ExecutableElement2, HasSinceSdkVersion {
-  /// The name of the function used as an entry point.
-  static const String MAIN_FUNCTION_NAME = "main";
-
-  /// The name of the synthetic function defined for libraries that are
-  /// deferred.
-  static final String LOAD_LIBRARY_NAME = "loadLibrary";
-
-  @override
-  TopLevelFunctionElement get baseElement;
-
-  @override
-  TopLevelFunctionFragment get firstFragment;
-
-  @override
-  List<TopLevelFunctionFragment> get fragments;
-
-  /// Whether the function represents `identical` from the `dart:core` library.
-  bool get isDartCoreIdentical;
-
-  /// Whether the function is an entry point.
-  ///
-  /// A top-level function is an entry point if it has the name `main`.
-  bool get isEntryPoint;
-}
-
-/// The portion of a [TopLevelFunctionElement] contributed by a single
-/// declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class TopLevelFunctionFragment implements ExecutableFragment {
-  @override
-  TopLevelFunctionElement get element;
-
-  @override
-  TopLevelFunctionFragment? get nextFragment;
-
-  @override
-  TopLevelFunctionFragment? get previousFragment;
-}
-
-/// A top-level variable.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class TopLevelVariableElement2 implements PropertyInducingElement2 {
-  @override
-  TopLevelVariableElement2 get baseElement;
-
-  @override
-  TopLevelVariableFragment get firstFragment;
-
-  @override
-  List<TopLevelVariableFragment> get fragments;
-
-  /// Whether the field was explicitly marked as being external.
-  bool get isExternal;
-}
-
-/// The portion of a [TopLevelVariableElement2] contributed by a single
-/// declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class TopLevelVariableFragment implements PropertyInducingFragment {
-  @override
-  TopLevelVariableElement2 get element;
-
-  @override
-  TopLevelVariableFragment? get nextFragment;
-
-  @override
-  TopLevelVariableFragment? get previousFragment;
-}
-
-/// A type alias (`typedef`).
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class TypeAliasElement2
-    implements
-        TypeParameterizedElement2,
-        TypeDefiningElement2,
-        HasSinceSdkVersion {
-  /// If the aliased type has structure, return the corresponding element.
-  /// For example, it could be [GenericFunctionTypeElement2].
-  ///
-  /// If there is no structure, return `null`.
-  Element2? get aliasedElement2;
-
-  /// The aliased type.
-  ///
-  /// If non-function type aliases feature is enabled for the enclosing library,
-  /// this type might be just anything. If the feature is disabled, return
-  /// a [FunctionType].
-  DartType get aliasedType;
-
-  @override
-  LibraryElement2 get enclosingElement2;
-
-  @override
-  TypeAliasFragment get firstFragment;
-
-  @override
-  List<TypeAliasFragment> get fragments;
-
-  /// Returns the type resulting from instantiating this typedef with the given
-  /// [typeArguments] and [nullabilitySuffix].
-  ///
-  /// Note that this always instantiates the typedef itself, so for a
-  /// [TypeAliasElement2] the returned [DartType] might still be a generic
-  /// type, with type formals. For example, if the typedef is:
-  ///
-  ///     typedef F<T> = void Function<U>(T, U);
-  ///
-  /// then `F<int>` will produce `void Function<U>(int, U)`.
-  DartType instantiate({
-    required List<DartType> typeArguments,
-    required NullabilitySuffix nullabilitySuffix,
-  });
-}
-
-/// The portion of a [TypeAliasElement2] contributed by a single declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class TypeAliasFragment
-    implements TypeParameterizedFragment, TypeDefiningFragment {
-  @override
-  TypeAliasElement2 get element;
-
-  @override
-  LibraryFragment? get enclosingFragment;
-
-  @override
-  TypeAliasFragment? get nextFragment;
-
-  @override
-  TypeAliasFragment? get previousFragment;
-}
-
-/// An element that defines a type.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class TypeDefiningElement2 implements Element2, Annotatable {
-  // TODO(brianwilkerson): Evaluate to see whether this type is actually needed
-  //  after converting clients to the new API.
-
-  @override
-  TypeDefiningFragment get firstFragment;
-
-  @override
-  List<TypeDefiningFragment> get fragments;
-}
-
-/// The portion of a [TypeDefiningElement2] contributed by a single declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class TypeDefiningFragment implements Fragment, Annotatable {
-  @override
-  TypeDefiningElement2 get element;
-
-  @override
-  TypeDefiningFragment? get nextFragment;
-
-  /// The offset of the type name.
-  ///
-  /// If the type in the language specification and not in any source file
-  /// (e.g., `dynamic`), this value is zero.
-  @override
-  int get offset;
-
-  @override
-  TypeDefiningFragment? get previousFragment;
-}
-
-/// A type parameter.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class TypeParameterElement2 implements TypeDefiningElement2 {
-  @override
-  TypeParameterElement2 get baseElement;
-
-  /// The type representing the bound associated with this parameter.
-  ///
-  /// Returns `null` if this parameter does not have an explicit bound. Being
-  /// able to distinguish between an implicit and explicit bound is needed by
-  /// the instantiate to bounds algorithm.`
-  DartType? get bound;
-
-  @override
-  TypeParameterFragment get firstFragment;
-
-  @override
-  List<TypeParameterFragment> get fragments;
-
-  /// Returns the [TypeParameterType] with the given [nullabilitySuffix] for
-  /// this type parameter.
-  TypeParameterType instantiate({required NullabilitySuffix nullabilitySuffix});
-}
-
-/// The portion of a [TypeParameterElement2] contributed by a single
-/// declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class TypeParameterFragment implements TypeDefiningFragment {
-  @override
-  TypeParameterElement2 get element;
-
-  @override
-  TypeParameterFragment? get nextFragment;
-
-  @override
-  TypeParameterFragment? get previousFragment;
-}
-
-/// An element that has type parameters, such as a class, typedef, or method.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class TypeParameterizedElement2 implements Element2, Annotatable {
-  @override
-  TypeParameterizedFragment get firstFragment;
-
-  @override
-  List<TypeParameterizedFragment> get fragments;
-
-  /// If the element defines a type, indicates whether the type may safely
-  /// appear without explicit type arguments as the bounds of a type parameter
-  /// declaration.
-  ///
-  /// If the element does not define a type, returns `true`.
-  bool get isSimplyBounded;
-
-  @override
-  LibraryElement2 get library2;
-
-  /// The type parameters declared by this element directly.
-  ///
-  /// This does not include type parameters that are declared by any enclosing
-  /// elements.
-  List<TypeParameterElement2> get typeParameters2;
-}
-
-/// The portion of a [TypeParameterizedElement2] contributed by a single
-/// declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class TypeParameterizedFragment implements Fragment, Annotatable {
-  @override
-  TypeParameterizedElement2 get element;
-
-  @override
-  TypeParameterizedFragment? get nextFragment;
-
-  @override
-  TypeParameterizedFragment? get previousFragment;
-
-  /// The type parameters declared by this fragment directly.
-  ///
-  /// This does not include type parameters that are declared by any enclosing
-  /// fragments.
-  List<TypeParameterFragment> get typeParameters2;
-}
-
-/// A variable.
-///
-/// There are more specific subclasses for more specific kinds of variables.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class VariableElement2 implements Element2 {
-  /// The constant initializer for this constant variable, or the default
-  /// value for this formal parameter.
-  ///
-  /// Is `null` if this variable is not a constant, or does not have the
-  /// initializer or the default value specified.
-  ConstantInitializer? get constantInitializer2;
-
-  @override
-  VariableFragment get firstFragment;
-
-  @override
-  List<VariableFragment> get fragments;
-
-  /// Whether the variable element did not have an explicit type specified
-  /// for it.
-  bool get hasImplicitType;
-
-  /// Whether the variable was declared with the 'const' modifier.
-  bool get isConst;
-
-  /// Whether the variable was declared with the 'final' modifier.
-  ///
-  /// Variables that are declared with the 'const' modifier will return `false`
-  /// even though they are implicitly final.
-  bool get isFinal;
-
-  /// Whether the variable uses late evaluation semantics.
-  bool get isLate;
-
-  /// Whether the element is a static variable, as per section 8 of the Dart
-  /// Language Specification:
-  ///
-  /// > A static variable is a variable that is not associated with a particular
-  /// > instance, but rather with an entire library or class. Static variables
-  /// > include library variables and class variables. Class variables are
-  /// > variables whose declaration is immediately nested inside a class
-  /// > declaration and includes the modifier static. A library variable is
-  /// > implicitly static.
-  bool get isStatic;
-
-  /// The declared type of this variable.
-  DartType get type;
-
-  /// Returns a representation of the value of this variable.
-  ///
-  /// If the value had not previously been computed, it will be computed as a
-  /// result of invoking this method.
-  ///
-  /// Returns `null` if either this variable was not declared with the 'const'
-  /// modifier or if the value of this variable could not be computed because of
-  /// errors.
-  DartObject? computeConstantValue();
-}
-
-/// The portion of a [VariableElement2] contributed by a single declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class VariableFragment implements Fragment {
-  @override
-  VariableElement2 get element;
-
-  /// The initializer for this constant variable fragment, or the default value
-  /// for this formal parameter fragment.
-  ///
-  /// Is `null` if this variable fragment is not a constant, or does not have
-  /// the initializer or the default value specified.
-  Expression? get initializer;
-
-  @override
-  VariableFragment? get nextFragment;
-
-  @override
-  VariableFragment? get previousFragment;
-}
+export 'package:analyzer/dart/element/element.dart';