diff --git a/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart b/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart
index 87e141e..325fb9a 100644
--- a/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart
+++ b/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart
@@ -7,7 +7,6 @@
 import 'package:analysis_server/src/utilities/extensions/ast.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
index cc69056..997b794 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
@@ -11,7 +11,6 @@
 import 'package:analysis_server/src/protocol_server.dart' show NavigationTarget;
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as protocol;
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart
index 69a2ca1..0c95b2d 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart
@@ -8,7 +8,6 @@
 import 'package:analysis_server/src/utilities/flutter.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart
index ca72f42..9238fce 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/element.dart' as analyzer;
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/rename_local.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/rename_local.dart
index 70ad3f7..2d66735 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/legacy/rename_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/rename_local.dart
@@ -14,7 +14,6 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/source.dart';
 
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
index 3d96567..eafed50 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/search/search_engine.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
 import 'package:analyzer/src/dart/analysis/search.dart';
diff --git a/pkg/analysis_server/lib/src/status/element_writer.dart b/pkg/analysis_server/lib/src/status/element_writer.dart
index 0959bd1..1cd365f 100644
--- a/pkg/analysis_server/lib/src/status/element_writer.dart
+++ b/pkg/analysis_server/lib/src/status/element_writer.dart
@@ -5,7 +5,6 @@
 import 'dart:convert';
 
 import 'package:analysis_server/src/status/tree_writer.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 
diff --git a/pkg/analysis_server/lib/src/status/tree_writer.dart b/pkg/analysis_server/lib/src/status/tree_writer.dart
index a1fe248..7a09228 100644
--- a/pkg/analysis_server/lib/src/status/tree_writer.dart
+++ b/pkg/analysis_server/lib/src/status/tree_writer.dart
@@ -4,7 +4,6 @@
 
 import 'dart:convert';
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/source.dart';
diff --git a/pkg/analysis_server/test/services/refactoring/agnostic/change_method_signature_test.dart b/pkg/analysis_server/test/services/refactoring/agnostic/change_method_signature_test.dart
index 32e2ad3..737285c 100644
--- a/pkg/analysis_server/test/services/refactoring/agnostic/change_method_signature_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/agnostic/change_method_signature_test.dart
@@ -11,7 +11,6 @@
     show ArgumentsTrailingComma;
 import 'package:analysis_server/src/services/search/search_engine_internal.dart';
 import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 7699ce3..57c40f4 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -36,898 +36,80 @@
 /// represented by an element.
 library;
 
-import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/analysis/session.dart';
-import 'package:analyzer/dart/constant/value.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/src/dart/constant/evaluation.dart';
-import 'package:analyzer/src/dart/resolver/scope.dart' show Namespace;
-import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:analyzer/src/task/api/model.dart' show AnalysisTarget;
-import 'package:meta/meta.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:pub_semver/pub_semver.dart';
 
-/// A library augmentation import directive within a library.
-///
-/// Clients may not extend, implement or mix-in this class.
-@experimental
-abstract class AugmentationImportElement implements _ExistingElement {
-  @Deprecated('Use enclosingElement2 instead')
-  @override
-  LibraryOrAugmentationElement get enclosingElement;
-
-  @override
-  LibraryOrAugmentationElement get enclosingElement2;
-
-  /// The [LibraryAugmentationElement], if [uri] is a
-  /// [DirectiveUriWithAugmentation].
-  LibraryAugmentationElement? get importedAugmentation;
-
-  /// The offset of the `import` keyword.
-  int get importKeywordOffset;
-
-  /// The interpretation of the URI specified in the directive.
-  DirectiveUri get uri;
-}
-
-/// The result of applying augmentations to a [ClassElement].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class AugmentedClassElement implements AugmentedInterfaceElement {
-  @override
-  ClassElement get declaration;
-}
-
-/// The result of applying augmentations to an [EnumElement].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class AugmentedEnumElement implements AugmentedInterfaceElement {}
-
-/// The result of applying augmentations to an [ExtensionElement].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class AugmentedExtensionElement implements AugmentedInstanceElement {}
-
-/// The result of applying augmentations to an [InlineClassElement].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class AugmentedInlineClassElement
-    implements AugmentedNamedInstanceElement {}
-
-/// The result of applying augmentations to a [InstanceElement].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class AugmentedInstanceElement {
-  /// The accessors (getters and setters) declared in this element.
-  ///
-  /// [PropertyAccessorElement]s replace corresponding elements,
-  /// other [PropertyAccessorElement]s are appended.
-  List<PropertyAccessorElement> get accessors;
-
-  /// The declaration (not augmentation) that owns this result.
-  InstanceElement get declaration;
-
-  /// The fields declared in this element.
-  ///
-  /// [FieldAugmentationElement]s replace corresponding elements, other
-  /// [FieldElement]s are appended.
-  List<FieldElement> get fields;
-
-  /// The metadata associated with this element.
-  ///
-  /// This is a union of annotations associated with the class declaration and
-  /// all its augmentations.
-  List<ElementAnnotation> get metadata;
-
-  /// The methods declared in this element.
-  ///
-  /// [MethodAugmentationElement]s replace corresponding elements, other
-  /// [MethodElement]s are appended.
-  List<MethodElement> get methods;
-
-  /// Returns the field from [fields] that has the given [name].
-  FieldElement? getField(String name);
-
-  /// Returns the getter from [accessors] that has the given [name].
-  PropertyAccessorElement? getGetter(String name);
-
-  /// Returns the method from [methods] that has the given [name].
-  MethodElement? getMethod(String name);
-
-  /// Returns the setter from [accessors] that has the given [name].
-  PropertyAccessorElement? getSetter(String name);
-}
-
-/// The result of applying augmentations to a [InterfaceElement].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class AugmentedInterfaceElement
-    implements AugmentedNamedInstanceElement {
-  @override
-  InterfaceElement get declaration;
-
-  /// The interfaces implemented by this element.
-  ///
-  /// This is a union of interfaces declared by the class declaration and
-  /// all its augmentations.
-  List<InterfaceType> get interfaces;
-
-  /// The mixins applied by this class or in its augmentations.
-  ///
-  /// This is a union of mixins applied by the class declaration and all its
-  /// augmentations.
-  List<InterfaceType> get mixins;
-}
-
-/// The result of applying augmentations to a [MixinElement].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class AugmentedMixinElement extends AugmentedInterfaceElement {
-  /// The superclass constraints of this element.
-  ///
-  /// This is a union of constraints declared by the class declaration and
-  /// all its augmentations.
-  List<InterfaceType> get superclassConstraints;
-}
-
-/// The result of applying augmentations to a [NamedInstanceElement].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class AugmentedNamedInstanceElement
-    implements AugmentedInstanceElement {
-  /// The constructors declared in this element.
-  ///
-  /// [ConstructorAugmentationElement]s replace corresponding elements,
-  /// other [ConstructorElement]s are appended.
-  List<ConstructorElement> get constructors;
-
-  @override
-  NamedInstanceElement get declaration;
-
-  /// The unnamed constructor from [constructors].
-  ConstructorElement? get unnamedConstructor;
-
-  /// Returns the constructor from [constructors] that has the given [name].
-  ConstructorElement? getNamedConstructor(String name);
-}
-
-/// A pattern variable that is explicitly declared.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class BindPatternVariableElement implements PatternVariableElement {}
-
-/// An element that represents a class or a mixin. The class can be defined by
-/// either a class declaration (with a class body), a mixin application (without
-/// a class body), a mixin declaration, or an enum declaration.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class ClassElement implements InterfaceElement {
-  @experimental
-  @override
-  ClassElement? get augmentation;
-
-  @experimental
-  @override
-  ClassElement? get augmentationTarget;
-
-  @experimental
-  @override
-  AugmentedClassElement? get augmented;
-
-  /// 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 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 inline class.
-  ///
-  /// A class is an inline class if it has an explicit `inline` modifier.
-  @experimental
-  bool get isInline;
-
-  /// 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, is extendable to
-  /// classes in the given [library].
-  bool isExtendableIn(LibraryElement library);
-
-  /// Whether the class, assuming that it is within scope, is
-  /// implementable to classes, mixins, and enums in the given [library].
-  bool isImplementableIn(LibraryElement library);
-
-  /// Whether the class, assuming that it is within scope, is able to be
-  /// mixed-in by classes and enums in the given [library].
-  bool isMixableIn(LibraryElement library);
-}
-
-/// An element that is contained within a [ClassElement].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class ClassMemberElement implements Element {
-  // TODO(brianwilkerson) Either remove this class or rename it to something
-  //  more correct.
-
-  @Deprecated('Use enclosingElement2 instead')
-  @override
-  Element get enclosingElement;
-
-  @override
-  Element get enclosingElement2;
-
-  /// 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;
-}
-
-/// An element representing a compilation unit.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class CompilationUnitElement implements UriReferencedElement {
-  /// The top-level accessors (getters and setters) declared in this
-  /// compilation unit.
-  List<PropertyAccessorElement> get accessors;
-
-  /// The classes declared in this compilation unit.
-  List<ClassElement> get classes;
-
-  /// The library, or library augmentation that encloses this unit.
-  @Deprecated('Use enclosingElement2 instead')
-  @override
-  LibraryOrAugmentationElement get enclosingElement;
-
-  /// The library, or library augmentation that encloses this unit.
-  @override
-  LibraryOrAugmentationElement get enclosingElement2;
-
-  /// The enums declared in this compilation unit.
-  List<EnumElement> get enums;
-
-  /// The extensions declared in this compilation unit.
-  List<ExtensionElement> get extensions;
-
-  /// The top-level functions declared in this compilation unit.
-  List<FunctionElement> get functions;
-
-  /// The [LineInfo] for the [source].
-  LineInfo get lineInfo;
-
-  /// The mixins declared in this compilation unit.
-  List<MixinElement> get mixins;
-
-  @override
-  AnalysisSession get session;
-
-  /// The top-level variables declared in this compilation unit.
-  List<TopLevelVariableElement> get topLevelVariables;
-
-  /// The type aliases declared in this compilation unit.
-  List<TypeAliasElement> get typeAliases;
-
-  /// Returns the class defined in this compilation unit that has the given
-  /// [name], or `null` if this compilation unit does not define a class with
-  /// the given name.
-  ClassElement? getClass(String name);
-
-  /// Returns the enum defined in this compilation unit that has the given
-  /// [name], or `null` if this compilation unit does not define an enum with
-  /// the given name.
-  EnumElement? getEnum(String name);
-}
-
-/// An element representing a constructor or a factory method defined within a
-/// class.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class ConstructorElement
-    implements ClassMemberElement, ExecutableElement, ConstantEvaluationTarget {
-  @experimental
-  @override
-  ConstructorElement? get augmentation;
-
-  @experimental
-  @override
-  ConstructorElement? get augmentationTarget;
-
-  @override
-  ConstructorElement get declaration;
-
-  @override
-  String get displayName;
-
-  @Deprecated('Use enclosingElement2 instead')
-  @override
-  InterfaceElement get enclosingElement;
-
-  @override
-  NamedInstanceElement get enclosingElement2;
-
-  /// 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;
-
-  @override
-  String get name;
-
-  /// The offset of the character immediately following the last character of
-  /// this constructor's name, or `null` if not named.
-  ///
-  /// TODO(migration): encapsulate [nameEnd] and [periodOffset]?
-  int? get nameEnd;
-
-  /// The offset of the `.` before this constructor name, or `null` if not
-  /// named.
-  int? get periodOffset;
-
-  /// The constructor to which this constructor is redirecting, or `null` if
-  /// this constructor does not redirect to another constructor or if the
-  /// library containing this constructor has not yet been resolved.
-  ConstructorElement? get redirectedConstructor;
-
-  @Deprecated('Use returnType2 instead')
-  @override
-  InterfaceType get returnType;
-
-  @override
-  DartType get returnType2;
-}
-
-/// [ImportElementPrefix] that is used together with `deferred`.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class DeferredImportElementPrefix implements ImportElementPrefix {}
-
-/// Meaning of a URI referenced in a directive.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class DirectiveUri {}
-
-/// [DirectiveUriWithSource] that references a [LibraryAugmentationElement].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class DirectiveUriWithAugmentation extends DirectiveUriWithSource {
-  /// The library augmentation referenced by the [source].
-  LibraryAugmentationElement get augmentation;
-}
-
-/// [DirectiveUriWithSource] that references a [LibraryElement].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class DirectiveUriWithLibrary extends DirectiveUriWithSource {
-  /// The library referenced by the [source].
-  LibraryElement get library;
-}
-
-/// [DirectiveUriWithRelativeUriString] that can be parsed into a relative URI.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class DirectiveUriWithRelativeUri
-    extends DirectiveUriWithRelativeUriString {
-  /// The relative URI, parsed from [relativeUriString].
-  Uri get relativeUri;
-}
-
-/// [DirectiveUri] for which we can get its relative URI string.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class DirectiveUriWithRelativeUriString extends DirectiveUri {
-  /// The relative URI string specified in code.
-  String get relativeUriString;
-}
-
-/// [DirectiveUriWithRelativeUri] that resolves to a [Source].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class DirectiveUriWithSource extends DirectiveUriWithRelativeUri {
-  /// The result of resolving [relativeUri] against the enclosing URI.
-  Source get source;
-}
-
-/// [DirectiveUriWithSource] that references a [CompilationUnitElement].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class DirectiveUriWithUnit extends DirectiveUriWithSource {
-  /// The unit referenced by the [source].
-  CompilationUnitElement get unit;
-}
-
-/// 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 do not 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 do not 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 do not have a name.
-/// These correspond to unnamed functions and 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 Element implements AnalysisTarget {
-  /// A list of this element's children.
-  ///
-  /// There is no guarantee of the order in which the children will be included.
-  List<Element> get children;
-
-  /// The analysis context in which this element is defined.
-  AnalysisContext get context;
-
-  /// The declaration of this element.
-  ///
-  /// If the element is a view on an element, e.g. a method from an interface
-  /// type, with substituted type parameters, return the corresponding element
-  /// from the class, without any substitutions. If this element is already a
-  /// declaration (or a synthetic element, e.g. a synthetic property accessor),
-  /// return itself.
-  Element? get declaration;
-
-  /// The display name of this element, possibly the empty string if the
-  /// element does not have a name.
-  ///
-  /// In most cases the name and the display name are the same. Differences
-  /// though are cases such as setters where the name of some setter `set f(x)`
-  /// is `f=`, instead of `f`.
-  String get displayName;
-
-  /// The content of the documentation comment (including delimiters) for this
-  /// element, or `null` if this element does not or cannot have documentation.
-  String? get documentationComment;
-
-  /// The element that either physically or logically encloses this element.
-  ///
-  /// This will be `null` if this element is a library because libraries are
-  /// the top-level elements in the model.
-  @Deprecated('Use enclosingElement2 instead')
-  Element? get enclosingElement;
-
-  /// The element that either physically or logically encloses this element.
-  ///
-  /// This will be `null` if this element is a library because libraries are
-  /// the top-level elements in the model.
-  Element? get enclosingElement2;
-
-  /// Whether the element has an annotation of the form `@alwaysThrows`.
-  bool get hasAlwaysThrows;
-
-  /// Whether the element has an annotation of the form `@deprecated`
-  /// or `@Deprecated('..')`.
-  bool get hasDeprecated;
-
-  /// Whether the element has an annotation of the form `@doNotStore`.
-  bool get hasDoNotStore;
-
-  /// Whether the element has an annotation of the form `@factory`.
-  bool get hasFactory;
-
-  /// Whether the element has an annotation of the form `@internal`.
-  bool get hasInternal;
-
-  /// Whether the element has an annotation of the form `@isTest`.
-  bool get hasIsTest;
-
-  /// Whether the element has an annotation of the form `@isTestGroup`.
-  bool get hasIsTestGroup;
-
-  /// Whether the element has an annotation of the form `@JS(..)`.
-  bool get hasJS;
-
-  /// Whether the element has an annotation of the form `@literal`.
-  bool get hasLiteral;
-
-  /// Whether the element has an annotation of the form `@mustBeOverridden`.
-  bool get hasMustBeOverridden;
-
-  /// Whether the element has an annotation of the form `@mustCallSuper`.
-  bool get hasMustCallSuper;
-
-  /// Whether the element has an annotation of the form `@nonVirtual`.
-  bool get hasNonVirtual;
-
-  /// Whether the element has an annotation of the form `@optionalTypeArgs`.
-  bool get hasOptionalTypeArgs;
-
-  /// Whether the element has an annotation of the form `@override`.
-  bool get hasOverride;
-
-  /// Whether the element has an annotation of the form `@protected`.
-  bool get hasProtected;
-
-  /// Whether the element has an annotation of the form `@reopen`.
-  bool get hasReopen;
-
-  /// Whether the element has an annotation of the form `@required`.
-  bool get hasRequired;
-
-  /// Whether the element has an annotation of the form `@sealed`.
-  bool get hasSealed;
-
-  /// Whether the element has an annotation of the form `@useResult`
-  /// or `@UseResult('..')`.
-  bool get hasUseResult;
-
-  /// Whether the element has an annotation of the form `@visibleForOverriding`.
-  bool get hasVisibleForOverriding;
-
-  /// Whether the element has an annotation of the form `@visibleForTemplate`.
-  bool get hasVisibleForTemplate;
-
-  /// Whether the element has an annotation of the form `@visibleForTesting`.
-  bool get hasVisibleForTesting;
-
-  /// Whether the element has an annotation of the form
-  /// `@visibleOutsideTemplate`.
-  bool get hasVisibleOutsideTemplate;
-
-  /// The unique integer identifier of this element.
-  int get id;
-
-  /// Whether the element is private.
-  ///
-  /// Private elements are visible only within the library in which they are
-  /// declared.
-  bool get isPrivate;
-
-  /// Whether the element is public.
-  ///
-  /// Public elements are visible within any library that imports the library
-  /// in which they are declared.
-  bool get isPublic;
-
-  /// Whether the 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 element that this is.
-  ElementKind get kind;
-
-  /// Tibrary that contains this element.
-  ///
-  /// This will be the element itself if it is a library element. This will be
-  /// `null` if this element is [MultiplyDefinedElement] that is not contained
-  /// in a library.
-  LibraryElement? get library;
-
-  /// The location of this element in the element model.
-  ///
-  /// The object can be used to locate this element at a later time.
-  ElementLocation? get location;
-
-  /// All of the metadata associated with this element.
-  ///
-  /// The array will be empty if the element does not have any metadata or if
-  /// the library containing this element has not yet been resolved.
-  List<ElementAnnotation> get metadata;
-
-  /// The name of this element, or `null` if this element does not have a name.
-  String? get name;
-
-  /// The length of the name of this element in the file that contains the
-  /// declaration of this element, or `0` if this element does not have a name.
-  int get nameLength;
-
-  /// The offset of the name of this element in the file that contains the
-  /// declaration of this element, or `-1` if this element is synthetic, does
-  /// not have a name, or otherwise does not have an offset.
-  int get nameOffset;
-
-  /// 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.
-  Element get nonSynthetic;
-
-  /// The analysis session in which this element is defined.
-  AnalysisSession? get session;
-
-  /// The version where this 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 SDK, or does not have
-  /// a `@Since()` annotation applicable to it.
-  Version? get sinceSdkVersion;
-
-  @override
-  Source? get source;
-
-  /// Uses the given [visitor] to visit this element.
-  ///
-  /// Returns the value returned by the visitor as a result of visiting this
-  /// element.
-  T? accept<T>(ElementVisitor<T> visitor);
-
-  /// Returns the presentation of this element as it should appear when
-  /// presented to users.
-  ///
-  /// If [withNullability] is `true`, then [NullabilitySuffix.question] and
-  /// [NullabilitySuffix.star] in types will be represented as `?` and `*`.
-  /// [NullabilitySuffix.none] does not have any explicit presentation.
-  ///
-  /// If [withNullability] is `false`, nullability suffixes will not be
-  /// included into the presentation.
-  ///
-  /// If [multiline] is `true`, 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.
-  ///
-  /// Clients should not depend on the content of the returned value as it will
-  /// be changed if doing so would improve the UX.
-  String getDisplayString({
-    required bool withNullability,
-    bool multiline = false,
-  });
-
-  /// Returns a display name for the given element that includes the path to the
-  /// compilation unit in which the type is defined. If [shortName] is `null`
-  /// then [displayName] will be used as the name of this element. Otherwise
-  /// the provided name will be used.
-  // TODO(brianwilkerson) Make the parameter optional.
-  String getExtendedDisplayName(String? shortName);
-
-  /// Whether the element, assuming that it is within scope, is accessible to
-  /// code in the given [library].
-  ///
-  /// 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 isAccessibleIn(LibraryElement library);
-
-  /// Returns either this element or the most immediate ancestor of this element
-  /// for which the [predicate] returns `true`, or `null` if there is no such
-  /// element.
-  E? thisOrAncestorMatching<E extends Element>(
-    bool Function(Element) predicate,
-  );
-
-  /// Returns either this element or the most immediate ancestor of this element
-  /// that has the given type, or `null` if there is no such element.
-  E? thisOrAncestorOfType<E extends Element>();
-
-  /// 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 visitChildren(ElementVisitor visitor);
-}
-
-/// A single annotation associated with an element.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class ElementAnnotation implements ConstantEvaluationTarget {
-  /// The errors that were produced while computing a value for this
-  /// annotation, or `null` if no value has been computed.
-  ///
-  /// If a value has been produced but no errors were generated, then the
-  /// list will be empty.
-  List<AnalysisError>? get constantEvaluationErrors;
-
-  /// Returns the element referenced by this annotation.
-  ///
-  /// In valid code this element can be a [PropertyAccessorElement] getter
-  /// of a constant top-level variable, or a constant static field of a
-  /// class; or a constant [ConstructorElement].
-  ///
-  /// In invalid code this element can be `null`, or a reference to any
-  /// other element.
-  Element? get element;
-
-  /// Whether the annotation marks the associated function as always throwing.
-  bool get isAlwaysThrows;
-
-  /// Whether the annotation marks the associated element as being deprecated.
-  bool get isDeprecated;
-
-  /// Whether the annotation marks the associated element as not to be stored.
-  bool get isDoNotStore;
-
-  /// Whether the annotation marks the associated member as a factory.
-  bool get isFactory;
-
-  /// Whether the annotation marks the associated class and its subclasses as
-  /// being immutable.
-  bool get isImmutable;
-
-  /// Whether the annotation marks the associated element as being internal to
-  /// its package.
-  bool get isInternal;
-
-  /// Whether the annotation marks the associated member as running a single
-  /// test.
-  bool get isIsTest;
-
-  /// Whether the annotation marks the associated member as running a test
-  /// group.
-  bool get isIsTestGroup;
-
-  /// Whether the annotation marks the associated element with the `JS`
-  /// annotation.
-  bool get isJS;
-
-  /// Whether the annotation marks the associated constructor as being literal.
-  bool get isLiteral;
-
-  /// Whether the annotation marks the associated member as requiring
-  /// subclasses to override this member.
-  bool get isMustBeOverridden;
-
-  /// Whether the annotation marks the associated member as requiring
-  /// overriding methods to call super.
-  bool get isMustCallSuper;
-
-  /// Whether the annotation marks the associated member as being non-virtual.
-  bool get isNonVirtual;
-
-  /// Whether the annotation marks the associated type as having "optional"
-  /// type arguments.
-  bool get isOptionalTypeArgs;
-
-  /// Whether the annotation marks the associated method as being expected to
-  /// override an inherited method.
-  bool get isOverride;
-
-  /// Whether the annotation marks the associated member as being protected.
-  bool get isProtected;
-
-  /// Whether the annotation marks the associated class as implementing a proxy
-  /// object.
-  bool get isProxy;
-
-  /// Whether the marks the associated member as being reopened.
-  bool get isReopen;
-
-  /// Whether the annotation marks the associated member as being required.
-  bool get isRequired;
-
-  /// Whether the annotation marks the associated class as being sealed.
-  bool get isSealed;
-
-  /// Whether the annotation marks the associated class as being intended to
-  /// be used as an annotation.
-  bool get isTarget;
-
-  /// Whether the annotation marks the associated returned element as
-  /// requiring use.
-  bool get isUseResult;
-
-  /// Whether the annotation marks the associated member as being visible for
-  /// overriding only.
-  bool get isVisibleForOverriding;
-
-  /// Whether the annotation marks the associated member as being visible for
-  /// template files.
-  bool get isVisibleForTemplate;
-
-  /// Whether the annotation marks the associated member as being visible for
-  /// testing.
-  bool get isVisibleForTesting;
-
-  /// Whether the annotation marks the associated member as being visible
-  /// outside of template files.
-  bool get isVisibleOutsideTemplate;
-
-  /// Returns a representation of the value of this annotation, forcing the
-  /// value to be computed if it had not previously been computed, or `null`
-  /// if the value of this annotation could not be computed because of errors.
-  DartObject? computeConstantValue();
-
-  /// Returns a textual description of this annotation in a form approximating
-  /// valid source.
-  ///
-  /// The returned string will not be valid source primarily in the case where
-  /// the annotation itself is not well-formed.
-  String toSource();
-}
+export 'package:analyzer/src/dart/element/element.dart'
+    show
+        AugmentationImportElement,
+        AugmentedClassElement,
+        AugmentedEnumElement,
+        AugmentedExtensionElement,
+        AugmentedInlineClassElement,
+        AugmentedInstanceElement,
+        AugmentedInterfaceElement,
+        AugmentedMixinElement,
+        AugmentedNamedInstanceElement,
+        BindPatternVariableElement,
+        ClassElement,
+        ClassMemberElement,
+        CompilationUnitElement,
+        ConstructorElement,
+        DeferredImportElementPrefix,
+        DirectiveUri,
+        DirectiveUriWithAugmentation,
+        DirectiveUriWithLibrary,
+        DirectiveUriWithRelativeUri,
+        DirectiveUriWithRelativeUriString,
+        DirectiveUriWithSource,
+        DirectiveUriWithUnit,
+        Element,
+        ElementAnnotation,
+        EnumElement,
+        ExecutableElement,
+        ExtensionElement,
+        FieldElement,
+        FieldFormalParameterElement,
+        FunctionElement,
+        FunctionTypedElement,
+        GenericFunctionTypeElement,
+        HideElementCombinator,
+        ImportElementPrefix,
+        InlineClassElement,
+        InstanceElement,
+        InterfaceElement,
+        JoinPatternVariableElement,
+        LabelElement,
+        LibraryAugmentationElement,
+        LibraryElement,
+        LibraryExportElement,
+        LibraryImportElement,
+        LibraryOrAugmentationElement,
+        LocalElement,
+        LocalVariableElement,
+        MethodElement,
+        MixinElement,
+        MultiplyDefinedElement,
+        MultiplyInheritedExecutableElement,
+        NamedInstanceElement,
+        NamespaceCombinator,
+        ParameterElement,
+        PartElement,
+        PatternVariableElement,
+        PrefixElement,
+        PromotableElement,
+        PropertyAccessorElement,
+        PropertyInducingElement,
+        ShowElementCombinator,
+        SuperFormalParameterElement,
+        TopLevelVariableElement,
+        TypeAliasElement,
+        TypeDefiningElement,
+        TypeParameterElement,
+        TypeParameterizedElement,
+        UndefinedElement,
+        UriReferencedElement,
+        VariableElement;
 
 /// The kind of elements in the element model.
 ///
@@ -1158,752 +340,6 @@
   R? visitTypeParameterElement(TypeParameterElement element);
 }
 
-/// An element that represents an enum.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class EnumElement implements InterfaceElement {
-  @experimental
-  @override
-  EnumElement? get augmentation;
-
-  @experimental
-  @override
-  EnumElement? get augmentationTarget;
-
-  @experimental
-  @override
-  AugmentedEnumElement? get augmented;
-}
-
-/// 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 ExecutableElement implements FunctionTypedElement {
-  /// The immediate augmentation of this element, or `null` if there are no
-  /// augmentations.
-  ///
-  /// [ExecutableElement.augmentationTarget] will point back at this element.
-  @experimental
-  ExecutableElement? get augmentation;
-
-  /// The element that is augmented by this augmentation.
-  ///
-  /// The chain of augmentations normally ends with a [ExecutableElement] that
-  /// is not an augmentation, but might end with `null` immediately or after a
-  /// few intermediate [ExecutableElement]s in case of invalid code when an
-  /// augmentation is declared without the corresponding declaration.
-  @experimental
-  ExecutableElement? get augmentationTarget;
-
-  @override
-  ExecutableElement get declaration;
-
-  @override
-  String get displayName;
-
-  @Deprecated('Use enclosingElement2 instead')
-  @override
-  Element get enclosingElement;
-
-  @override
-  Element get enclosingElement2;
-
-  /// 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 has body marked as being asynchronous.
-  bool get isAsynchronous;
-
-  /// Whether the element is an augmentation.
-  ///
-  /// If `true`, declaration has the explicit `augment` modifier.
-  bool get isAugmentation;
-
-  /// 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 executable element has a body marked as being a generator.
-  bool get isGenerator;
-
-  /// Whether the executable element is an operator.
-  ///
-  /// The test may 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;
-
-  /// 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;
-
-  /// Whether the executable element has a body marked as being synchronous.
-  bool get isSynchronous;
-
-  @override
-  String get name;
-}
-
-/// An element that represents an extension.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class ExtensionElement implements InstanceElement {
-  @experimental
-  @override
-  ExtensionElement? get augmentation;
-
-  @experimental
-  @override
-  ExtensionElement? get augmentationTarget;
-
-  @experimental
-  @override
-  AugmentedExtensionElement? get augmented;
-
-  /// The type that is extended by this extension.
-  DartType get extendedType;
-
-  /// Returns the element representing the field with the given [name] that is
-  /// declared in this extension, or `null` if this extension does not declare a
-  /// field with the given name.
-  FieldElement? getField(String name);
-
-  /// Returns the element representing the getter with the given [name] that is
-  /// declared in this extension, or `null` if this extension does not declare a
-  /// getter with the given name.
-  PropertyAccessorElement? getGetter(String name);
-
-  /// Returns the element representing the method with the given [name] that is
-  /// declared in this extension, or `null` if this extension does not declare a
-  /// method with the given name.
-  MethodElement? getMethod(String name);
-
-  /// Returns the element representing the setter with the given [name] that is
-  /// declared in this extension, or `null` if this extension does not declare a
-  /// setter with the given name.
-  PropertyAccessorElement? getSetter(String name);
-}
-
-/// A field defined within a class.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class FieldElement
-    implements ClassMemberElement, PropertyInducingElement {
-  @override
-  FieldElement get declaration;
-
-  /// 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;
-
-  /// 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.
-  @override
-  bool get isStatic;
-}
-
-/// A field formal parameter defined within a constructor element.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class FieldFormalParameterElement implements ParameterElement {
-  /// The field element associated with this field formal parameter, or `null`
-  /// if the parameter references a field that doesn't exist.
-  FieldElement? get field;
-}
-
-/// A (non-method) function. This can be either a top-level function, 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 FunctionElement implements ExecutableElement, LocalElement {
-  /// 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 synthetic function defined for libraries that are
-  /// deferred.
-  static final String LOAD_LIBRARY_NAME = "loadLibrary";
-
-  /// The name of the function used as an entry point.
-  static const String MAIN_FUNCTION_NAME = "main";
-
-  /// 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";
-
-  @experimental
-  @override
-  FunctionElement? get augmentation;
-
-  @experimental
-  @override
-  FunctionElement? get augmentationTarget;
-
-  /// Whether the function represents `identical` from the `dart:core` library.
-  bool get isDartCoreIdentical;
-
-  /// Whether the function is an entry point, i.e. a top-level function and
-  /// has the name `main`.
-  bool get isEntryPoint;
-}
-
-/// 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 FunctionTypedElement implements TypeParameterizedElement {
-  /// The parameters defined by this executable element.
-  List<ParameterElement> get parameters;
-
-  /// The return type defined by this element.
-  @Deprecated('Use returnType2 instead')
-  DartType get returnType;
-
-  /// The return type defined by this element.
-  DartType get returnType2;
-
-  /// The type defined by this element.
-  FunctionType get type;
-}
-
-/// The pseudo-declaration that defines a generic function type.
-///
-/// Clients may not extend, implement, or mix-in this class.
-abstract class GenericFunctionTypeElement implements FunctionTypedElement {}
-
-/// A combinator that causes some of the names in a namespace to be hidden when
-/// being imported.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class HideElementCombinator implements NamespaceCombinator {
-  /// The names that are not to be made visible in the importing library even
-  /// if they are defined in the imported library.
-  List<String> get hiddenNames;
-}
-
-/// Usage of a [PrefixElement] in an `import` directive.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class ImportElementPrefix {
-  /// The prefix that was specified as part of the import directive, or `null`
-  /// if there was no prefix specified.
-  PrefixElement get element;
-}
-
-/// An element that represents an inline class.
-///
-/// Clients may not extend, implement or mix-in this class.
-@experimental
-abstract class InlineClassElement implements NamedInstanceElement {
-  @experimental
-  @override
-  InlineClassElement? get augmentation;
-
-  @experimental
-  @override
-  InlineClassElement? get augmentationTarget;
-
-  @experimental
-  @override
-  AugmentedInlineClassElement? get augmented;
-
-  /// The direct [InlineClassType]s that are implemented by this inline class.
-  List<InlineClassType> get implemented;
-}
-
-/// An element that has `this`.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class InstanceElement
-    implements TypeDefiningElement, TypeParameterizedElement {
-  /// The declared accessors (getters and setters).
-  List<PropertyAccessorElement> get accessors;
-
-  /// The immediate augmentation of this element, or `null` if there are no
-  /// augmentations.
-  ///
-  /// [InstanceElement.augmentationTarget] will point back at this element.
-  @experimental
-  InstanceElement? get augmentation;
-
-  /// The element that is augmented by this augmentation; or `null` if
-  /// [isAugmentation] is `false`, or there is no corresponding element to be
-  /// augmented.
-  ///
-  /// The chain of augmentations should normally end with a not augmentation
-  /// [InstanceElement], but might end with `null` immediately or after a few
-  /// intermediate elements in case of invalid code when an augmentation is
-  /// declared without the corresponding declaration.
-  @experimental
-  InstanceElement? get augmentationTarget;
-
-  /// The result of applying augmentations.
-  @experimental
-  AugmentedInstanceElement? get augmented;
-
-  @Deprecated('Use enclosingElement2 instead')
-  @override
-  CompilationUnitElement get enclosingElement;
-
-  @override
-  CompilationUnitElement get enclosingElement2;
-
-  /// The declared fields.
-  List<FieldElement> get fields;
-
-  /// Whether the element is an augmentation.
-  ///
-  /// If `true`, declaration has the explicit `augment` modifier.
-  bool get isAugmentation;
-
-  /// The declared methods.
-  List<MethodElement> get methods;
-
-  /// The type of `this` expression.
-  ///
-  /// For a class like `class MyClass<T, U> {}` the returned type is equivalent
-  /// to the type `MyClass<T, U>`. So, the type arguments are the types of the
-  /// type parameters, and either `none` or `star` is used for the nullability
-  /// suffix is used, depending on the nullability status of the declaring
-  /// library.
-  DartType get thisType;
-}
-
-/// An element that defines an [InterfaceType].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class InterfaceElement implements NamedInstanceElement {
-  /// All the supertypes defined for this element and its supertypes.
-  ///
-  /// This includes superclasses, mixins, interfaces, and superclass constraints.
-  List<InterfaceType> get allSupertypes;
-
-  @override
-  InterfaceElement? get augmentationTarget;
-
-  @experimental
-  @override
-  AugmentedInterfaceElement? get augmented;
-
-  /// 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.
-  ///
-  /// [ClassElement] and [EnumElement] can have mixins.
-  ///
-  /// [MixinElement] cannot have mixins, so the 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 [ClassElement] 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 [EnumElement] returns `Enum` from `dart:core`.
-  ///
-  /// For [MixinElement] 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 field (synthetic or explicit) defined directly in this class or
-  /// augmentation that has the given [name].
-  /// TODO(scheglov) Deprecate and remove it.
-  FieldElement? getField(String name);
-
-  /// The getter (synthetic or explicit) defined directly in this class or
-  /// augmentation that has the given [name].
-  /// TODO(scheglov) Deprecate and remove it.
-  PropertyAccessorElement? getGetter(String name);
-
-  /// The method defined directly in this class or augmentation that has the
-  /// given [name].
-  /// TODO(scheglov) Deprecate and remove it.
-  MethodElement? getMethod(String name);
-
-  /// The setter (synthetic or explicit) defined directly in this class or
-  /// augmentation that has the given [name].
-  /// TODO(scheglov) Deprecate and remove it.
-  PropertyAccessorElement? getSetter(String name);
-
-  @override
-  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.
-  MethodElement? lookUpConcreteMethod(
-      String methodName, LibraryElement library);
-
-  /// Returns the element representing the getter that results from looking up
-  /// the given [getterName] 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 16.15.2:
-  /// <blockquote>
-  /// The result of looking up getter (respectively setter) <i>m</i> in class
-  /// <i>C</i> with respect to library <i>L</i> is: If <i>C</i> declares an
-  /// instance getter (respectively setter) named <i>m</i> that is accessible to
-  /// <i>L</i>, then that getter (respectively setter) 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 getter (respectively setter)
-  /// <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.
-  PropertyAccessorElement? lookUpGetter(
-      String getterName, LibraryElement library);
-
-  /// Returns the element representing the getter that results from looking up
-  /// the given [getterName] in the superclass of this class with respect to the
-  /// given [library], ignoring abstract getters, or `null` if the look up
-  /// fails.
-  ///
-  /// The behavior of this method is defined by the Dart Language Specification
-  /// in section 16.15.2:
-  /// <blockquote>
-  /// The result of looking up getter (respectively setter) <i>m</i> in class
-  /// <i>C</i> with respect to library <i>L</i> is: If <i>C</i> declares an
-  /// instance getter (respectively setter) named <i>m</i> that is accessible to
-  /// <i>L</i>, then that getter (respectively setter) 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 getter (respectively setter)
-  /// <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.
-  PropertyAccessorElement? lookUpInheritedConcreteGetter(
-      String getterName, LibraryElement 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], 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.
-  MethodElement? lookUpInheritedConcreteMethod(
-      String methodName, LibraryElement library);
-
-  /// Returns the element representing the setter that results from looking up
-  /// the given [setterName] in the superclass of this class with respect to the
-  /// given [library], ignoring abstract setters, or `null` if the look up
-  /// fails.
-  ///
-  /// The behavior of this method is defined by the Dart Language Specification
-  /// in section 16.15.2:
-  /// <blockquote>
-  /// The result of looking up getter (respectively setter) <i>m</i> in class
-  /// <i>C</i> with respect to library <i>L</i> is:  If <i>C</i> declares an
-  /// instance getter (respectively setter) named <i>m</i> that is accessible to
-  /// <i>L</i>, then that getter (respectively setter) 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 getter (respectively setter)
-  /// <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.
-  PropertyAccessorElement? lookUpInheritedConcreteSetter(
-      String setterName, LibraryElement 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.
-  MethodElement? lookUpInheritedMethod(
-      String methodName, LibraryElement library);
-
-  /// Returns the element representing the method that results from looking up
-  /// the given [methodName] 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 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.
-  MethodElement? lookUpMethod(String methodName, LibraryElement library);
-
-  /// Returns the element representing the setter that results from looking up
-  /// the given [setterName] 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 16.15.2:
-  /// <blockquote>
-  /// The result of looking up getter (respectively setter) <i>m</i> in class
-  /// <i>C</i> with respect to library <i>L</i> is: If <i>C</i> declares an
-  /// instance getter (respectively setter) named <i>m</i> that is accessible to
-  /// <i>L</i>, then that getter (respectively setter) 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 getter (respectively setter)
-  /// <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.
-  PropertyAccessorElement? lookUpSetter(
-      String setterName, LibraryElement library);
-}
-
-/// 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 JoinPatternVariableElement implements PatternVariableElement {
-  /// Whether the [variables] are consistent, present in all branches,
-  /// and have the same type and finality.
-  bool get isConsistent;
-
-  /// The variables that join into this variable.
-  List<PatternVariableElement> get variables;
-}
-
-/// A label associated with a statement.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class LabelElement implements Element {
-  @Deprecated('Use enclosingElement2 instead')
-  @override
-  ExecutableElement get enclosingElement;
-
-  @override
-  ExecutableElement get enclosingElement2;
-
-  @override
-  String get name;
-}
-
-/// A library augmentation.
-///
-/// Clients may not extend, implement or mix-in this class.
-@experimental
-abstract class LibraryAugmentationElement
-    implements LibraryOrAugmentationElement, _ExistingElement {
-  /// The library that is augmented by this augmentation.
-  LibraryOrAugmentationElement get augmentationTarget;
-}
-
-/// A library.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class LibraryElement
-    implements LibraryOrAugmentationElement, _ExistingElement {
-  /// The entry point for this library, or `null` if this library does
-  /// not have an entry point.
-  ///
-  /// The entry point is defined to be a zero argument top-level function
-  /// whose name is `main`.
-  FunctionElement? get entryPoint;
-
-  /// The libraries that are exported from this library.
-  List<LibraryElement> get exportedLibraries;
-
-  /// The export [Namespace] of this library.
-  Namespace get exportNamespace;
-
-  /// The identifier that uniquely identifies this element among the children
-  /// of this element's parent.
-  String get identifier;
-
-  /// The libraries that are imported into this library.
-  ///
-  /// This includes all of the libraries that are imported using a prefix, and
-  /// those that are imported without a prefix.
-  List<LibraryElement> get importedLibraries;
-
-  /// Whether the library is an application that can be run in the browser.
-  bool get isBrowserApplication;
-
-  /// 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 element representing the synthetic function `loadLibrary` that is
-  /// implicitly defined for this library if the library is imported using a
-  /// deferred import.
-  FunctionElement get loadLibraryFunction;
-
-  /// The name of this library, possibly the empty string if this library does
-  /// not have an explicit name.
-  @override
-  String get name;
-
-  /// The list of `part` directives of this library.
-  List<PartElement> get parts;
-
-  /// The public [Namespace] of this library.
-  Namespace get publicNamespace;
-
-  /// The top-level elements defined in each of the compilation units that are
-  /// included in this library. This includes both public and private elements,
-  /// but does not include imports, exports, or synthetic elements.
-  Iterable<Element> get topLevelElements;
-
-  /// The compilation units this library consists of.
-  ///
-  /// This includes the defining compilation unit and units included using the
-  /// `part` directive.
-  List<CompilationUnitElement> get units;
-
-  /// The class defined in this library that has the given [name], or
-  /// `null` if this library does not define a class with the given name.
-  ClassElement? getClass(String name);
-
-  /// If a legacy library, returns the legacy view on the [element].
-  ///
-  /// Otherwise, return the original element.
-  T toLegacyElementIfOptOut<T extends Element>(T element);
-
-  /// If a legacy library, return the legacy version of the [type].
-  /// Otherwise, return the original type.
-  DartType toLegacyTypeIfOptOut(DartType type);
-}
-
-/// A single export directive within a library.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class LibraryExportElement implements _ExistingElement {
-  /// The combinators that were specified as part of the `export` directive in
-  /// the order in which they were specified.
-  List<NamespaceCombinator> get combinators;
-
-  /// The [LibraryElement], if [uri] is a [DirectiveUriWithLibrary].
-  LibraryElement? get exportedLibrary;
-
-  /// The offset of the `export` keyword.
-  int get exportKeywordOffset;
-
-  /// The interpretation of the URI specified in the directive.
-  DirectiveUri get uri;
-}
-
-/// A single import directive within a library.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class LibraryImportElement implements _ExistingElement {
-  /// The combinators that were specified as part of the `import` directive in
-  /// the order in which they were specified.
-  List<NamespaceCombinator> get combinators;
-
-  /// The [LibraryElement], if [uri] is a [DirectiveUriWithLibrary].
-  LibraryElement? get importedLibrary;
-
-  /// The offset of the `import` keyword.
-  int get importKeywordOffset;
-
-  /// The [Namespace] that this directive contributes to the containing library.
-  Namespace get namespace;
-
-  /// The prefix that was specified as part of the import directive, or `null`
-  /// if there was no prefix specified.
-  ImportElementPrefix? get prefix;
-
-  /// The interpretation of the URI specified in the directive.
-  DirectiveUri get uri;
-}
-
 class LibraryLanguageVersion {
   /// The version for the whole package that contains this library.
   final Version package;
@@ -1921,680 +357,3 @@
     return override ?? package;
   }
 }
-
-/// Shared interface between [LibraryElement] and [LibraryAugmentationElement].
-///
-/// Clients may not extend, implement or mix-in this class.
-@experimental
-abstract class LibraryOrAugmentationElement implements Element {
-  /// The extension elements accessible within this library.
-  List<ExtensionElement> get accessibleExtensions;
-
-  /// The augmentation imports specified in this library.
-  @experimental
-  List<AugmentationImportElement> get augmentationImports;
-
-  /// The compilation unit that defines this library.
-  CompilationUnitElement get definingCompilationUnit;
-
-  /// 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 file.
-  FeatureSet get featureSet;
-
-  bool get isNonNullableByDefault;
-
-  /// The language version for this library.
-  LibraryLanguageVersion get languageVersion;
-
-  @override
-  LibraryElement get library;
-
-  /// The exports defined in this library.
-  List<LibraryExportElement> get libraryExports;
-
-  /// The imports defined in this library.
-  List<LibraryImportElement> get libraryImports;
-
-  /// The prefixes used to `import` libraries into this library.
-  ///
-  /// Each prefix can be used in more than one `import` directive.
-  List<PrefixElement> get prefixes;
-
-  /// The name lookup scope for this library.
-  ///
-  /// It consists of elements that are either declared in the library, or
-  /// imported into it.
-  Scope get scope;
-
-  @override
-  AnalysisSession get session;
-
-  /// The [TypeProvider] that is used in this library.
-  TypeProvider get typeProvider;
-
-  /// The [TypeSystem] that is used in this library.
-  TypeSystem get typeSystem;
-}
-
-/// An element that can be (but is not required to be) defined within a method
-/// or function (an [ExecutableElement]).
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class LocalElement implements Element {}
-
-/// A local variable.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class LocalVariableElement implements PromotableElement {
-  /// Whether the variable has an initializer at declaration.
-  bool get hasInitializer;
-
-  @override
-  String get name;
-}
-
-/// An element that represents a method defined within a class.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class MethodElement implements ClassMemberElement, ExecutableElement {
-  @experimental
-  @override
-  MethodElement? get augmentation;
-
-  @experimental
-  @override
-  MethodElement? get augmentationTarget;
-
-  @override
-  MethodElement get declaration;
-}
-
-/// An element that represents a mixin.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class MixinElement implements InterfaceElement {
-  @experimental
-  @override
-  MixinElement? get augmentation;
-
-  @experimental
-  @override
-  MixinElement? get augmentationTarget;
-
-  @experimental
-  @override
-  AugmentedMixinElement? get augmented;
-
-  /// 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 isImplementableIn(LibraryElement library);
-}
-
-/// 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 MultiplyDefinedElement implements Element {
-  /// The elements that were defined within the scope to have the same name.
-  List<Element> get conflictingElements;
-}
-
-/// An [ExecutableElement], with the additional information of a list of
-/// [ExecutableElement]s from which this element was composed.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class MultiplyInheritedExecutableElement implements ExecutableElement {
-  /// The executable elements defined within this executable element.
-  List<ExecutableElement> get inheritedElements;
-}
-
-/// An element that represents a named [InstanceElement].
-///
-/// Clients may not extend, implement or mix-in this class.
-@experimental
-abstract class NamedInstanceElement implements InstanceElement {
-  @override
-  NamedInstanceElement? get augmentationTarget;
-
-  @experimental
-  @override
-  AugmentedNamedInstanceElement? get augmented;
-
-  /// The declared constructors.
-  ///
-  /// The list is empty for [MixinElement].
-  List<ConstructorElement> get constructors;
-
-  @override
-  String get name;
-
-  /// The unnamed constructor declared directly in this class.
-  ///
-  /// If the class does not declare any constructors, a synthetic default
-  /// constructor will be returned.
-  /// TODO(scheglov) Deprecate and remove it.
-  ConstructorElement? get unnamedConstructor;
-
-  /// The constructor defined directly in this class or augmentation
-  /// that has the given [name].
-  /// TODO(scheglov) Deprecate and remove it.
-  ConstructorElement? getNamedConstructor(String name);
-
-  /// Create the [DartType] for this element with the given [typeArguments]
-  /// and [nullabilitySuffix].
-  DartType instantiate({
-    required List<DartType> typeArguments,
-    required NullabilitySuffix nullabilitySuffix,
-  });
-}
-
-/// An object that controls how namespaces are combined.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class NamespaceCombinator {}
-
-/// A parameter defined within an executable element.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class ParameterElement
-    implements PromotableElement, ConstantEvaluationTarget {
-  @override
-  ParameterElement get declaration;
-
-  /// The code of the default value, or `null` if no default value.
-  String? get defaultValueCode;
-
-  /// 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;
-
-  @override
-  String get name;
-
-  /// The kind of this parameter.
-  @Deprecated('Use the getters isOptionalNamed, isOptionalPositional, '
-      'isRequiredNamed, and isRequiredPositional')
-  ParameterKind get parameterKind;
-
-  /// The parameters defined by this parameter.
-  ///
-  /// A parameter will only define other parameters if it is a function typed
-  /// parameter.
-  List<ParameterElement> get parameters;
-
-  /// The type parameters defined by this parameter.
-  ///
-  /// A parameter will only define type parameters if it is a function typed
-  /// parameter.
-  List<TypeParameterElement> get typeParameters;
-
-  /// Appends the type, name and possibly the default value of this parameter
-  /// to the given [buffer].
-  void appendToWithoutDelimiters(
-    StringBuffer buffer, {
-    bool withNullability = false,
-  });
-}
-
-/// A 'part' directive within a library.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class PartElement implements _ExistingElement {
-  /// The interpretation of the URI specified in the directive.
-  DirectiveUri get uri;
-}
-
-/// A pattern variable.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class PatternVariableElement implements LocalVariableElement {
-  /// The variable in which this variable joins with other pattern variables
-  /// with the same name, in a logical-or pattern, or shared case scope.
-  JoinPatternVariableElement? get join;
-}
-
-/// A prefix used to import one or more libraries into another library.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class PrefixElement implements _ExistingElement {
-  /// The library, or library augmentation that encloses this element.
-  @Deprecated('Use enclosingElement2 instead')
-  @override
-  LibraryOrAugmentationElement get enclosingElement;
-
-  /// The library, or library augmentation that encloses this element.
-  @override
-  LibraryOrAugmentationElement get enclosingElement2;
-
-  /// The imports that share this prefix.
-  List<LibraryImportElement> get imports;
-
-  @override
-  String get name;
-
-  /// 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;
-}
-
-/// 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 PromotableElement implements LocalElement, VariableElement {
-  // Promotable elements are guaranteed to have a name.
-  @override
-  String get name;
-}
-
-/// A getter or a setter. Note that explicitly defined property accessors
-/// implicitly define a synthetic field. Symmetrically, synthetic accessors are
-/// implicitly created for explicitly defined fields. The following rules apply:
-///
-/// * Every explicit field is represented by a non-synthetic [FieldElement].
-/// * Every explicit field induces a getter and possibly a setter, both of which
-///   are represented by synthetic [PropertyAccessorElement]s.
-/// * Every explicit getter or setter is represented by a non-synthetic
-///   [PropertyAccessorElement].
-/// * Every explicit getter or setter (or pair thereof if they have the same
-///   name) induces a field that is represented by a synthetic [FieldElement].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class PropertyAccessorElement implements ExecutableElement {
-  @experimental
-  @override
-  PropertyAccessorElement? get augmentation;
-
-  @experimental
-  @override
-  PropertyAccessorElement? get augmentationTarget;
-
-  /// The accessor representing the getter that corresponds to (has the same
-  /// name as) this setter, or `null` if this accessor is not a setter or
-  /// if there is no corresponding getter.
-  PropertyAccessorElement? get correspondingGetter;
-
-  /// The accessor representing the setter that corresponds to (has the same
-  /// name as) this getter, or `null` if this accessor is not a getter or
-  /// if there is no corresponding setter.
-  PropertyAccessorElement? get correspondingSetter;
-
-  @override
-  PropertyAccessorElement get declaration;
-
-  @Deprecated('Use enclosingElement2 instead')
-  @override
-  Element get enclosingElement;
-
-  @override
-  Element get enclosingElement2;
-
-  /// Whether the accessor represents a getter.
-  bool get isGetter;
-
-  /// Whether the accessor represents a setter.
-  bool get isSetter;
-
-  /// The field or top-level variable associated with this accessor.
-  ///
-  /// If this accessor was explicitly defined (is not synthetic) then the
-  /// variable associated with it will be synthetic.
-  PropertyInducingElement get variable;
-}
-
-/// 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
-///   [PropertyInducingElement].
-/// * Every explicit variable induces a getter and possibly a setter, both of
-///   which are represented by synthetic [PropertyAccessorElement]s.
-/// * Every explicit getter or setter is represented by a non-synthetic
-///   [PropertyAccessorElement].
-/// * Every explicit getter or setter (or pair thereof if they have the same
-///   name) induces a variable that is represented by a synthetic
-///   [PropertyInducingElement].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class PropertyInducingElement implements VariableElement {
-  @override
-  String get displayName;
-
-  /// The getter associated with this variable.
-  ///
-  /// If this variable was explicitly defined (is not synthetic) then the
-  /// getter associated with it will be synthetic.
-  PropertyAccessorElement? get getter;
-
-  /// Whether the variable has an initializer at declaration.
-  bool get hasInitializer;
-
-  @override
-  LibraryElement get library;
-
-  @override
-  String get name;
-
-  /// The setter associated with this variable, or `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.
-  PropertyAccessorElement? get setter;
-}
-
-/// A combinator that cause some of the names in a namespace to be visible (and
-/// the rest hidden) when being imported.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class ShowElementCombinator implements NamespaceCombinator {
-  /// The offset of the character immediately following the last character of
-  /// this node.
-  int get end;
-
-  /// The offset of the 'show' keyword of this element.
-  int get offset;
-
-  /// The names that are to be made visible in the importing library if they
-  /// are defined in the imported library.
-  List<String> get shownNames;
-}
-
-/// A super formal parameter defined within a constructor element.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class SuperFormalParameterElement implements ParameterElement {
-  /// 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.
-  ParameterElement? get superConstructorParameter;
-}
-
-/// A top-level variable.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class TopLevelVariableElement implements PropertyInducingElement {
-  @override
-  TopLevelVariableElement get declaration;
-
-  /// Whether the field was explicitly marked as being external.
-  bool get isExternal;
-}
-
-/// A type alias (`typedef`).
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class TypeAliasElement
-    implements TypeParameterizedElement, TypeDefiningElement {
-  /// If the aliased type has structure, return the corresponding element.
-  /// For example it could be [GenericFunctionTypeElement].
-  ///
-  /// If there is no structure, return `null`.
-  Element? get aliasedElement;
-
-  /// 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;
-
-  @Deprecated('Use enclosingElement2 instead')
-  @override
-  CompilationUnitElement get enclosingElement;
-
-  @override
-  CompilationUnitElement get enclosingElement2;
-
-  @override
-  String get name;
-
-  /// Produces the type resulting from instantiating this typedef with the given
-  /// [typeArguments] and [nullabilitySuffix].
-  ///
-  /// Note that this always instantiates the typedef itself, so for a
-  /// [TypeAliasElement] 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,
-  });
-}
-
-/// An element that defines a type.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class TypeDefiningElement implements Element {}
-
-/// A type parameter.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class TypeParameterElement implements TypeDefiningElement {
-  /// The type representing the bound associated with this parameter, or `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
-  TypeParameterElement get declaration;
-
-  @override
-  String get displayName;
-
-  @override
-  String get name;
-
-  /// Creates the [TypeParameterType] with the given [nullabilitySuffix] for
-  /// this type parameter.
-  TypeParameterType instantiate({
-    required NullabilitySuffix nullabilitySuffix,
-  });
-}
-
-/// An element that has type parameters, such as a class or a typedef. This also
-/// includes functions and methods if support for generic methods is enabled.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class TypeParameterizedElement implements _ExistingElement {
-  /// If the element defines a type, indicates whether the type may safely
-  /// appear without explicit type parameters as the bounds of a type parameter
-  /// declaration.
-  ///
-  /// If the element does not define a type, returns `true`.
-  bool get isSimplyBounded;
-
-  /// The type parameters declared by this element directly.
-  ///
-  /// This does not include type parameters that are declared by any enclosing
-  /// elements.
-  List<TypeParameterElement> get typeParameters;
-}
-
-/// A pseudo-elements that represents names that are undefined. 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 UndefinedElement implements Element {}
-
-/// An element included into a library using some URI.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class UriReferencedElement implements _ExistingElement {
-  /// The URI that is used to include this element into the enclosing library,
-  /// or `null` if this is the defining compilation unit of a library.
-  String? get uri;
-
-  /// The offset of the character immediately following the last character of
-  /// this node's URI, or `-1` for synthetic import.
-  int get uriEnd;
-
-  /// The offset of the URI in the file, or `-1` if this element is synthetic.
-  int get uriOffset;
-}
-
-/// 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 VariableElement implements Element, ConstantEvaluationTarget {
-  @override
-  VariableElement get declaration;
-
-  /// 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.
-  ///
-  /// This will always return `false` unless the experiment 'non-nullable' is
-  /// enabled.
-  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;
-
-  @override
-  String get name;
-
-  /// The declared type of this variable.
-  DartType get type;
-
-  /// Returns a representation of the value of this variable, forcing the value
-  /// to be computed if it had not previously been computed, or `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();
-}
-
-/// This class exists to provide non-nullable overrides for existing elements,
-/// as opposite to artificial "multiply defined" element.
-abstract class _ExistingElement implements Element {
-  @override
-  Element get declaration;
-
-  @override
-  LibraryElement get library;
-
-  @override
-  Source get librarySource;
-
-  @override
-  Source get source;
-}
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 313b3a5..062408f 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/context/source.dart';
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index e6736b9..b1537b1 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
@@ -8,8 +8,6 @@
 import 'package:_fe_analyzer_shared/src/macros/executor/multi_executor.dart'
     as macro;
 import 'package:analyzer/dart/analysis/declared_variables.dart';
-import 'package:analyzer/dart/element/element.dart'
-    show CompilationUnitElement, LibraryElement;
 import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index 74e5ca2..7640cda 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -13,7 +13,6 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/constant/value.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index cac3b04..77ecc40 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
diff --git a/pkg/analyzer/lib/src/dart/constant/utilities.dart b/pkg/analyzer/lib/src/dart/constant/utilities.dart
index 10ce599..8f7f2de 100644
--- a/pkg/analyzer/lib/src/dart/constant/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/constant/utilities.dart
@@ -6,7 +6,6 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/constant/evaluation.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 
diff --git a/pkg/analyzer/lib/src/dart/constant/value.dart b/pkg/analyzer/lib/src/dart/constant/value.dart
index b767d76..49ff3df 100644
--- a/pkg/analyzer/lib/src/dart/constant/value.dart
+++ b/pkg/analyzer/lib/src/dart/constant/value.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/constant/value.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/diagnostic/diagnostic.dart';
diff --git a/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart b/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart
index 9032702..a17c6f8 100644
--- a/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart
+++ b/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/extensions.dart';
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 81026a5..2a7d101 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -49,13 +49,38 @@
 import 'package:analyzer/src/summary2/macro.dart';
 import 'package:analyzer/src/summary2/macro_application_error.dart';
 import 'package:analyzer/src/summary2/reference.dart';
+import 'package:analyzer/src/task/api/model.dart' show AnalysisTarget;
 import 'package:analyzer/src/task/inference_error.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer/src/utilities/extensions/collection.dart';
 import 'package:analyzer/src/utilities/extensions/string.dart';
 import 'package:collection/collection.dart';
+import 'package:meta/meta.dart';
 import 'package:pub_semver/pub_semver.dart';
 
+/// A library augmentation import directive within a library.
+///
+/// Clients may not extend, implement or mix-in this class.
+@experimental
+abstract class AugmentationImportElement implements _ExistingElement {
+  @Deprecated('Use enclosingElement2 instead')
+  @override
+  LibraryOrAugmentationElement get enclosingElement;
+
+  @override
+  LibraryOrAugmentationElement get enclosingElement2;
+
+  /// The [LibraryAugmentationElement], if [uri] is a
+  /// [DirectiveUriWithAugmentation].
+  LibraryAugmentationElement? get importedAugmentation;
+
+  /// The offset of the `import` keyword.
+  int get importKeywordOffset;
+
+  /// The interpretation of the URI specified in the directive.
+  DirectiveUri get uri;
+}
+
 class AugmentationImportElementImpl extends _ExistingElementImpl
     implements AugmentationImportElement {
   @override
@@ -97,6 +122,14 @@
       visitor.visitAugmentationImportElement(this);
 }
 
+/// The result of applying augmentations to a [ClassElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class AugmentedClassElement implements AugmentedInterfaceElement {
+  @override
+  ClassElement get declaration;
+}
+
 class AugmentedClassElementImpl extends AugmentedInterfaceElementImpl
     implements AugmentedClassElement {
   @override
@@ -105,15 +138,75 @@
   AugmentedClassElementImpl(this.declaration);
 }
 
+/// The result of applying augmentations to an [EnumElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class AugmentedEnumElement implements AugmentedInterfaceElement {}
+
 class AugmentedEnumElementImpl extends AugmentedInterfaceElementImpl
     implements AugmentedEnumElement {}
 
+/// The result of applying augmentations to an [ExtensionElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class AugmentedExtensionElement implements AugmentedInstanceElement {}
+
 class AugmentedExtensionElementImpl extends AugmentedInstanceElementImpl
     implements AugmentedExtensionElement {}
 
+/// The result of applying augmentations to an [InlineClassElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class AugmentedInlineClassElement
+    implements AugmentedNamedInstanceElement {}
+
 class AugmentedInlineClassElementImpl extends AugmentedNamedInstanceElementImpl
     implements AugmentedInlineClassElement {}
 
+/// The result of applying augmentations to a [InstanceElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class AugmentedInstanceElement {
+  /// The accessors (getters and setters) declared in this element.
+  ///
+  /// [PropertyAccessorElement]s replace corresponding elements,
+  /// other [PropertyAccessorElement]s are appended.
+  List<PropertyAccessorElement> get accessors;
+
+  /// The declaration (not augmentation) that owns this result.
+  InstanceElement get declaration;
+
+  /// The fields declared in this element.
+  ///
+  /// [FieldAugmentationElement]s replace corresponding elements, other
+  /// [FieldElement]s are appended.
+  List<FieldElement> get fields;
+
+  /// The metadata associated with this element.
+  ///
+  /// This is a union of annotations associated with the class declaration and
+  /// all its augmentations.
+  List<ElementAnnotation> get metadata;
+
+  /// The methods declared in this element.
+  ///
+  /// [MethodAugmentationElement]s replace corresponding elements, other
+  /// [MethodElement]s are appended.
+  List<MethodElement> get methods;
+
+  /// Returns the field from [fields] that has the given [name].
+  FieldElement? getField(String name);
+
+  /// Returns the getter from [accessors] that has the given [name].
+  PropertyAccessorElement? getGetter(String name);
+
+  /// Returns the method from [methods] that has the given [name].
+  MethodElement? getMethod(String name);
+
+  /// Returns the setter from [accessors] that has the given [name].
+  PropertyAccessorElement? getSetter(String name);
+}
+
 abstract class AugmentedInstanceElementImpl
     implements AugmentedInstanceElement {
   @override
@@ -188,6 +281,27 @@
   }
 }
 
+/// The result of applying augmentations to a [InterfaceElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class AugmentedInterfaceElement
+    implements AugmentedNamedInstanceElement {
+  @override
+  InterfaceElement get declaration;
+
+  /// The interfaces implemented by this element.
+  ///
+  /// This is a union of interfaces declared by the class declaration and
+  /// all its augmentations.
+  List<InterfaceType> get interfaces;
+
+  /// The mixins applied by this class or in its augmentations.
+  ///
+  /// This is a union of mixins applied by the class declaration and all its
+  /// augmentations.
+  List<InterfaceType> get mixins;
+}
+
 abstract class AugmentedInterfaceElementImpl
     extends AugmentedNamedInstanceElementImpl
     implements AugmentedInterfaceElement {
@@ -202,6 +316,17 @@
   InterfaceElement get declaration => throw UnimplementedError();
 }
 
+/// The result of applying augmentations to a [MixinElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class AugmentedMixinElement extends AugmentedInterfaceElement {
+  /// The superclass constraints of this element.
+  ///
+  /// This is a union of constraints declared by the class declaration and
+  /// all its augmentations.
+  List<InterfaceType> get superclassConstraints;
+}
+
 class AugmentedMixinElementImpl extends AugmentedInterfaceElementImpl
     implements AugmentedMixinElement {
   @override
@@ -213,6 +338,27 @@
   AugmentedMixinElementImpl(this.declaration);
 }
 
+/// The result of applying augmentations to a [NamedInstanceElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class AugmentedNamedInstanceElement
+    implements AugmentedInstanceElement {
+  /// The constructors declared in this element.
+  ///
+  /// [ConstructorAugmentationElement]s replace corresponding elements,
+  /// other [ConstructorElement]s are appended.
+  List<ConstructorElement> get constructors;
+
+  @override
+  NamedInstanceElement get declaration;
+
+  /// The unnamed constructor from [constructors].
+  ConstructorElement? get unnamedConstructor;
+
+  /// Returns the constructor from [constructors] that has the given [name].
+  ConstructorElement? getNamedConstructor(String name);
+}
+
 abstract class AugmentedNamedInstanceElementImpl
     extends AugmentedInstanceElementImpl
     implements AugmentedNamedInstanceElement {
@@ -235,6 +381,11 @@
   }
 }
 
+/// A pattern variable that is explicitly declared.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class BindPatternVariableElement implements PatternVariableElement {}
+
 class BindPatternVariableElementImpl extends PatternVariableElementImpl
     implements BindPatternVariableElement {
   final DeclaredVariablePatternImpl node;
@@ -246,6 +397,118 @@
   BindPatternVariableElementImpl(this.node, super.name, super.offset);
 }
 
+/// An element that represents a class or a mixin. The class can be defined by
+/// either a class declaration (with a class body), a mixin application (without
+/// a class body), a mixin declaration, or an enum declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ClassElement implements InterfaceElement {
+  @experimental
+  @override
+  ClassElement? get augmentation;
+
+  @experimental
+  @override
+  ClassElement? get augmentationTarget;
+
+  @experimental
+  @override
+  AugmentedClassElement? get augmented;
+
+  /// 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 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 inline class.
+  ///
+  /// A class is an inline class if it has an explicit `inline` modifier.
+  @experimental
+  bool get isInline;
+
+  /// 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, is extendable to
+  /// classes in the given [library].
+  bool isExtendableIn(LibraryElement library);
+
+  /// Whether the class, assuming that it is within scope, is
+  /// implementable to classes, mixins, and enums in the given [library].
+  bool isImplementableIn(LibraryElement library);
+
+  /// Whether the class, assuming that it is within scope, is able to be
+  /// mixed-in by classes and enums in the given [library].
+  bool isMixableIn(LibraryElement library);
+}
+
 /// An [InterfaceElementImpl] which is a class.
 class ClassElementImpl extends ClassOrMixinElementImpl
     with _HasAugmentation<ClassElementImpl>
@@ -691,6 +954,27 @@
   }
 }
 
+/// An element that is contained within a [ClassElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ClassMemberElement implements Element {
+  // TODO(brianwilkerson) Either remove this class or rename it to something
+  //  more correct.
+
+  @Deprecated('Use enclosingElement2 instead')
+  @override
+  Element get enclosingElement;
+
+  @override
+  Element get enclosingElement2;
+
+  /// 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;
+}
+
 abstract class ClassOrMixinElementImpl extends InterfaceElementImpl {
   /// Initialize a newly created class element to have the given [name] at the
   /// given [offset] in the file that contains the declaration of this element.
@@ -709,6 +993,61 @@
   ElementKind get kind => ElementKind.CLASS;
 }
 
+/// An element representing a compilation unit.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class CompilationUnitElement implements UriReferencedElement {
+  /// The top-level accessors (getters and setters) declared in this
+  /// compilation unit.
+  List<PropertyAccessorElement> get accessors;
+
+  /// The classes declared in this compilation unit.
+  List<ClassElement> get classes;
+
+  /// The library, or library augmentation that encloses this unit.
+  @Deprecated('Use enclosingElement2 instead')
+  @override
+  LibraryOrAugmentationElement get enclosingElement;
+
+  /// The library, or library augmentation that encloses this unit.
+  @override
+  LibraryOrAugmentationElement get enclosingElement2;
+
+  /// The enums declared in this compilation unit.
+  List<EnumElement> get enums;
+
+  /// The extensions declared in this compilation unit.
+  List<ExtensionElement> get extensions;
+
+  /// The top-level functions declared in this compilation unit.
+  List<FunctionElement> get functions;
+
+  /// The [LineInfo] for the [source].
+  LineInfo get lineInfo;
+
+  /// The mixins declared in this compilation unit.
+  List<MixinElement> get mixins;
+
+  @override
+  AnalysisSession get session;
+
+  /// The top-level variables declared in this compilation unit.
+  List<TopLevelVariableElement> get topLevelVariables;
+
+  /// The type aliases declared in this compilation unit.
+  List<TypeAliasElement> get typeAliases;
+
+  /// Returns the class defined in this compilation unit that has the given
+  /// [name], or `null` if this compilation unit does not define a class with
+  /// the given name.
+  ClassElement? getClass(String name);
+
+  /// Returns the enum defined in this compilation unit that has the given
+  /// [name], or `null` if this compilation unit does not define an enum with
+  /// the given name.
+  EnumElement? getEnum(String name);
+}
+
 /// A concrete implementation of a [CompilationUnitElement].
 class CompilationUnitElementImpl extends UriReferencedElementImpl
     implements CompilationUnitElement, MacroTargetElementContainer {
@@ -989,6 +1328,72 @@
   ConstLocalVariableElementImpl(super.name, super.offset);
 }
 
+/// An element representing a constructor or a factory method defined within a
+/// class.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ConstructorElement
+    implements ClassMemberElement, ExecutableElement, ConstantEvaluationTarget {
+  @experimental
+  @override
+  ConstructorElement? get augmentation;
+
+  @experimental
+  @override
+  ConstructorElement? get augmentationTarget;
+
+  @override
+  ConstructorElement get declaration;
+
+  @override
+  String get displayName;
+
+  @Deprecated('Use enclosingElement2 instead')
+  @override
+  InterfaceElement get enclosingElement;
+
+  @override
+  NamedInstanceElement get enclosingElement2;
+
+  /// 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;
+
+  @override
+  String get name;
+
+  /// The offset of the character immediately following the last character of
+  /// this constructor's name, or `null` if not named.
+  ///
+  /// TODO(migration): encapsulate [nameEnd] and [periodOffset]?
+  int? get nameEnd;
+
+  /// The offset of the `.` before this constructor name, or `null` if not
+  /// named.
+  int? get periodOffset;
+
+  /// The constructor to which this constructor is redirecting, or `null` if
+  /// this constructor does not redirect to another constructor or if the
+  /// library containing this constructor has not yet been resolved.
+  ConstructorElement? get redirectedConstructor;
+
+  @Deprecated('Use returnType2 instead')
+  @override
+  InterfaceType get returnType;
+
+  @override
+  DartType get returnType2;
+}
+
 /// A concrete implementation of a [ConstructorElement].
 class ConstructorElementImpl extends ExecutableElementImpl
     with ConstructorElementMixin
@@ -1383,6 +1788,11 @@
   }
 }
 
+/// [ImportElementPrefix] that is used together with `deferred`.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class DeferredImportElementPrefix implements ImportElementPrefix {}
+
 class DeferredImportElementPrefixImpl extends ImportElementPrefixImpl
     implements DeferredImportElementPrefix {
   DeferredImportElementPrefixImpl({
@@ -1390,8 +1800,21 @@
   });
 }
 
+/// Meaning of a URI referenced in a directive.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class DirectiveUri {}
+
 class DirectiveUriImpl implements DirectiveUri {}
 
+/// [DirectiveUriWithSource] that references a [LibraryAugmentationElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class DirectiveUriWithAugmentation extends DirectiveUriWithSource {
+  /// The library augmentation referenced by the [source].
+  LibraryAugmentationElement get augmentation;
+}
+
 class DirectiveUriWithAugmentationImpl extends DirectiveUriWithSourceImpl
     implements DirectiveUriWithAugmentation {
   @override
@@ -1405,6 +1828,14 @@
   });
 }
 
+/// [DirectiveUriWithSource] that references a [LibraryElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class DirectiveUriWithLibrary extends DirectiveUriWithSource {
+  /// The library referenced by the [source].
+  LibraryElement get library;
+}
+
 class DirectiveUriWithLibraryImpl extends DirectiveUriWithSourceImpl
     implements DirectiveUriWithLibrary {
   @override
@@ -1424,6 +1855,15 @@
   });
 }
 
+/// [DirectiveUriWithRelativeUriString] that can be parsed into a relative URI.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class DirectiveUriWithRelativeUri
+    extends DirectiveUriWithRelativeUriString {
+  /// The relative URI, parsed from [relativeUriString].
+  Uri get relativeUri;
+}
+
 class DirectiveUriWithRelativeUriImpl
     extends DirectiveUriWithRelativeUriStringImpl
     implements DirectiveUriWithRelativeUri {
@@ -1436,6 +1876,14 @@
   });
 }
 
+/// [DirectiveUri] for which we can get its relative URI string.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class DirectiveUriWithRelativeUriString extends DirectiveUri {
+  /// The relative URI string specified in code.
+  String get relativeUriString;
+}
+
 class DirectiveUriWithRelativeUriStringImpl extends DirectiveUriImpl
     implements DirectiveUriWithRelativeUriString {
   @override
@@ -1446,6 +1894,14 @@
   });
 }
 
+/// [DirectiveUriWithRelativeUri] that resolves to a [Source].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class DirectiveUriWithSource extends DirectiveUriWithRelativeUri {
+  /// The result of resolving [relativeUri] against the enclosing URI.
+  Source get source;
+}
+
 class DirectiveUriWithSourceImpl extends DirectiveUriWithRelativeUriImpl
     implements DirectiveUriWithSource {
   @override
@@ -1458,6 +1914,14 @@
   });
 }
 
+/// [DirectiveUriWithSource] that references a [CompilationUnitElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class DirectiveUriWithUnit extends DirectiveUriWithSource {
+  /// The unit referenced by the [source].
+  CompilationUnitElement get unit;
+}
+
 class DirectiveUriWithUnitImpl extends DirectiveUriWithRelativeUriImpl
     implements DirectiveUriWithUnit {
   @override
@@ -1493,6 +1957,419 @@
   T? accept<T>(ElementVisitor<T> visitor) => null;
 }
 
+/// 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 do not 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 do not 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 do not have a name.
+/// These correspond to unnamed functions and 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 Element implements AnalysisTarget {
+  /// A list of this element's children.
+  ///
+  /// There is no guarantee of the order in which the children will be included.
+  List<Element> get children;
+
+  /// The analysis context in which this element is defined.
+  AnalysisContext get context;
+
+  /// The declaration of this element.
+  ///
+  /// If the element is a view on an element, e.g. a method from an interface
+  /// type, with substituted type parameters, return the corresponding element
+  /// from the class, without any substitutions. If this element is already a
+  /// declaration (or a synthetic element, e.g. a synthetic property accessor),
+  /// return itself.
+  Element? get declaration;
+
+  /// The display name of this element, possibly the empty string if the
+  /// element does not have a name.
+  ///
+  /// In most cases the name and the display name are the same. Differences
+  /// though are cases such as setters where the name of some setter `set f(x)`
+  /// is `f=`, instead of `f`.
+  String get displayName;
+
+  /// The content of the documentation comment (including delimiters) for this
+  /// element, or `null` if this element does not or cannot have documentation.
+  String? get documentationComment;
+
+  /// The element that either physically or logically encloses this element.
+  ///
+  /// This will be `null` if this element is a library because libraries are
+  /// the top-level elements in the model.
+  @Deprecated('Use enclosingElement2 instead')
+  Element? get enclosingElement;
+
+  /// The element that either physically or logically encloses this element.
+  ///
+  /// This will be `null` if this element is a library because libraries are
+  /// the top-level elements in the model.
+  Element? get enclosingElement2;
+
+  /// Whether the element has an annotation of the form `@alwaysThrows`.
+  bool get hasAlwaysThrows;
+
+  /// Whether the element has an annotation of the form `@deprecated`
+  /// or `@Deprecated('..')`.
+  bool get hasDeprecated;
+
+  /// Whether the element has an annotation of the form `@doNotStore`.
+  bool get hasDoNotStore;
+
+  /// Whether the element has an annotation of the form `@factory`.
+  bool get hasFactory;
+
+  /// Whether the element has an annotation of the form `@internal`.
+  bool get hasInternal;
+
+  /// Whether the element has an annotation of the form `@isTest`.
+  bool get hasIsTest;
+
+  /// Whether the element has an annotation of the form `@isTestGroup`.
+  bool get hasIsTestGroup;
+
+  /// Whether the element has an annotation of the form `@JS(..)`.
+  bool get hasJS;
+
+  /// Whether the element has an annotation of the form `@literal`.
+  bool get hasLiteral;
+
+  /// Whether the element has an annotation of the form `@mustBeOverridden`.
+  bool get hasMustBeOverridden;
+
+  /// Whether the element has an annotation of the form `@mustCallSuper`.
+  bool get hasMustCallSuper;
+
+  /// Whether the element has an annotation of the form `@nonVirtual`.
+  bool get hasNonVirtual;
+
+  /// Whether the element has an annotation of the form `@optionalTypeArgs`.
+  bool get hasOptionalTypeArgs;
+
+  /// Whether the element has an annotation of the form `@override`.
+  bool get hasOverride;
+
+  /// Whether the element has an annotation of the form `@protected`.
+  bool get hasProtected;
+
+  /// Whether the element has an annotation of the form `@reopen`.
+  bool get hasReopen;
+
+  /// Whether the element has an annotation of the form `@required`.
+  bool get hasRequired;
+
+  /// Whether the element has an annotation of the form `@sealed`.
+  bool get hasSealed;
+
+  /// Whether the element has an annotation of the form `@useResult`
+  /// or `@UseResult('..')`.
+  bool get hasUseResult;
+
+  /// Whether the element has an annotation of the form `@visibleForOverriding`.
+  bool get hasVisibleForOverriding;
+
+  /// Whether the element has an annotation of the form `@visibleForTemplate`.
+  bool get hasVisibleForTemplate;
+
+  /// Whether the element has an annotation of the form `@visibleForTesting`.
+  bool get hasVisibleForTesting;
+
+  /// Whether the element has an annotation of the form
+  /// `@visibleOutsideTemplate`.
+  bool get hasVisibleOutsideTemplate;
+
+  /// The unique integer identifier of this element.
+  int get id;
+
+  /// Whether the element is private.
+  ///
+  /// Private elements are visible only within the library in which they are
+  /// declared.
+  bool get isPrivate;
+
+  /// Whether the element is public.
+  ///
+  /// Public elements are visible within any library that imports the library
+  /// in which they are declared.
+  bool get isPublic;
+
+  /// Whether the 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 element that this is.
+  ElementKind get kind;
+
+  /// Tibrary that contains this element.
+  ///
+  /// This will be the element itself if it is a library element. This will be
+  /// `null` if this element is [MultiplyDefinedElement] that is not contained
+  /// in a library.
+  LibraryElement? get library;
+
+  /// The location of this element in the element model.
+  ///
+  /// The object can be used to locate this element at a later time.
+  ElementLocation? get location;
+
+  /// All of the metadata associated with this element.
+  ///
+  /// The array will be empty if the element does not have any metadata or if
+  /// the library containing this element has not yet been resolved.
+  List<ElementAnnotation> get metadata;
+
+  /// The name of this element, or `null` if this element does not have a name.
+  String? get name;
+
+  /// The length of the name of this element in the file that contains the
+  /// declaration of this element, or `0` if this element does not have a name.
+  int get nameLength;
+
+  /// The offset of the name of this element in the file that contains the
+  /// declaration of this element, or `-1` if this element is synthetic, does
+  /// not have a name, or otherwise does not have an offset.
+  int get nameOffset;
+
+  /// 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.
+  Element get nonSynthetic;
+
+  /// The analysis session in which this element is defined.
+  AnalysisSession? get session;
+
+  /// The version where this 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 SDK, or does not have
+  /// a `@Since()` annotation applicable to it.
+  Version? get sinceSdkVersion;
+
+  @override
+  Source? get source;
+
+  /// Uses the given [visitor] to visit this element.
+  ///
+  /// Returns the value returned by the visitor as a result of visiting this
+  /// element.
+  T? accept<T>(ElementVisitor<T> visitor);
+
+  /// Returns the presentation of this element as it should appear when
+  /// presented to users.
+  ///
+  /// If [withNullability] is `true`, then [NullabilitySuffix.question] and
+  /// [NullabilitySuffix.star] in types will be represented as `?` and `*`.
+  /// [NullabilitySuffix.none] does not have any explicit presentation.
+  ///
+  /// If [withNullability] is `false`, nullability suffixes will not be
+  /// included into the presentation.
+  ///
+  /// If [multiline] is `true`, 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.
+  ///
+  /// Clients should not depend on the content of the returned value as it will
+  /// be changed if doing so would improve the UX.
+  String getDisplayString({
+    required bool withNullability,
+    bool multiline = false,
+  });
+
+  /// Returns a display name for the given element that includes the path to the
+  /// compilation unit in which the type is defined. If [shortName] is `null`
+  /// then [displayName] will be used as the name of this element. Otherwise
+  /// the provided name will be used.
+  // TODO(brianwilkerson) Make the parameter optional.
+  String getExtendedDisplayName(String? shortName);
+
+  /// Whether the element, assuming that it is within scope, is accessible to
+  /// code in the given [library].
+  ///
+  /// 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 isAccessibleIn(LibraryElement library);
+
+  /// Returns either this element or the most immediate ancestor of this element
+  /// for which the [predicate] returns `true`, or `null` if there is no such
+  /// element.
+  E? thisOrAncestorMatching<E extends Element>(
+    bool Function(Element) predicate,
+  );
+
+  /// Returns either this element or the most immediate ancestor of this element
+  /// that has the given type, or `null` if there is no such element.
+  E? thisOrAncestorOfType<E extends Element>();
+
+  /// 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 visitChildren(ElementVisitor visitor);
+}
+
+/// A single annotation associated with an element.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ElementAnnotation implements ConstantEvaluationTarget {
+  /// The errors that were produced while computing a value for this
+  /// annotation, or `null` if no value has been computed.
+  ///
+  /// If a value has been produced but no errors were generated, then the
+  /// list will be empty.
+  List<AnalysisError>? get constantEvaluationErrors;
+
+  /// Returns the element referenced by this annotation.
+  ///
+  /// In valid code this element can be a [PropertyAccessorElement] getter
+  /// of a constant top-level variable, or a constant static field of a
+  /// class; or a constant [ConstructorElement].
+  ///
+  /// In invalid code this element can be `null`, or a reference to any
+  /// other element.
+  Element? get element;
+
+  /// Whether the annotation marks the associated function as always throwing.
+  bool get isAlwaysThrows;
+
+  /// Whether the annotation marks the associated element as being deprecated.
+  bool get isDeprecated;
+
+  /// Whether the annotation marks the associated element as not to be stored.
+  bool get isDoNotStore;
+
+  /// Whether the annotation marks the associated member as a factory.
+  bool get isFactory;
+
+  /// Whether the annotation marks the associated class and its subclasses as
+  /// being immutable.
+  bool get isImmutable;
+
+  /// Whether the annotation marks the associated element as being internal to
+  /// its package.
+  bool get isInternal;
+
+  /// Whether the annotation marks the associated member as running a single
+  /// test.
+  bool get isIsTest;
+
+  /// Whether the annotation marks the associated member as running a test
+  /// group.
+  bool get isIsTestGroup;
+
+  /// Whether the annotation marks the associated element with the `JS`
+  /// annotation.
+  bool get isJS;
+
+  /// Whether the annotation marks the associated constructor as being literal.
+  bool get isLiteral;
+
+  /// Whether the annotation marks the associated member as requiring
+  /// subclasses to override this member.
+  bool get isMustBeOverridden;
+
+  /// Whether the annotation marks the associated member as requiring
+  /// overriding methods to call super.
+  bool get isMustCallSuper;
+
+  /// Whether the annotation marks the associated member as being non-virtual.
+  bool get isNonVirtual;
+
+  /// Whether the annotation marks the associated type as having "optional"
+  /// type arguments.
+  bool get isOptionalTypeArgs;
+
+  /// Whether the annotation marks the associated method as being expected to
+  /// override an inherited method.
+  bool get isOverride;
+
+  /// Whether the annotation marks the associated member as being protected.
+  bool get isProtected;
+
+  /// Whether the annotation marks the associated class as implementing a proxy
+  /// object.
+  bool get isProxy;
+
+  /// Whether the marks the associated member as being reopened.
+  bool get isReopen;
+
+  /// Whether the annotation marks the associated member as being required.
+  bool get isRequired;
+
+  /// Whether the annotation marks the associated class as being sealed.
+  bool get isSealed;
+
+  /// Whether the annotation marks the associated class as being intended to
+  /// be used as an annotation.
+  bool get isTarget;
+
+  /// Whether the annotation marks the associated returned element as
+  /// requiring use.
+  bool get isUseResult;
+
+  /// Whether the annotation marks the associated member as being visible for
+  /// overriding only.
+  bool get isVisibleForOverriding;
+
+  /// Whether the annotation marks the associated member as being visible for
+  /// template files.
+  bool get isVisibleForTemplate;
+
+  /// Whether the annotation marks the associated member as being visible for
+  /// testing.
+  bool get isVisibleForTesting;
+
+  /// Whether the annotation marks the associated member as being visible
+  /// outside of template files.
+  bool get isVisibleOutsideTemplate;
+
+  /// Returns a representation of the value of this annotation, forcing the
+  /// value to be computed if it had not previously been computed, or `null`
+  /// if the value of this annotation could not be computed because of errors.
+  DartObject? computeConstantValue();
+
+  /// Returns a textual description of this annotation in a form approximating
+  /// valid source.
+  ///
+  /// The returned string will not be valid source primarily in the case where
+  /// the annotation itself is not well-formed.
+  String toSource();
+}
+
 /// A concrete implementation of an [ElementAnnotation].
 class ElementAnnotationImpl implements ElementAnnotation {
   /// The name of the top-level variable used to mark that a function always
@@ -2611,6 +3488,23 @@
   }
 }
 
+/// An element that represents an enum.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class EnumElement implements InterfaceElement {
+  @experimental
+  @override
+  EnumElement? get augmentation;
+
+  @experimental
+  @override
+  EnumElement? get augmentationTarget;
+
+  @experimental
+  @override
+  AugmentedEnumElement? get augmented;
+}
+
 /// An [InterfaceElementImpl] which is an enum.
 class EnumElementImpl extends InterfaceElementImpl implements EnumElement {
   late AugmentedEnumElement augmentedInternal =
@@ -2665,6 +3559,86 @@
   }
 }
 
+/// 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 ExecutableElement implements FunctionTypedElement {
+  /// The immediate augmentation of this element, or `null` if there are no
+  /// augmentations.
+  ///
+  /// [ExecutableElement.augmentationTarget] will point back at this element.
+  @experimental
+  ExecutableElement? get augmentation;
+
+  /// The element that is augmented by this augmentation.
+  ///
+  /// The chain of augmentations normally ends with a [ExecutableElement] that
+  /// is not an augmentation, but might end with `null` immediately or after a
+  /// few intermediate [ExecutableElement]s in case of invalid code when an
+  /// augmentation is declared without the corresponding declaration.
+  @experimental
+  ExecutableElement? get augmentationTarget;
+
+  @override
+  ExecutableElement get declaration;
+
+  @override
+  String get displayName;
+
+  @Deprecated('Use enclosingElement2 instead')
+  @override
+  Element get enclosingElement;
+
+  @override
+  Element get enclosingElement2;
+
+  /// 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 has body marked as being asynchronous.
+  bool get isAsynchronous;
+
+  /// Whether the element is an augmentation.
+  ///
+  /// If `true`, declaration has the explicit `augment` modifier.
+  bool get isAugmentation;
+
+  /// 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 executable element has a body marked as being a generator.
+  bool get isGenerator;
+
+  /// Whether the executable element is an operator.
+  ///
+  /// The test may 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;
+
+  /// 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;
+
+  /// Whether the executable element has a body marked as being synchronous.
+  bool get isSynchronous;
+
+  @override
+  String get name;
+}
+
 /// A base class for concrete implementations of an [ExecutableElement].
 abstract class ExecutableElementImpl extends _ExistingElementImpl
     with TypeParameterizedElementMixin, HasCompletionData
@@ -2881,6 +3855,46 @@
   }
 }
 
+/// An element that represents an extension.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ExtensionElement implements InstanceElement {
+  @experimental
+  @override
+  ExtensionElement? get augmentation;
+
+  @experimental
+  @override
+  ExtensionElement? get augmentationTarget;
+
+  @experimental
+  @override
+  AugmentedExtensionElement? get augmented;
+
+  /// The type that is extended by this extension.
+  DartType get extendedType;
+
+  /// Returns the element representing the field with the given [name] that is
+  /// declared in this extension, or `null` if this extension does not declare a
+  /// field with the given name.
+  FieldElement? getField(String name);
+
+  /// Returns the element representing the getter with the given [name] that is
+  /// declared in this extension, or `null` if this extension does not declare a
+  /// getter with the given name.
+  PropertyAccessorElement? getGetter(String name);
+
+  /// Returns the element representing the method with the given [name] that is
+  /// declared in this extension, or `null` if this extension does not declare a
+  /// method with the given name.
+  MethodElement? getMethod(String name);
+
+  /// Returns the element representing the setter with the given [name] that is
+  /// declared in this extension, or `null` if this extension does not declare a
+  /// setter with the given name.
+  PropertyAccessorElement? getSetter(String name);
+}
+
 /// A concrete implementation of an [ExtensionElement].
 class ExtensionElementImpl extends InstanceElementImpl
     with HasCompletionData
@@ -3022,6 +4036,40 @@
   }
 }
 
+/// A field defined within a class.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class FieldElement
+    implements ClassMemberElement, PropertyInducingElement {
+  @override
+  FieldElement get declaration;
+
+  /// 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;
+
+  /// 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.
+  @override
+  bool get isStatic;
+}
+
 /// A concrete implementation of a [FieldElement].
 class FieldElementImpl extends PropertyInducingElementImpl
     with HasCompletionData
@@ -3102,6 +4150,15 @@
   T? accept<T>(ElementVisitor<T> visitor) => visitor.visitFieldElement(this);
 }
 
+/// A field formal parameter defined within a constructor element.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class FieldFormalParameterElement implements ParameterElement {
+  /// The field element associated with this field formal parameter, or `null`
+  /// if the parameter references a field that doesn't exist.
+  FieldElement? get field;
+}
+
 /// A [ParameterElementImpl] that has the additional information of the
 /// [FieldElement] associated with the parameter.
 class FieldFormalParameterElementImpl extends ParameterElementImpl
@@ -3134,6 +4191,43 @@
       visitor.visitFieldFormalParameterElement(this);
 }
 
+/// A (non-method) function. This can be either a top-level function, 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 FunctionElement implements ExecutableElement, LocalElement {
+  /// 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 synthetic function defined for libraries that are
+  /// deferred.
+  static final String LOAD_LIBRARY_NAME = "loadLibrary";
+
+  /// The name of the function used as an entry point.
+  static const String MAIN_FUNCTION_NAME = "main";
+
+  /// 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";
+
+  @experimental
+  @override
+  FunctionElement? get augmentation;
+
+  @experimental
+  @override
+  FunctionElement? get augmentationTarget;
+
+  /// Whether the function represents `identical` from the `dart:core` library.
+  bool get isDartCoreIdentical;
+
+  /// Whether the function is an entry point, i.e. a top-level function and
+  /// has the name `main`.
+  bool get isEntryPoint;
+}
+
 /// A concrete implementation of a [FunctionElement].
 class FunctionElementImpl extends ExecutableElementImpl
     implements FunctionElement, FunctionTypedElementImpl {
@@ -3181,6 +4275,26 @@
   T? accept<T>(ElementVisitor<T> visitor) => visitor.visitFunctionElement(this);
 }
 
+/// 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 FunctionTypedElement implements TypeParameterizedElement {
+  /// The parameters defined by this executable element.
+  List<ParameterElement> get parameters;
+
+  /// The return type defined by this element.
+  @Deprecated('Use returnType2 instead')
+  DartType get returnType;
+
+  /// The return type defined by this element.
+  DartType get returnType2;
+
+  /// The type defined by this element.
+  FunctionType get type;
+}
+
 /// Common internal interface shared by elements whose type is a function type.
 ///
 /// Clients may not extend, implement or mix-in this class.
@@ -3189,6 +4303,11 @@
   set returnType(DartType returnType);
 }
 
+/// The pseudo-declaration that defines a generic function type.
+///
+/// Clients may not extend, implement, or mix-in this class.
+abstract class GenericFunctionTypeElement implements FunctionTypedElement {}
+
 /// The element used for a generic function type.
 ///
 /// Clients may not extend, implement or mix-in this class.
@@ -3310,6 +4429,16 @@
   Object? completionData;
 }
 
+/// A combinator that causes some of the names in a namespace to be hidden when
+/// being imported.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class HideElementCombinator implements NamespaceCombinator {
+  /// The names that are not to be made visible in the importing library even
+  /// if they are defined in the imported library.
+  List<String> get hiddenNames;
+}
+
 /// A concrete implementation of a [HideElementCombinator].
 class HideElementCombinatorImpl implements HideElementCombinator {
   @override
@@ -3330,6 +4459,15 @@
   }
 }
 
+/// Usage of a [PrefixElement] in an `import` directive.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ImportElementPrefix {
+  /// The prefix that was specified as part of the import directive, or `null`
+  /// if there was no prefix specified.
+  PrefixElement get element;
+}
+
 class ImportElementPrefixImpl implements ImportElementPrefix {
   @override
   final PrefixElementImpl element;
@@ -3339,6 +4477,27 @@
   });
 }
 
+/// An element that represents an inline class.
+///
+/// Clients may not extend, implement or mix-in this class.
+@experimental
+abstract class InlineClassElement implements NamedInstanceElement {
+  @experimental
+  @override
+  InlineClassElement? get augmentation;
+
+  @experimental
+  @override
+  InlineClassElement? get augmentationTarget;
+
+  @experimental
+  @override
+  AugmentedInlineClassElement? get augmented;
+
+  /// The direct [InlineClassType]s that are implemented by this inline class.
+  List<InlineClassType> get implemented;
+}
+
 class InlineClassElementImpl extends NamedInstanceElementImpl
     implements InlineClassElement {
   InlineClassElementImpl(super.name, super.nameOffset);
@@ -3392,6 +4551,64 @@
   }
 }
 
+/// An element that has `this`.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class InstanceElement
+    implements TypeDefiningElement, TypeParameterizedElement {
+  /// The declared accessors (getters and setters).
+  List<PropertyAccessorElement> get accessors;
+
+  /// The immediate augmentation of this element, or `null` if there are no
+  /// augmentations.
+  ///
+  /// [InstanceElement.augmentationTarget] will point back at this element.
+  @experimental
+  InstanceElement? get augmentation;
+
+  /// The element that is augmented by this augmentation; or `null` if
+  /// [isAugmentation] is `false`, or there is no corresponding element to be
+  /// augmented.
+  ///
+  /// The chain of augmentations should normally end with a not augmentation
+  /// [InstanceElement], but might end with `null` immediately or after a few
+  /// intermediate elements in case of invalid code when an augmentation is
+  /// declared without the corresponding declaration.
+  @experimental
+  InstanceElement? get augmentationTarget;
+
+  /// The result of applying augmentations.
+  @experimental
+  AugmentedInstanceElement? get augmented;
+
+  @Deprecated('Use enclosingElement2 instead')
+  @override
+  CompilationUnitElement get enclosingElement;
+
+  @override
+  CompilationUnitElement get enclosingElement2;
+
+  /// The declared fields.
+  List<FieldElement> get fields;
+
+  /// Whether the element is an augmentation.
+  ///
+  /// If `true`, declaration has the explicit `augment` modifier.
+  bool get isAugmentation;
+
+  /// The declared methods.
+  List<MethodElement> get methods;
+
+  /// The type of `this` expression.
+  ///
+  /// For a class like `class MyClass<T, U> {}` the returned type is equivalent
+  /// to the type `MyClass<T, U>`. So, the type arguments are the types of the
+  /// type parameters, and either `none` or `star` is used for the nullability
+  /// suffix is used, depending on the nullability status of the declaring
+  /// library.
+  DartType get thisType;
+}
+
 abstract class InstanceElementImpl extends _ExistingElementImpl
     with TypeParameterizedElementMixin
     implements InstanceElement {
@@ -3495,6 +4712,250 @@
   }
 }
 
+/// An element that defines an [InterfaceType].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class InterfaceElement implements NamedInstanceElement {
+  /// All the supertypes defined for this element and its supertypes.
+  ///
+  /// This includes superclasses, mixins, interfaces, and superclass constraints.
+  List<InterfaceType> get allSupertypes;
+
+  @override
+  InterfaceElement? get augmentationTarget;
+
+  @experimental
+  @override
+  AugmentedInterfaceElement? get augmented;
+
+  /// 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.
+  ///
+  /// [ClassElement] and [EnumElement] can have mixins.
+  ///
+  /// [MixinElement] cannot have mixins, so the 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 [ClassElement] 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 [EnumElement] returns `Enum` from `dart:core`.
+  ///
+  /// For [MixinElement] 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 field (synthetic or explicit) defined directly in this class or
+  /// augmentation that has the given [name].
+  /// TODO(scheglov) Deprecate and remove it.
+  FieldElement? getField(String name);
+
+  /// The getter (synthetic or explicit) defined directly in this class or
+  /// augmentation that has the given [name].
+  /// TODO(scheglov) Deprecate and remove it.
+  PropertyAccessorElement? getGetter(String name);
+
+  /// The method defined directly in this class or augmentation that has the
+  /// given [name].
+  /// TODO(scheglov) Deprecate and remove it.
+  MethodElement? getMethod(String name);
+
+  /// The setter (synthetic or explicit) defined directly in this class or
+  /// augmentation that has the given [name].
+  /// TODO(scheglov) Deprecate and remove it.
+  PropertyAccessorElement? getSetter(String name);
+
+  @override
+  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.
+  MethodElement? lookUpConcreteMethod(
+      String methodName, LibraryElement library);
+
+  /// Returns the element representing the getter that results from looking up
+  /// the given [getterName] 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 16.15.2:
+  /// <blockquote>
+  /// The result of looking up getter (respectively setter) <i>m</i> in class
+  /// <i>C</i> with respect to library <i>L</i> is: If <i>C</i> declares an
+  /// instance getter (respectively setter) named <i>m</i> that is accessible to
+  /// <i>L</i>, then that getter (respectively setter) 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 getter (respectively setter)
+  /// <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.
+  PropertyAccessorElement? lookUpGetter(
+      String getterName, LibraryElement library);
+
+  /// Returns the element representing the getter that results from looking up
+  /// the given [getterName] in the superclass of this class with respect to the
+  /// given [library], ignoring abstract getters, or `null` if the look up
+  /// fails.
+  ///
+  /// The behavior of this method is defined by the Dart Language Specification
+  /// in section 16.15.2:
+  /// <blockquote>
+  /// The result of looking up getter (respectively setter) <i>m</i> in class
+  /// <i>C</i> with respect to library <i>L</i> is: If <i>C</i> declares an
+  /// instance getter (respectively setter) named <i>m</i> that is accessible to
+  /// <i>L</i>, then that getter (respectively setter) 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 getter (respectively setter)
+  /// <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.
+  PropertyAccessorElement? lookUpInheritedConcreteGetter(
+      String getterName, LibraryElement 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], 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.
+  MethodElement? lookUpInheritedConcreteMethod(
+      String methodName, LibraryElement library);
+
+  /// Returns the element representing the setter that results from looking up
+  /// the given [setterName] in the superclass of this class with respect to the
+  /// given [library], ignoring abstract setters, or `null` if the look up
+  /// fails.
+  ///
+  /// The behavior of this method is defined by the Dart Language Specification
+  /// in section 16.15.2:
+  /// <blockquote>
+  /// The result of looking up getter (respectively setter) <i>m</i> in class
+  /// <i>C</i> with respect to library <i>L</i> is:  If <i>C</i> declares an
+  /// instance getter (respectively setter) named <i>m</i> that is accessible to
+  /// <i>L</i>, then that getter (respectively setter) 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 getter (respectively setter)
+  /// <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.
+  PropertyAccessorElement? lookUpInheritedConcreteSetter(
+      String setterName, LibraryElement 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.
+  MethodElement? lookUpInheritedMethod(
+      String methodName, LibraryElement library);
+
+  /// Returns the element representing the method that results from looking up
+  /// the given [methodName] 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 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.
+  MethodElement? lookUpMethod(String methodName, LibraryElement library);
+
+  /// Returns the element representing the setter that results from looking up
+  /// the given [setterName] 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 16.15.2:
+  /// <blockquote>
+  /// The result of looking up getter (respectively setter) <i>m</i> in class
+  /// <i>C</i> with respect to library <i>L</i> is: If <i>C</i> declares an
+  /// instance getter (respectively setter) named <i>m</i> that is accessible to
+  /// <i>L</i>, then that getter (respectively setter) 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 getter (respectively setter)
+  /// <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.
+  PropertyAccessorElement? lookUpSetter(
+      String setterName, LibraryElement library);
+}
+
 abstract class InterfaceElementImpl extends NamedInstanceElementImpl
     with HasCompletionData, MacroTargetElement
     implements InterfaceElement {
@@ -3894,6 +5355,19 @@
   }
 }
 
+/// 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 JoinPatternVariableElement implements PatternVariableElement {
+  /// Whether the [variables] are consistent, present in all branches,
+  /// and have the same type and finality.
+  bool get isConsistent;
+
+  /// The variables that join into this variable.
+  List<PatternVariableElement> get variables;
+}
+
 class JoinPatternVariableElementImpl extends PatternVariableElementImpl
     implements JoinPatternVariableElement {
   @override
@@ -3944,6 +5418,21 @@
   bool operator ==(Object other) => identical(other, this);
 }
 
+/// A label associated with a statement.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class LabelElement implements Element {
+  @Deprecated('Use enclosingElement2 instead')
+  @override
+  ExecutableElement get enclosingElement;
+
+  @override
+  ExecutableElement get enclosingElement2;
+
+  @override
+  String get name;
+}
+
 /// A concrete implementation of a [LabelElement].
 class LabelElementImpl extends ElementImpl implements LabelElement {
   /// A flag indicating whether this label is associated with a `switch` member
@@ -3982,6 +5471,16 @@
   T? accept<T>(ElementVisitor<T> visitor) => visitor.visitLabelElement(this);
 }
 
+/// A library augmentation.
+///
+/// Clients may not extend, implement or mix-in this class.
+@experimental
+abstract class LibraryAugmentationElement
+    implements LibraryOrAugmentationElement, _ExistingElement {
+  /// The library that is augmented by this augmentation.
+  LibraryOrAugmentationElement get augmentationTarget;
+}
+
 class LibraryAugmentationElementImpl extends LibraryOrAugmentationElementImpl
     implements LibraryAugmentationElement {
   @override
@@ -4055,6 +5554,87 @@
   }
 }
 
+/// A library.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class LibraryElement
+    implements LibraryOrAugmentationElement, _ExistingElement {
+  /// The entry point for this library, or `null` if this library does
+  /// not have an entry point.
+  ///
+  /// The entry point is defined to be a zero argument top-level function
+  /// whose name is `main`.
+  FunctionElement? get entryPoint;
+
+  /// The libraries that are exported from this library.
+  List<LibraryElement> get exportedLibraries;
+
+  /// The export [Namespace] of this library.
+  Namespace get exportNamespace;
+
+  /// The identifier that uniquely identifies this element among the children
+  /// of this element's parent.
+  String get identifier;
+
+  /// The libraries that are imported into this library.
+  ///
+  /// This includes all of the libraries that are imported using a prefix, and
+  /// those that are imported without a prefix.
+  List<LibraryElement> get importedLibraries;
+
+  /// Whether the library is an application that can be run in the browser.
+  bool get isBrowserApplication;
+
+  /// 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 element representing the synthetic function `loadLibrary` that is
+  /// implicitly defined for this library if the library is imported using a
+  /// deferred import.
+  FunctionElement get loadLibraryFunction;
+
+  /// The name of this library, possibly the empty string if this library does
+  /// not have an explicit name.
+  @override
+  String get name;
+
+  /// The list of `part` directives of this library.
+  List<PartElement> get parts;
+
+  /// The public [Namespace] of this library.
+  Namespace get publicNamespace;
+
+  /// The top-level elements defined in each of the compilation units that are
+  /// included in this library. This includes both public and private elements,
+  /// but does not include imports, exports, or synthetic elements.
+  Iterable<Element> get topLevelElements;
+
+  /// The compilation units this library consists of.
+  ///
+  /// This includes the defining compilation unit and units included using the
+  /// `part` directive.
+  List<CompilationUnitElement> get units;
+
+  /// The class defined in this library that has the given [name], or
+  /// `null` if this library does not define a class with the given name.
+  ClassElement? getClass(String name);
+
+  /// If a legacy library, returns the legacy view on the [element].
+  ///
+  /// Otherwise, return the original element.
+  T toLegacyElementIfOptOut<T extends Element>(T element);
+
+  /// If a legacy library, return the legacy version of the [type].
+  /// Otherwise, return the original type.
+  DartType toLegacyTypeIfOptOut(DartType type);
+}
+
 /// A concrete implementation of a [LibraryElement].
 class LibraryElementImpl extends LibraryOrAugmentationElementImpl
     with _HasLibraryMixin
@@ -4542,6 +6122,24 @@
   }
 }
 
+/// A single export directive within a library.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class LibraryExportElement implements _ExistingElement {
+  /// The combinators that were specified as part of the `export` directive in
+  /// the order in which they were specified.
+  List<NamespaceCombinator> get combinators;
+
+  /// The [LibraryElement], if [uri] is a [DirectiveUriWithLibrary].
+  LibraryElement? get exportedLibrary;
+
+  /// The offset of the `export` keyword.
+  int get exportKeywordOffset;
+
+  /// The interpretation of the URI specified in the directive.
+  DirectiveUri get uri;
+}
+
 class LibraryExportElementImpl extends _ExistingElementImpl
     implements LibraryExportElement {
   @override
@@ -4593,6 +6191,31 @@
   }
 }
 
+/// A single import directive within a library.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class LibraryImportElement implements _ExistingElement {
+  /// The combinators that were specified as part of the `import` directive in
+  /// the order in which they were specified.
+  List<NamespaceCombinator> get combinators;
+
+  /// The [LibraryElement], if [uri] is a [DirectiveUriWithLibrary].
+  LibraryElement? get importedLibrary;
+
+  /// The offset of the `import` keyword.
+  int get importKeywordOffset;
+
+  /// The [Namespace] that this directive contributes to the containing library.
+  Namespace get namespace;
+
+  /// The prefix that was specified as part of the import directive, or `null`
+  /// if there was no prefix specified.
+  ImportElementPrefix? get prefix;
+
+  /// The interpretation of the URI specified in the directive.
+  DirectiveUri get uri;
+}
+
 class LibraryImportElementImpl extends _ExistingElementImpl
     implements LibraryImportElement {
   @override
@@ -4664,6 +6287,63 @@
   }
 }
 
+/// Shared interface between [LibraryElement] and [LibraryAugmentationElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+@experimental
+abstract class LibraryOrAugmentationElement implements Element {
+  /// The extension elements accessible within this library.
+  List<ExtensionElement> get accessibleExtensions;
+
+  /// The augmentation imports specified in this library.
+  @experimental
+  List<AugmentationImportElement> get augmentationImports;
+
+  /// The compilation unit that defines this library.
+  CompilationUnitElement get definingCompilationUnit;
+
+  /// 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 file.
+  FeatureSet get featureSet;
+
+  bool get isNonNullableByDefault;
+
+  /// The language version for this library.
+  LibraryLanguageVersion get languageVersion;
+
+  @override
+  LibraryElement get library;
+
+  /// The exports defined in this library.
+  List<LibraryExportElement> get libraryExports;
+
+  /// The imports defined in this library.
+  List<LibraryImportElement> get libraryImports;
+
+  /// The prefixes used to `import` libraries into this library.
+  ///
+  /// Each prefix can be used in more than one `import` directive.
+  List<PrefixElement> get prefixes;
+
+  /// The name lookup scope for this library.
+  ///
+  /// It consists of elements that are either declared in the library, or
+  /// imported into it.
+  Scope get scope;
+
+  @override
+  AnalysisSession get session;
+
+  /// The [TypeProvider] that is used in this library.
+  TypeProvider get typeProvider;
+
+  /// The [TypeSystem] that is used in this library.
+  TypeSystem get typeSystem;
+}
+
 /// A concrete implementation of a [LibraryOrAugmentationElement].
 abstract class LibraryOrAugmentationElementImpl extends ElementImpl
     implements LibraryOrAugmentationElement, MacroTargetElementContainer {
@@ -4807,6 +6487,23 @@
   }
 }
 
+/// An element that can be (but is not required to be) defined within a method
+/// or function (an [ExecutableElement]).
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class LocalElement implements Element {}
+
+/// A local variable.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class LocalVariableElement implements PromotableElement {
+  /// Whether the variable has an initializer at declaration.
+  bool get hasInitializer;
+
+  @override
+  String get name;
+}
+
 /// A concrete implementation of a [LocalVariableElement].
 class LocalVariableElementImpl extends NonParameterVariableElementImpl
     implements LocalVariableElement {
@@ -4847,6 +6544,22 @@
 /// Marker interface for elements that may have [MacroTargetElement]s.
 class MacroTargetElementContainer {}
 
+/// An element that represents a method defined within a class.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class MethodElement implements ClassMemberElement, ExecutableElement {
+  @experimental
+  @override
+  MethodElement? get augmentation;
+
+  @experimental
+  @override
+  MethodElement? get augmentationTarget;
+
+  @override
+  MethodElement get declaration;
+}
+
 /// A concrete implementation of a [MethodElement].
 class MethodElementImpl extends ExecutableElementImpl
     with _HasAugmentation<MethodElementImpl>
@@ -4923,6 +6636,45 @@
   T? accept<T>(ElementVisitor<T> visitor) => visitor.visitMethodElement(this);
 }
 
+/// An element that represents a mixin.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class MixinElement implements InterfaceElement {
+  @experimental
+  @override
+  MixinElement? get augmentation;
+
+  @experimental
+  @override
+  MixinElement? get augmentationTarget;
+
+  @experimental
+  @override
+  AugmentedMixinElement? get augmented;
+
+  /// 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 isImplementableIn(LibraryElement library);
+}
+
 /// A [ClassElementImpl] representing a mixin declaration.
 class MixinElementImpl extends ClassOrMixinElementImpl
     with _HasAugmentation<MixinElementImpl>
@@ -5181,6 +6933,18 @@
   String toString() => name;
 }
 
+/// 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 MultiplyDefinedElement implements Element {
+  /// The elements that were defined within the scope to have the same name.
+  List<Element> get conflictingElements;
+}
+
 /// A concrete implementation of a [MultiplyDefinedElement].
 class MultiplyDefinedElementImpl implements MultiplyDefinedElement {
   /// The unique integer identifier of this element.
@@ -5417,6 +7181,55 @@
   }
 }
 
+/// An [ExecutableElement], with the additional information of a list of
+/// [ExecutableElement]s from which this element was composed.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class MultiplyInheritedExecutableElement implements ExecutableElement {
+  /// The executable elements defined within this executable element.
+  List<ExecutableElement> get inheritedElements;
+}
+
+/// An element that represents a named [InstanceElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+@experimental
+abstract class NamedInstanceElement implements InstanceElement {
+  @override
+  NamedInstanceElement? get augmentationTarget;
+
+  @experimental
+  @override
+  AugmentedNamedInstanceElement? get augmented;
+
+  /// The declared constructors.
+  ///
+  /// The list is empty for [MixinElement].
+  List<ConstructorElement> get constructors;
+
+  @override
+  String get name;
+
+  /// The unnamed constructor declared directly in this class.
+  ///
+  /// If the class does not declare any constructors, a synthetic default
+  /// constructor will be returned.
+  /// TODO(scheglov) Deprecate and remove it.
+  ConstructorElement? get unnamedConstructor;
+
+  /// The constructor defined directly in this class or augmentation
+  /// that has the given [name].
+  /// TODO(scheglov) Deprecate and remove it.
+  ConstructorElement? getNamedConstructor(String name);
+
+  /// Create the [DartType] for this element with the given [typeArguments]
+  /// and [nullabilitySuffix].
+  DartType instantiate({
+    required List<DartType> typeArguments,
+    required NullabilitySuffix nullabilitySuffix,
+  });
+}
+
 abstract class NamedInstanceElementImpl extends InstanceElementImpl
     implements NamedInstanceElement {
   List<ConstructorElementImpl> _constructors = _Sentinel.constructorElement;
@@ -5470,6 +7283,11 @@
   void _buildMixinAppConstructors() {}
 }
 
+/// An object that controls how namespaces are combined.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class NamespaceCombinator {}
+
 /// The synthetic element representing the declaration of the type `Never`.
 class NeverElementImpl extends ElementImpl implements TypeDefiningElement {
   /// The unique instance of this class.
@@ -5702,6 +7520,107 @@
   }
 }
 
+/// A parameter defined within an executable element.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ParameterElement
+    implements PromotableElement, ConstantEvaluationTarget {
+  @override
+  ParameterElement get declaration;
+
+  /// The code of the default value, or `null` if no default value.
+  String? get defaultValueCode;
+
+  /// 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;
+
+  @override
+  String get name;
+
+  /// The kind of this parameter.
+  @Deprecated('Use the getters isOptionalNamed, isOptionalPositional, '
+      'isRequiredNamed, and isRequiredPositional')
+  ParameterKind get parameterKind;
+
+  /// The parameters defined by this parameter.
+  ///
+  /// A parameter will only define other parameters if it is a function typed
+  /// parameter.
+  List<ParameterElement> get parameters;
+
+  /// The type parameters defined by this parameter.
+  ///
+  /// A parameter will only define type parameters if it is a function typed
+  /// parameter.
+  List<TypeParameterElement> get typeParameters;
+
+  /// Appends the type, name and possibly the default value of this parameter
+  /// to the given [buffer].
+  void appendToWithoutDelimiters(
+    StringBuffer buffer, {
+    bool withNullability = false,
+  });
+}
+
 /// A concrete implementation of a [ParameterElement].
 class ParameterElementImpl extends VariableElementImpl
     with ParameterElementMixin
@@ -5943,6 +7862,14 @@
   }
 }
 
+/// A 'part' directive within a library.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class PartElement implements _ExistingElement {
+  /// The interpretation of the URI specified in the directive.
+  DirectiveUri get uri;
+}
+
 class PartElementImpl extends _ExistingElementImpl implements PartElement {
   @override
   final DirectiveUri uri;
@@ -5972,6 +7899,15 @@
   }
 }
 
+/// A pattern variable.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class PatternVariableElement implements LocalVariableElement {
+  /// The variable in which this variable joins with other pattern variables
+  /// with the same name, in a logical-or pattern, or shared case scope.
+  JoinPatternVariableElement? get join;
+}
+
 class PatternVariableElementImpl extends LocalVariableElementImpl
     implements PatternVariableElement {
   @override
@@ -5989,6 +7925,33 @@
   }
 }
 
+/// A prefix used to import one or more libraries into another library.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class PrefixElement implements _ExistingElement {
+  /// The library, or library augmentation that encloses this element.
+  @Deprecated('Use enclosingElement2 instead')
+  @override
+  LibraryOrAugmentationElement get enclosingElement;
+
+  /// The library, or library augmentation that encloses this element.
+  @override
+  LibraryOrAugmentationElement get enclosingElement2;
+
+  /// The imports that share this prefix.
+  List<LibraryImportElement> get imports;
+
+  @override
+  String get name;
+
+  /// 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;
+}
+
 /// A concrete implementation of a [PrefixElement].
 class PrefixElementImpl extends _ExistingElementImpl implements PrefixElement {
   /// The scope of this prefix, `null` if it has not been created yet.
@@ -6037,6 +8000,71 @@
   }
 }
 
+/// 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 PromotableElement implements LocalElement, VariableElement {
+  // Promotable elements are guaranteed to have a name.
+  @override
+  String get name;
+}
+
+/// A getter or a setter. Note that explicitly defined property accessors
+/// implicitly define a synthetic field. Symmetrically, synthetic accessors are
+/// implicitly created for explicitly defined fields. The following rules apply:
+///
+/// * Every explicit field is represented by a non-synthetic [FieldElement].
+/// * Every explicit field induces a getter and possibly a setter, both of which
+///   are represented by synthetic [PropertyAccessorElement]s.
+/// * Every explicit getter or setter is represented by a non-synthetic
+///   [PropertyAccessorElement].
+/// * Every explicit getter or setter (or pair thereof if they have the same
+///   name) induces a field that is represented by a synthetic [FieldElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class PropertyAccessorElement implements ExecutableElement {
+  @experimental
+  @override
+  PropertyAccessorElement? get augmentation;
+
+  @experimental
+  @override
+  PropertyAccessorElement? get augmentationTarget;
+
+  /// The accessor representing the getter that corresponds to (has the same
+  /// name as) this setter, or `null` if this accessor is not a setter or
+  /// if there is no corresponding getter.
+  PropertyAccessorElement? get correspondingGetter;
+
+  /// The accessor representing the setter that corresponds to (has the same
+  /// name as) this getter, or `null` if this accessor is not a getter or
+  /// if there is no corresponding setter.
+  PropertyAccessorElement? get correspondingSetter;
+
+  @override
+  PropertyAccessorElement get declaration;
+
+  @Deprecated('Use enclosingElement2 instead')
+  @override
+  Element get enclosingElement;
+
+  @override
+  Element get enclosingElement2;
+
+  /// Whether the accessor represents a getter.
+  bool get isGetter;
+
+  /// Whether the accessor represents a setter.
+  bool get isSetter;
+
+  /// The field or top-level variable associated with this accessor.
+  ///
+  /// If this accessor was explicitly defined (is not synthetic) then the
+  /// variable associated with it will be synthetic.
+  PropertyInducingElement get variable;
+}
+
 /// A concrete implementation of a [PropertyAccessorElement].
 class PropertyAccessorElementImpl extends ExecutableElementImpl
     with _HasAugmentation<PropertyAccessorElementImpl>
@@ -6311,6 +8339,54 @@
   }
 }
 
+/// 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
+///   [PropertyInducingElement].
+/// * Every explicit variable induces a getter and possibly a setter, both of
+///   which are represented by synthetic [PropertyAccessorElement]s.
+/// * Every explicit getter or setter is represented by a non-synthetic
+///   [PropertyAccessorElement].
+/// * Every explicit getter or setter (or pair thereof if they have the same
+///   name) induces a variable that is represented by a synthetic
+///   [PropertyInducingElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class PropertyInducingElement implements VariableElement {
+  @override
+  String get displayName;
+
+  /// The getter associated with this variable.
+  ///
+  /// If this variable was explicitly defined (is not synthetic) then the
+  /// getter associated with it will be synthetic.
+  PropertyAccessorElement? get getter;
+
+  /// Whether the variable has an initializer at declaration.
+  bool get hasInitializer;
+
+  @override
+  LibraryElement get library;
+
+  @override
+  String get name;
+
+  /// The setter associated with this variable, or `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.
+  PropertyAccessorElement? get setter;
+}
+
 /// A concrete implementation of a [PropertyInducingElement].
 abstract class PropertyInducingElementImpl
     extends NonParameterVariableElementImpl implements PropertyInducingElement {
@@ -6461,6 +8537,23 @@
   DartType perform();
 }
 
+/// A combinator that cause some of the names in a namespace to be visible (and
+/// the rest hidden) when being imported.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ShowElementCombinator implements NamespaceCombinator {
+  /// The offset of the character immediately following the last character of
+  /// this node.
+  int get end;
+
+  /// The offset of the 'show' keyword of this element.
+  int get offset;
+
+  /// The names that are to be made visible in the importing library if they
+  /// are defined in the imported library.
+  List<String> get shownNames;
+}
+
 /// A concrete implementation of a [ShowElementCombinator].
 class ShowElementCombinatorImpl implements ShowElementCombinator {
   @override
@@ -6487,6 +8580,19 @@
   }
 }
 
+/// A super formal parameter defined within a constructor element.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class SuperFormalParameterElement implements ParameterElement {
+  /// 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.
+  ParameterElement? get superConstructorParameter;
+}
+
 class SuperFormalParameterElementImpl extends ParameterElementImpl
     implements SuperFormalParameterElement {
   /// Initialize a newly created parameter element to have the given [name] and
@@ -6541,6 +8647,17 @@
   }
 }
 
+/// A top-level variable.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TopLevelVariableElement implements PropertyInducingElement {
+  @override
+  TopLevelVariableElement get declaration;
+
+  /// Whether the field was explicitly marked as being external.
+  bool get isExternal;
+}
+
 /// A concrete implementation of a [TopLevelVariableElement].
 class TopLevelVariableElementImpl extends PropertyInducingElementImpl
     with HasCompletionData
@@ -6574,6 +8691,48 @@
       visitor.visitTopLevelVariableElement(this);
 }
 
+/// A type alias (`typedef`).
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TypeAliasElement
+    implements TypeParameterizedElement, TypeDefiningElement {
+  /// If the aliased type has structure, return the corresponding element.
+  /// For example it could be [GenericFunctionTypeElement].
+  ///
+  /// If there is no structure, return `null`.
+  Element? get aliasedElement;
+
+  /// 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;
+
+  @Deprecated('Use enclosingElement2 instead')
+  @override
+  CompilationUnitElement get enclosingElement;
+
+  @override
+  CompilationUnitElement get enclosingElement2;
+
+  @override
+  String get name;
+
+  /// Produces the type resulting from instantiating this typedef with the given
+  /// [typeArguments] and [nullabilitySuffix].
+  ///
+  /// Note that this always instantiates the typedef itself, so for a
+  /// [TypeAliasElement] 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,
+  });
+}
+
 /// An element that represents [GenericTypeAlias].
 ///
 /// Clients may not extend, implement or mix-in this class.
@@ -6808,6 +8967,37 @@
   }
 }
 
+/// An element that defines a type.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TypeDefiningElement implements Element {}
+
+/// A type parameter.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TypeParameterElement implements TypeDefiningElement {
+  /// The type representing the bound associated with this parameter, or `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
+  TypeParameterElement get declaration;
+
+  @override
+  String get displayName;
+
+  @override
+  String get name;
+
+  /// Creates the [TypeParameterType] with the given [nullabilitySuffix] for
+  /// this type parameter.
+  TypeParameterType instantiate({
+    required NullabilitySuffix nullabilitySuffix,
+  });
+}
+
 /// A concrete implementation of a [TypeParameterElement].
 class TypeParameterElementImpl extends ElementImpl
     implements TypeParameterElement {
@@ -6904,6 +9094,25 @@
   }
 }
 
+/// An element that has type parameters, such as a class or a typedef. This also
+/// includes functions and methods if support for generic methods is enabled.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TypeParameterizedElement implements _ExistingElement {
+  /// If the element defines a type, indicates whether the type may safely
+  /// appear without explicit type parameters as the bounds of a type parameter
+  /// declaration.
+  ///
+  /// If the element does not define a type, returns `true`.
+  bool get isSimplyBounded;
+
+  /// The type parameters declared by this element directly.
+  ///
+  /// This does not include type parameters that are declared by any enclosing
+  /// elements.
+  List<TypeParameterElement> get typeParameters;
+}
+
 /// Mixin representing an element which can have type parameters.
 mixin TypeParameterizedElementMixin
     implements _ExistingElementImpl, TypeParameterizedElement {
@@ -6924,6 +9133,30 @@
   }
 }
 
+/// A pseudo-elements that represents names that are undefined. 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 UndefinedElement implements Element {}
+
+/// An element included into a library using some URI.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class UriReferencedElement implements _ExistingElement {
+  /// The URI that is used to include this element into the enclosing library,
+  /// or `null` if this is the defining compilation unit of a library.
+  String? get uri;
+
+  /// The offset of the character immediately following the last character of
+  /// this node's URI, or `-1` for synthetic import.
+  int get uriEnd;
+
+  /// The offset of the URI in the file, or `-1` if this element is synthetic.
+  int get uriOffset;
+}
+
 /// A concrete implementation of a [UriReferencedElement].
 abstract class UriReferencedElementImpl extends _ExistingElementImpl
     implements UriReferencedElement {
@@ -6972,6 +9205,57 @@
   }
 }
 
+/// 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 VariableElement implements Element, ConstantEvaluationTarget {
+  @override
+  VariableElement get declaration;
+
+  /// 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.
+  ///
+  /// This will always return `false` unless the experiment 'non-nullable' is
+  /// enabled.
+  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;
+
+  @override
+  String get name;
+
+  /// The declared type of this variable.
+  DartType get type;
+
+  /// Returns a representation of the value of this variable, forcing the value
+  /// to be computed if it had not previously been computed, or `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();
+}
+
 /// A concrete implementation of a [VariableElement].
 abstract class VariableElementImpl extends ElementImpl
     implements VariableElement {
@@ -7089,6 +9373,22 @@
   DartObject? computeConstantValue() => null;
 }
 
+/// This class exists to provide non-nullable overrides for existing elements,
+/// as opposite to artificial "multiply defined" element.
+abstract class _ExistingElement implements Element {
+  @override
+  Element get declaration;
+
+  @override
+  LibraryElement get library;
+
+  @override
+  Source get librarySource;
+
+  @override
+  Source get source;
+}
+
 abstract class _ExistingElementImpl extends ElementImpl with _HasLibraryMixin {
   _ExistingElementImpl(super.name, super.offset, {super.reference});
 }
diff --git a/pkg/analyzer/lib/src/dart/element/extensions.dart b/pkg/analyzer/lib/src/dart/element/extensions.dart
index 725ef73..deafed3 100644
--- a/pkg/analyzer/lib/src/dart/element/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/element/extensions.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
diff --git a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
index 58b05f0..10946d8 100644
--- a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
+++ b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
@@ -13,7 +13,6 @@
         Expression,
         InvocationExpression,
         SimpleIdentifier;
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart' show ErrorReporter;
 import 'package:analyzer/src/dart/ast/extensions.dart';
diff --git a/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart b/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
index 16f5abc..35dc97e 100644
--- a/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
+++ b/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
@@ -4,7 +4,6 @@
 
 import 'dart:math' show max;
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/src/dart/element/normalize.dart b/pkg/analyzer/lib/src/dart/element/normalize.dart
index d924a44..20abd06 100644
--- a/pkg/analyzer/lib/src/dart/element/normalize.dart
+++ b/pkg/analyzer/lib/src/dart/element/normalize.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart b/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart
index 9956ee2..572b854 100644
--- a/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_visitor.dart';
diff --git a/pkg/analyzer/lib/src/dart/element/runtime_type_equality.dart b/pkg/analyzer/lib/src/dart/element/runtime_type_equality.dart
index 5364c58..f9a411f 100644
--- a/pkg/analyzer/lib/src/dart/element/runtime_type_equality.dart
+++ b/pkg/analyzer/lib/src/dart/element/runtime_type_equality.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_visitor.dart';
diff --git a/pkg/analyzer/lib/src/dart/element/scope.dart b/pkg/analyzer/lib/src/dart/element/scope.dart
index 7884ca1..ea97427 100644
--- a/pkg/analyzer/lib/src/dart/element/scope.dart
+++ b/pkg/analyzer/lib/src/dart/element/scope.dart
@@ -4,7 +4,6 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/string_canonicalizer.dart';
 import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/scope.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/summary2/combinator.dart';
diff --git a/pkg/analyzer/lib/src/dart/element/subtype.dart b/pkg/analyzer/lib/src/dart/element/subtype.dart
index 1138b13..2966484 100644
--- a/pkg/analyzer/lib/src/dart/element/subtype.dart
+++ b/pkg/analyzer/lib/src/dart/element/subtype.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/src/dart/element/top_merge.dart b/pkg/analyzer/lib/src/dart/element/top_merge.dart
index a0bf1fa..cef2c45 100644
--- a/pkg/analyzer/lib/src/dart/element/top_merge.dart
+++ b/pkg/analyzer/lib/src/dart/element/top_merge.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/src/dart/element/type_algebra.dart b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
index 96af702..4df9716 100644
--- a/pkg/analyzer/lib/src/dart/element/type_algebra.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_visitor.dart';
diff --git a/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart b/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart
index 95ecafd..fe35d2f 100644
--- a/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/src/dart/element/type_system.dart b/pkg/analyzer/lib/src/dart/element/type_system.dart
index bd98d34..904d6c8 100644
--- a/pkg/analyzer/lib/src/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_system.dart
@@ -6,7 +6,6 @@
 
 import 'package:analyzer/dart/ast/ast.dart' show AstNode;
 import 'package:analyzer/dart/ast/token.dart' show TokenType;
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
diff --git a/pkg/analyzer/lib/src/dart/micro/utils.dart b/pkg/analyzer/lib/src/dart/micro/utils.dart
index f6e6276..5792026 100644
--- a/pkg/analyzer/lib/src/dart/micro/utils.dart
+++ b/pkg/analyzer/lib/src/dart/micro/utils.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/element_locator.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart b/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart
index 26a1072..3a0f16d 100644
--- a/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/generic_inferrer.dart';
diff --git a/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart
index 6d6a55a..485cbfb 100644
--- a/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart
index 6b632a7..85181fe 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index 963cb13..8fe1b6f 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
diff --git a/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart
index bd00f85..60919e7 100644
--- a/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/scope.dart';
 import 'package:analyzer/dart/element/type.dart';
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
index f67112a..7940b51 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 01fe63a..03538df 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -7,7 +7,6 @@
 import 'package:_fe_analyzer_shared/src/type_inference/variable_bindings.dart';
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/scope.dart';
 import 'package:analyzer/dart/element/type.dart';
diff --git a/pkg/analyzer/lib/src/dart/resolver/scope.dart b/pkg/analyzer/lib/src/dart/resolver/scope.dart
index 06b8664..d5fb40e 100644
--- a/pkg/analyzer/lib/src/dart/resolver/scope.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/scope.dart
@@ -5,7 +5,6 @@
 import 'dart:collection';
 
 import 'package:_fe_analyzer_shared/src/scanner/string_canonicalizer.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
diff --git a/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart
index edc5496..4565f8c 100644
--- a/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
diff --git a/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart
index fc638df..f75cf2c 100644
--- a/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/diagnostic/diagnostic.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/src/dart/resolver/typed_literal_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/typed_literal_resolver.dart
index 80737f3..b92439f 100644
--- a/pkg/analyzer/lib/src/dart/resolver/typed_literal_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/typed_literal_resolver.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
diff --git a/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart
index 38e732e..c59a5d2 100644
--- a/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/src/dart/resolver/variance.dart b/pkg/analyzer/lib/src/dart/resolver/variance.dart
index b248774..492618d 100644
--- a/pkg/analyzer/lib/src/dart/resolver/variance.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/variance.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 
diff --git a/pkg/analyzer/lib/src/error/assignment_verifier.dart b/pkg/analyzer/lib/src/error/assignment_verifier.dart
index c0dd0c4..3a1bad3 100644
--- a/pkg/analyzer/lib/src/error/assignment_verifier.dart
+++ b/pkg/analyzer/lib/src/error/assignment_verifier.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/src/error/base_or_final_type_verifier.dart b/pkg/analyzer/lib/src/error/base_or_final_type_verifier.dart
index ca9b8dd..e022021 100644
--- a/pkg/analyzer/lib/src/error/base_or_final_type_verifier.dart
+++ b/pkg/analyzer/lib/src/error/base_or_final_type_verifier.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/diagnostic/diagnostic.dart';
 import 'package:analyzer/error/listener.dart';
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 3ade523..942a914 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
diff --git a/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart b/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart
index 13fe69c..0edcaf7 100644
--- a/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart
+++ b/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
diff --git a/pkg/analyzer/lib/src/error/correct_override.dart b/pkg/analyzer/lib/src/error/correct_override.dart
index c2e585c..7eea108 100644
--- a/pkg/analyzer/lib/src/error/correct_override.dart
+++ b/pkg/analyzer/lib/src/error/correct_override.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index d55559e..42a6239 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/error/error.dart';
diff --git a/pkg/analyzer/lib/src/error/must_call_super_verifier.dart b/pkg/analyzer/lib/src/error/must_call_super_verifier.dart
index 99eb9f6..df20490 100644
--- a/pkg/analyzer/lib/src/error/must_call_super_verifier.dart
+++ b/pkg/analyzer/lib/src/error/must_call_super_verifier.dart
@@ -5,7 +5,6 @@
 import 'dart:collection';
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/src/error/required_parameters_verifier.dart b/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
index 293a487..bffc29a 100644
--- a/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
+++ b/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
@@ -5,7 +5,6 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
index e61ae89..5b3abc2 100644
--- a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
+++ b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
@@ -7,7 +7,6 @@
 
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 59da727..7838f24 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
diff --git a/pkg/analyzer/lib/src/generated/element_type_provider.dart b/pkg/analyzer/lib/src/generated/element_type_provider.dart
index e2f076c..d024019 100644
--- a/pkg/analyzer/lib/src/generated/element_type_provider.dart
+++ b/pkg/analyzer/lib/src/generated/element_type_provider.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 
diff --git a/pkg/analyzer/lib/src/generated/element_walker.dart b/pkg/analyzer/lib/src/generated/element_walker.dart
index b636d2b..e54e863 100644
--- a/pkg/analyzer/lib/src/generated/element_walker.dart
+++ b/pkg/analyzer/lib/src/generated/element_walker.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 
 /// Keeps track of the set of non-synthetic child elements of an element,
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index af4f415..634086c 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
diff --git a/pkg/analyzer/lib/src/generated/exhaustiveness.dart b/pkg/analyzer/lib/src/generated/exhaustiveness.dart
index f46f80e..ae80e01 100644
--- a/pkg/analyzer/lib/src/generated/exhaustiveness.dart
+++ b/pkg/analyzer/lib/src/generated/exhaustiveness.dart
@@ -11,7 +11,6 @@
 import 'package:_fe_analyzer_shared/src/exhaustiveness/static_type.dart';
 import 'package:_fe_analyzer_shared/src/exhaustiveness/types.dart';
 import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
index 6965f6d..884a5c9 100644
--- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
@@ -5,7 +5,6 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index 63ec5ac..f0f8fe0 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index 8581316..9d3972f 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/constant/value.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/scope.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/dart/element/type_system.dart';
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index 79d3d6f..b049d6d 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -4,7 +4,6 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/string_canonicalizer.dart';
 import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
diff --git a/pkg/analyzer/lib/src/summary2/ast_resolver.dart b/pkg/analyzer/lib/src/summary2/ast_resolver.dart
index 5c834ca..8b38e9c 100644
--- a/pkg/analyzer/lib/src/summary2/ast_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_resolver.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/scope.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
diff --git a/pkg/analyzer/lib/src/summary2/default_types_builder.dart b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
index 06e5dcc..e08db44 100644
--- a/pkg/analyzer/lib/src/summary2/default_types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
diff --git a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
index 822bdf5..03f326f 100644
--- a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/scope.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
diff --git a/pkg/analyzer/lib/src/summary2/detach_nodes.dart b/pkg/analyzer/lib/src/summary2/detach_nodes.dart
index 6740020..9d2bbcc 100644
--- a/pkg/analyzer/lib/src/summary2/detach_nodes.dart
+++ b/pkg/analyzer/lib/src/summary2/detach_nodes.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 2a16066..ea2401f 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/invokes_super_self.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
diff --git a/pkg/analyzer/lib/src/summary2/function_type_builder.dart b/pkg/analyzer/lib/src/summary2/function_type_builder.dart
index 75afe66..d863f9c2 100644
--- a/pkg/analyzer/lib/src/summary2/function_type_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/function_type_builder.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_visitor.dart';
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart
index 0c1f5c7..c605b19 100644
--- a/pkg/analyzer/lib/src/summary2/informative_data.dart
+++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/source.dart';
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index 9a6e8a9..2c97171 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -5,7 +5,6 @@
 import 'package:_fe_analyzer_shared/src/field_promotability.dart';
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/analysis/utilities.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart' hide DirectiveUri;
 import 'package:analyzer/src/dart/analysis/file_state.dart' as file_state;
diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart
index 5d708f6..5c778e58 100644
--- a/pkg/analyzer/lib/src/summary2/link.dart
+++ b/pkg/analyzer/lib/src/summary2/link.dart
@@ -8,7 +8,6 @@
     as macro;
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/ast/ast.dart' as ast;
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index c4079ba..8fb3f70 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -4,7 +4,6 @@
 
 import 'dart:collection';
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/src/summary2/named_type_builder.dart b/pkg/analyzer/lib/src/summary2/named_type_builder.dart
index d7fa593..1075f68 100644
--- a/pkg/analyzer/lib/src/summary2/named_type_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/named_type_builder.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_visitor.dart';
diff --git a/pkg/analyzer/lib/src/summary2/reference_resolver.dart b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
index c2082fb..2fdcd67 100644
--- a/pkg/analyzer/lib/src/summary2/reference_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/scope.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
diff --git a/pkg/analyzer/lib/src/summary2/simply_bounded.dart b/pkg/analyzer/lib/src/summary2/simply_bounded.dart
index d8d2d69..ba164731 100644
--- a/pkg/analyzer/lib/src/summary2/simply_bounded.dart
+++ b/pkg/analyzer/lib/src/summary2/simply_bounded.dart
@@ -5,7 +5,6 @@
 import 'package:_fe_analyzer_shared/src/util/dependency_walker.dart' as graph
     show DependencyWalker, Node;
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/summary2/link.dart';
diff --git a/pkg/analyzer/lib/src/summary2/super_constructor_resolver.dart b/pkg/analyzer/lib/src/summary2/super_constructor_resolver.dart
index 694f27d..67ae677 100644
--- a/pkg/analyzer/lib/src/summary2/super_constructor_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/super_constructor_resolver.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/summary2/link.dart';
 import 'package:collection/collection.dart';
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index 099b9e3..e509285 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/scope.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
diff --git a/pkg/analyzer/lib/src/summary2/types_builder.dart b/pkg/analyzer/lib/src/summary2/types_builder.dart
index 9963a6e..16d24f6 100644
--- a/pkg/analyzer/lib/src/summary2/types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/types_builder.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
diff --git a/pkg/analyzer/lib/src/summary2/variance_builder.dart b/pkg/analyzer/lib/src/summary2/variance_builder.dart
index 4e84f44..d83f183 100644
--- a/pkg/analyzer/lib/src/summary2/variance_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/variance_builder.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
index 016f75d..3bc38b5 100644
--- a/pkg/analyzer/lib/src/task/strong_mode.dart
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
index 12da463..40f150c 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/source/line_info.dart';
diff --git a/pkg/analyzer/test/generated/constant_test.dart b/pkg/analyzer/test/generated/constant_test.dart
index 533f4ee..69cb644 100644
--- a/pkg/analyzer/test/generated/constant_test.dart
+++ b/pkg/analyzer/test/generated/constant_test.dart
@@ -6,7 +6,6 @@
 library analyzer.test.constant_test;
 
 import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
diff --git a/pkg/analyzer/test/generated/elements_types_mixin.dart b/pkg/analyzer/test/generated/elements_types_mixin.dart
index 8c058fc..b720f9d 100644
--- a/pkg/analyzer/test/generated/elements_types_mixin.dart
+++ b/pkg/analyzer/test/generated/elements_types_mixin.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 893110d..eb7c77f 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index 705e85e..a48a865 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/search.dart';
diff --git a/pkg/analyzer/test/src/dart/element/class_element_test.dart b/pkg/analyzer/test/src/dart/element/class_element_test.dart
index 7270987..c123f4d 100644
--- a/pkg/analyzer/test/src/dart/element/class_element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/class_element_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index d402755..a4fccd0 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/constant/value.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
diff --git a/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart b/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart
index a801642..7a74e20 100644
--- a/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart
+++ b/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/least_upper_bound.dart';
diff --git a/pkg/analyzer/test/src/dart/resolution/constant_test.dart b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
index bfcf3ee..20335bb 100644
--- a/pkg/analyzer/test/src/dart/resolution/constant_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/error/codes.dart';
diff --git a/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart b/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
index abb3692..0b9fa8c 100644
--- a/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 26bcd8d..53d699c 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/constant/value.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/error/error.dart';
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index cb3db06..f5ecefa 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/summary2/export.dart';
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart
index eaaed1a..26fcd0b 100644
--- a/pkg/analyzer/test/src/summary/elements_test.dart
+++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
diff --git a/pkg/analyzer/test/src/summary/macro_test.dart b/pkg/analyzer/test/src/summary/macro_test.dart
index 3522cee..acb6bf4 100644
--- a/pkg/analyzer/test/src/summary/macro_test.dart
+++ b/pkg/analyzer/test/src/summary/macro_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/summary2/macro_application_error.dart';
 import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
diff --git a/pkg/analyzer/test/util/element_printer.dart b/pkg/analyzer/test/util/element_printer.dart
index f58b3c9..34a1dab 100644
--- a/pkg/analyzer/test/util/element_printer.dart
+++ b/pkg/analyzer/test/util/element_printer.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
index 691b013..7de2236 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
@@ -4,7 +4,6 @@
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
diff --git a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
index 891b0a5fa..8c31d29 100644
--- a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
diff --git a/pkg/nnbd_migration/lib/src/decorated_type.dart b/pkg/nnbd_migration/lib/src/decorated_type.dart
index 9881c55..f558136 100644
--- a/pkg/nnbd_migration/lib/src/decorated_type.dart
+++ b/pkg/nnbd_migration/lib/src/decorated_type.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index 47d5be6..97d3836 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -6,7 +6,6 @@
 import 'package:_fe_analyzer_shared/src/type_inference/assigned_variables.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
index 2cbad61..281fc3a 100644
--- a/pkg/nnbd_migration/lib/src/fix_builder.dart
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
diff --git a/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart b/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
index 905cb58..511f80b 100644
--- a/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
+++ b/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
diff --git a/pkg/nnbd_migration/lib/src/variables.dart b/pkg/nnbd_migration/lib/src/variables.dart
index 3d073db..581e494 100644
--- a/pkg/nnbd_migration/lib/src/variables.dart
+++ b/pkg/nnbd_migration/lib/src/variables.dart
@@ -5,7 +5,6 @@
 import 'dart:math' as math;
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
diff --git a/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart b/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
index c599e9b..d680106 100644
--- a/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
+++ b/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
diff --git a/pkg/nnbd_migration/test/edge_builder_test.dart b/pkg/nnbd_migration/test/edge_builder_test.dart
index 472b416..75ade3c 100644
--- a/pkg/nnbd_migration/test/edge_builder_test.dart
+++ b/pkg/nnbd_migration/test/edge_builder_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
diff --git a/pkg/nnbd_migration/test/migration_visitor_test_base.dart b/pkg/nnbd_migration/test/migration_visitor_test_base.dart
index 4977171..6f49b88 100644
--- a/pkg/nnbd_migration/test/migration_visitor_test_base.dart
+++ b/pkg/nnbd_migration/test/migration_visitor_test_base.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/element.dart';
