Elements. Add Element2.fragments

Change-Id: I85fb19c87b833abca99cb86c4e285d9120f96ac2
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/403948
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart b/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart
index 4a991a7..0634151 100644
--- a/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart
+++ b/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart
@@ -5,7 +5,6 @@
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/element/element2.dart';
-import 'package:analyzer/src/utilities/extensions/element.dart';
 
 class ImplementedComputer {
   final SearchEngine searchEngine;
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
index db25375..740f61f 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
@@ -15,7 +15,6 @@
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/util/performance/operation_performance.dart';
-import 'package:analyzer/src/utilities/extensions/element.dart';
 
 typedef StaticOptions = Either2<bool, ReferenceOptions>;
 
diff --git a/pkg/analyzer/lib/dart/element/element2.dart b/pkg/analyzer/lib/dart/element/element2.dart
index 7c4c221..3f36d78 100644
--- a/pkg/analyzer/lib/dart/element/element2.dart
+++ b/pkg/analyzer/lib/dart/element/element2.dart
@@ -111,6 +111,9 @@
 abstract class BindPatternVariableElement2 implements PatternVariableElement2 {
   @override
   BindPatternVariableFragment get firstFragment;
+
+  @override
+  List<BindPatternVariableFragment> get fragments;
 }
 
 /// The portion of a [BindPatternVariableElement2] contributed by a single
@@ -138,6 +141,9 @@
   @override
   ClassFragment get firstFragment;
 
+  @override
+  List<ClassFragment> get fragments;
+
   /// Whether the class or its superclass declares a non-final instance field.
   bool get hasNonFinalField;
 
@@ -267,6 +273,9 @@
   @override
   ConstructorFragment get firstFragment;
 
+  @override
+  List<ConstructorFragment> get fragments;
+
   /// Whether the constructor is a const constructor.
   bool get isConst;
 
@@ -406,6 +415,9 @@
   /// invocations of [Fragment.nextFragment].
   Fragment get firstFragment;
 
+  /// The fragments this element consists of.
+  List<Fragment> get fragments;
+
   /// The unique integer identifier of this element.
   int get id;
 
@@ -608,6 +620,9 @@
 
   @override
   EnumFragment get firstFragment;
+
+  @override
+  List<EnumFragment> get fragments;
 }
 
 /// The portion of an [EnumElement2] contributed by a single declaration.
@@ -638,6 +653,9 @@
   @override
   ExecutableFragment get firstFragment;
 
+  @override
+  List<ExecutableFragment> get fragments;
+
   /// Whether the executable element did not have an explicit return type
   /// specified for it in the original source.
   bool get hasImplicitReturnType;
@@ -712,6 +730,9 @@
 
   @override
   ExtensionFragment get firstFragment;
+
+  @override
+  List<ExtensionFragment> get fragments;
 }
 
 /// The portion of an [ExtensionElement2] contributed by a single
@@ -736,6 +757,9 @@
   @override
   ExtensionTypeFragment get firstFragment;
 
+  @override
+  List<ExtensionTypeFragment> get fragments;
+
   /// The primary constructor of this extension.
   ConstructorElement2 get primaryConstructor2;
 
@@ -781,6 +805,9 @@
   @override
   FieldFragment get firstFragment;
 
+  @override
+  List<FieldFragment> get fragments;
+
   /// Whether the field is abstract.
   ///
   /// Executable fields are abstract if they are declared with the `abstract`
@@ -811,6 +838,9 @@
 
   @override
   FieldFormalParameterFragment get firstFragment;
+
+  @override
+  List<FieldFormalParameterFragment> get fragments;
 }
 
 /// The portion of a [FieldFormalParameterElement2] contributed by a single
@@ -868,6 +898,9 @@
   /// formal parameter.
   List<FormalParameterElement> get formalParameters;
 
+  @override
+  List<FormalParameterFragment> get fragments;
+
   /// Whether the parameter has a default value.
   bool get hasDefaultValue;
 
@@ -1051,6 +1084,9 @@
   /// The formal parameters defined by this element.
   List<FormalParameterElement> get formalParameters;
 
+  @override
+  List<FunctionTypedFragment> get fragments;
+
   /// The return type defined by this element.
   DartType get returnType;
 
@@ -1081,6 +1117,9 @@
 abstract class GenericFunctionTypeElement2 implements FunctionTypedElement2 {
   @override
   GenericFunctionTypeFragment get firstFragment;
+
+  @override
+  List<GenericFunctionTypeFragment> get fragments;
 }
 
 /// The portion of a [GenericFunctionTypeElement2] coming from a single
@@ -1117,6 +1156,9 @@
 
   @override
   GetterFragment get firstFragment;
+
+  @override
+  List<GetterFragment> get fragments;
 }
 
 /// The portion of a [GetterElement] contributed by a single declaration.
@@ -1183,6 +1225,9 @@
   @override
   InstanceFragment get firstFragment;
 
+  @override
+  List<InstanceFragment> get fragments;
+
   /// The getters declared in this element.
   List<GetterElement> get getters2;
 
@@ -1297,6 +1342,9 @@
   @override
   InterfaceFragment get firstFragment;
 
+  @override
+  List<InterfaceFragment> get fragments;
+
   /// The interfaces that are implemented by this class.
   ///
   /// <b>Note:</b> Because the element model represents the state of the code,
@@ -1437,6 +1485,9 @@
   @override
   JoinPatternVariableFragment get firstFragment;
 
+  @override
+  List<JoinPatternVariableFragment> get fragments;
+
   /// Whether the [variables2] are consistent.
   ///
   /// The variables are consistent if they are present in all branches, and have
@@ -1483,6 +1534,9 @@
   LabelFragment get firstFragment;
 
   @override
+  List<LabelFragment> get fragments;
+
+  @override
   LibraryElement2 get library2;
 }
 
@@ -1562,6 +1616,7 @@
   ///
   /// This includes the defining fragment, and fragments included using the
   /// `part` directive.
+  @override
   List<LibraryFragment> get fragments;
 
   /// The getters defined in this library.
@@ -1826,6 +1881,9 @@
     implements ExecutableElement2, LocalElement2 {
   @override
   LocalFunctionFragment get firstFragment;
+
+  @override
+  List<LocalFunctionFragment> get fragments;
 }
 
 /// The portion of a [LocalFunctionElement] contributed by a single
@@ -1864,6 +1922,9 @@
   @override
   LocalVariableFragment get firstFragment;
 
+  @override
+  List<LocalVariableFragment> get fragments;
+
   /// Whether the variable has an initializer at declaration.
   bool get hasInitializer;
 }
@@ -2012,6 +2073,9 @@
   @override
   MethodFragment get firstFragment;
 
+  @override
+  List<MethodFragment> get fragments;
+
   /// Whether the method defines an operator.
   ///
   /// The test might be based on the name of the executable element, in which
@@ -2043,6 +2107,9 @@
   @override
   MixinFragment get firstFragment;
 
+  @override
+  List<MixinFragment> get fragments;
+
   /// Whether the mixin is a base mixin.
   ///
   /// A mixin is a base mixin if it has an explicit `base` modifier.
@@ -2105,6 +2172,9 @@
 
   @override
   MultiplyDefinedFragment get firstFragment;
+
+  @override
+  List<MultiplyDefinedFragment> get fragments;
 }
 
 /// The fragment for a [MultiplyDefinedElement2].
@@ -2139,6 +2209,9 @@
   @override
   PatternVariableFragment get firstFragment;
 
+  @override
+  List<PatternVariableFragment> get fragments;
+
   /// The variable in which this variable joins with other pattern variables
   /// with the same name, in a logical-or pattern, or shared case scope.
   JoinPatternVariableElement2? get join2;
@@ -2175,6 +2248,9 @@
   @override
   PrefixFragment get firstFragment;
 
+  @override
+  List<PrefixFragment> get fragments;
+
   /// The imports that share this prefix.
   List<LibraryImport> get imports;
 
@@ -2216,6 +2292,9 @@
 abstract class PromotableElement2 implements VariableElement2 {
   @override
   PromotableFragment get firstFragment;
+
+  @override
+  List<PromotableFragment> get fragments;
 }
 
 /// The portion of a [PromotableElement2] contributed by a single declaration.
@@ -2246,6 +2325,9 @@
   @override
   PropertyAccessorFragment get firstFragment;
 
+  @override
+  List<PropertyAccessorFragment> get fragments;
+
   /// The field or top-level variable associated with this getter.
   ///
   /// If this getter was explicitly defined (is not synthetic) then the variable
@@ -2295,6 +2377,9 @@
   @override
   PropertyInducingFragment get firstFragment;
 
+  @override
+  List<PropertyInducingFragment> get fragments;
+
   /// The getter associated with this variable.
   ///
   /// If this variable was explicitly defined (is not synthetic) then the
@@ -2389,6 +2474,9 @@
 
   @override
   SetterFragment get firstFragment;
+
+  @override
+  List<SetterFragment> get fragments;
 }
 
 /// The portion of a [SetterElement] contributed by a single declaration.
@@ -2426,6 +2514,9 @@
   @override
   SuperFormalParameterFragment get firstFragment;
 
+  @override
+  List<SuperFormalParameterFragment> get fragments;
+
   /// The associated super-constructor parameter, from the super-constructor
   /// that is referenced by the implicit or explicit super-constructor
   /// invocation.
@@ -2461,6 +2552,9 @@
   @override
   TopLevelFunctionFragment get firstFragment;
 
+  @override
+  List<TopLevelFunctionFragment> get fragments;
+
   /// Whether the function represents `identical` from the `dart:core` library.
   bool get isDartCoreIdentical;
 
@@ -2504,6 +2598,9 @@
   @override
   TopLevelVariableFragment get firstFragment;
 
+  @override
+  List<TopLevelVariableFragment> get fragments;
+
   /// Whether the field was explicitly marked as being external.
   bool get isExternal;
 }
@@ -2550,6 +2647,9 @@
   @override
   TypeAliasFragment get firstFragment;
 
+  @override
+  List<TypeAliasFragment> get fragments;
+
   /// Returns the type resulting from instantiating this typedef with the given
   /// [typeArguments] and [nullabilitySuffix].
   ///
@@ -2593,6 +2693,9 @@
 
   @override
   TypeDefiningFragment get firstFragment;
+
+  @override
+  List<TypeDefiningFragment> get fragments;
 }
 
 /// The portion of a [TypeDefiningElement2] contributed by a single declaration.
@@ -2626,6 +2729,9 @@
   @override
   TypeParameterFragment get firstFragment;
 
+  @override
+  List<TypeParameterFragment> get fragments;
+
   /// Returns the [TypeParameterType] with the given [nullabilitySuffix] for
   /// this type parameter.
   TypeParameterType instantiate({
@@ -2655,6 +2761,9 @@
   @override
   TypeParameterizedFragment get firstFragment;
 
+  @override
+  List<TypeParameterizedFragment> get fragments;
+
   /// If the element defines a type, indicates whether the type may safely
   /// appear without explicit type arguments as the bounds of a type parameter
   /// declaration.
@@ -2702,6 +2811,9 @@
   @override
   VariableFragment get firstFragment;
 
+  @override
+  List<VariableFragment> get fragments;
+
   /// Whether the variable element did not have an explicit type specified
   /// for it.
   bool get hasImplicitType;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 2a3a504..1b1a08c 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -127,12 +127,12 @@
       super.element as BindPatternVariableElementImpl2;
 
   @override
-  BindPatternVariableFragment? get nextFragment =>
-      super.nextFragment as BindPatternVariableFragment?;
+  BindPatternVariableElementImpl? get nextFragment =>
+      super.nextFragment as BindPatternVariableElementImpl?;
 
   @override
-  BindPatternVariableFragment? get previousFragment =>
-      super.previousFragment as BindPatternVariableFragment?;
+  BindPatternVariableElementImpl? get previousFragment =>
+      super.previousFragment as BindPatternVariableElementImpl?;
 }
 
 class BindPatternVariableElementImpl2 extends PatternVariableElementImpl2
@@ -140,8 +140,18 @@
   BindPatternVariableElementImpl2(super._wrappedElement);
 
   @override
-  BindPatternVariableFragment get firstFragment =>
-      super.firstFragment as BindPatternVariableFragment;
+  BindPatternVariableElementImpl get firstFragment =>
+      super.firstFragment as BindPatternVariableElementImpl;
+
+  @override
+  List<BindPatternVariableElementImpl> get fragments {
+    return [
+      for (BindPatternVariableElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
 
   /// This flag is set to `true` if this variable clashes with another
   /// pattern variable with the same name within the same pattern.
@@ -654,6 +664,16 @@
   }
 
   @override
+  List<ClassElementImpl> get fragments {
+    return [
+      for (ClassElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   bool get hasNonFinalField => firstFragment.hasNonFinalField;
 
   @override
@@ -1520,7 +1540,7 @@
   }
 
   @override
-  ConstructorFragment? get nextFragment => augmentation;
+  ConstructorElementImpl? get nextFragment => augmentation;
 
   @override
   Element get nonSynthetic {
@@ -1625,7 +1645,7 @@
     ConstructorElementImpl? fragment = firstFragment;
     while (fragment != null) {
       fragment.element = this;
-      fragment = fragment.nextFragment as ConstructorElementImpl?;
+      fragment = fragment.nextFragment;
     }
   }
 
@@ -1648,6 +1668,16 @@
       firstFragment.enclosingElement3.element;
 
   @override
+  List<ConstructorElementImpl> get fragments {
+    return [
+      for (ConstructorElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   bool get isConst => firstFragment.isConst;
 
   @override
@@ -2068,6 +2098,16 @@
   DynamicElementImpl get firstFragment => DynamicElementImpl.instance;
 
   @override
+  List<DynamicElementImpl> get fragments {
+    return [
+      for (DynamicElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   bool get isSynthetic => true;
 
   @override
@@ -2615,6 +2655,16 @@
   }
 
   @override
+  List<Fragment> get fragments {
+    return [
+      for (Fragment? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   bool get hasAlwaysThrows {
     var metadata = this.metadata;
     for (var i = 0; i < metadata.length; i++) {
@@ -3312,6 +3362,16 @@
   // TODO(augmentations): implement enclosingElement2
   Element2? get enclosingElement2 => throw UnimplementedError();
 
+  @override
+  List<Fragment> get fragments {
+    return [
+      for (Fragment? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
   /// Return an identifier that uniquely identifies this element among the
   /// children of this element's parent.
   String get identifier {
@@ -3587,10 +3647,11 @@
   ElementKind get kind => ElementKind.ENUM;
 
   @override
-  EnumFragment? get nextFragment => super.nextFragment as EnumFragment?;
+  EnumElementImpl? get nextFragment => super.nextFragment as EnumElementImpl?;
 
   @override
-  EnumFragment? get previousFragment => super.previousFragment as EnumFragment?;
+  EnumElementImpl? get previousFragment =>
+      super.previousFragment as EnumElementImpl?;
 
   ConstFieldElementImpl? get valuesField {
     for (var field in fields) {
@@ -3637,6 +3698,16 @@
       constants.map((e) => e.asElement2).toList();
 
   @override
+  List<EnumElementImpl> get fragments {
+    return [
+      for (EnumElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   T? accept2<T>(ElementVisitor2<T> visitor) {
     return visitor.visitEnumElement(this);
   }
@@ -3935,12 +4006,12 @@
   }
 
   @override
-  ExtensionFragment? get nextFragment =>
-      super.nextFragment as ExtensionFragment?;
+  ExtensionElementImpl? get nextFragment =>
+      super.nextFragment as ExtensionElementImpl?;
 
   @override
-  ExtensionFragment? get previousFragment =>
-      super.previousFragment as ExtensionFragment?;
+  ExtensionElementImpl? get previousFragment =>
+      super.previousFragment as ExtensionElementImpl?;
 
   @override
   DartType get thisType => extendedType;
@@ -4012,6 +4083,16 @@
   }
 
   @override
+  List<ExtensionElementImpl> get fragments {
+    return [
+      for (ExtensionElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   DartType get thisType => extendedType;
 
   @override
@@ -4057,12 +4138,12 @@
   }
 
   @override
-  ExtensionTypeFragment? get nextFragment =>
-      super.nextFragment as ExtensionTypeFragment?;
+  ExtensionTypeElementImpl? get nextFragment =>
+      super.nextFragment as ExtensionTypeElementImpl?;
 
   @override
-  ExtensionTypeFragment? get previousFragment =>
-      super.previousFragment as ExtensionTypeFragment?;
+  ExtensionTypeElementImpl? get previousFragment =>
+      super.previousFragment as ExtensionTypeElementImpl?;
 
   @override
   ConstructorElementImpl get primaryConstructor {
@@ -4120,6 +4201,16 @@
   }
 
   @override
+  List<ExtensionTypeElementImpl> get fragments {
+    return [
+      for (ExtensionTypeElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   ConstructorElement2 get primaryConstructor2 => primaryConstructor.element;
 
   @override
@@ -4234,11 +4325,11 @@
   }
 
   @override
-  FieldFragment? get nextFragment => super.nextFragment as FieldFragment?;
+  FieldElementImpl? get nextFragment => super.nextFragment as FieldElementImpl?;
 
   @override
-  FieldFragment? get previousFragment =>
-      super.previousFragment as FieldFragment?;
+  FieldElementImpl? get previousFragment =>
+      super.previousFragment as FieldElementImpl?;
 
   @override
   T? accept<T>(ElementVisitor<T> visitor) => visitor.visitFieldElement(this);
@@ -4257,7 +4348,7 @@
     FieldElementImpl? fragment = firstFragment;
     while (fragment != null) {
       fragment.element = this;
-      fragment = fragment.nextFragment as FieldElementImpl?;
+      fragment = fragment.nextFragment;
     }
   }
 
@@ -4269,6 +4360,16 @@
       (firstFragment._enclosingElement3 as InstanceFragment).element;
 
   @override
+  List<FieldElementImpl> get fragments {
+    return [
+      for (FieldElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   GetterElement? get getter2 => firstFragment.getter?.element as GetterElement?;
 
   @override
@@ -4359,12 +4460,12 @@
   bool get isInitializingFormal => true;
 
   @override
-  FieldFormalParameterFragment? get nextFragment =>
-      super.nextFragment as FieldFormalParameterFragment?;
+  FieldFormalParameterElementImpl? get nextFragment =>
+      super.nextFragment as FieldFormalParameterElementImpl?;
 
   @override
-  FieldFormalParameterFragment? get previousFragment =>
-      super.previousFragment as FieldFormalParameterFragment?;
+  FieldFormalParameterElementImpl? get previousFragment =>
+      super.previousFragment as FieldFormalParameterElementImpl?;
 
   @override
   T? accept<T>(ElementVisitor<T> visitor) =>
@@ -4387,8 +4488,18 @@
       };
 
   @override
-  FieldFormalParameterFragment get firstFragment =>
-      super.firstFragment as FieldFormalParameterFragment;
+  FieldFormalParameterElementImpl get firstFragment =>
+      super.firstFragment as FieldFormalParameterElementImpl;
+
+  @override
+  List<FieldFormalParameterElementImpl> get fragments {
+    return [
+      for (FieldFormalParameterElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
 }
 
 class FormalParameterElementImpl extends PromotableElementImpl2
@@ -4405,7 +4516,7 @@
     ParameterElementImpl? fragment = wrappedElement;
     while (fragment != null) {
       fragment.element = this;
-      fragment = fragment.nextFragment as ParameterElementImpl?;
+      fragment = fragment.nextFragment;
     }
   }
 
@@ -4417,8 +4528,7 @@
   String? get defaultValueCode => wrappedElement.defaultValueCode;
 
   @override
-  FormalParameterFragment get firstFragment =>
-      wrappedElement as FormalParameterFragment;
+  ParameterElementImpl get firstFragment => wrappedElement;
 
   @override
   // TODO(augmentations): Implement the merge of formal parameters.
@@ -4427,6 +4537,16 @@
       .toList();
 
   @override
+  List<ParameterElementImpl> get fragments {
+    return [
+      for (ParameterElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   // TODO(augmentations): Implement the merge of formal parameters.
   bool get hasDefaultValue => wrappedElement.hasDefaultValue;
 
@@ -5100,10 +5220,10 @@
   ElementKind get kind => ElementKind.FUNCTION;
 
   @override
-  ExecutableFragment? get nextFragment => augmentation;
+  FunctionElementImpl? get nextFragment => augmentation;
 
   @override
-  ExecutableFragment? get previousFragment => augmentationTarget;
+  FunctionElementImpl? get previousFragment => augmentationTarget;
 
   @override
   bool get _includeNameOffsetInIdentifier {
@@ -5203,7 +5323,7 @@
   int? get nameOffset2 => null;
 
   @override
-  GenericFunctionTypeFragment? get nextFragment => null;
+  GenericFunctionTypeElementImpl? get nextFragment => null;
 
   @override
   List<ParameterElement> get parameters {
@@ -5220,7 +5340,7 @@
   }
 
   @override
-  GenericFunctionTypeFragment? get previousFragment => null;
+  GenericFunctionTypeElementImpl? get previousFragment => null;
 
   @override
   DartType get returnType {
@@ -5277,7 +5397,7 @@
   String? get documentationComment => _wrappedElement.documentationComment;
 
   @override
-  GenericFunctionTypeFragment get firstFragment => _wrappedElement;
+  GenericFunctionTypeElementImpl get firstFragment => _wrappedElement;
 
   @override
   List<FormalParameterElement> get formalParameters =>
@@ -5286,6 +5406,16 @@
           .toList();
 
   @override
+  List<GenericFunctionTypeElementImpl> get fragments {
+    return [
+      for (GenericFunctionTypeElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   bool get isSimplyBounded => _wrappedElement.isSimplyBounded;
 
   @override
@@ -5337,7 +5467,7 @@
     PropertyAccessorElementImpl? fragment = firstFragment;
     while (fragment != null) {
       fragment.element = this;
-      fragment = fragment.nextFragment as PropertyAccessorElementImpl?;
+      fragment = fragment.nextFragment;
     }
   }
 
@@ -5349,6 +5479,16 @@
       firstFragment.correspondingSetter2?.element as SetterElement?;
 
   @override
+  List<PropertyAccessorElementImpl> get fragments {
+    return [
+      for (PropertyAccessorElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   ElementKind get kind => ElementKind.GETTER;
 
   @override
@@ -6580,12 +6720,12 @@
   }
 
   @override
-  JoinPatternVariableFragment? get nextFragment =>
-      super.nextFragment as JoinPatternVariableFragment?;
+  JoinPatternVariableElementImpl? get nextFragment =>
+      super.nextFragment as JoinPatternVariableElementImpl?;
 
   @override
-  JoinPatternVariableFragment? get previousFragment =>
-      super.previousFragment as JoinPatternVariableFragment?;
+  JoinPatternVariableElementImpl? get previousFragment =>
+      super.previousFragment as JoinPatternVariableElementImpl?;
 
   /// Returns this variable, and variables that join into it.
   List<PatternVariableElementImpl> get transitiveVariables {
@@ -6614,8 +6754,18 @@
   JoinPatternVariableElementImpl2(super._wrappedElement);
 
   @override
-  JoinPatternVariableFragment get firstFragment =>
-      super.firstFragment as JoinPatternVariableFragment;
+  JoinPatternVariableElementImpl get firstFragment =>
+      super.firstFragment as JoinPatternVariableElementImpl;
+
+  @override
+  List<JoinPatternVariableElementImpl> get fragments {
+    return [
+      for (JoinPatternVariableElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
 
   shared.JoinedPatternVariableInconsistency get inconsistency =>
       _wrappedElement.inconsistency;
@@ -6705,10 +6855,10 @@
   int? get nameOffset2 => nameOffset;
 
   @override
-  LabelFragment? get nextFragment => null;
+  LabelElementImpl? get nextFragment => null;
 
   @override
-  LabelFragment? get previousFragment => null;
+  LabelElementImpl? get previousFragment => null;
 
   @override
   T? accept<T>(ElementVisitor<T> visitor) => visitor.visitLabelElement(this);
@@ -6729,7 +6879,12 @@
   ExecutableElement2? get enclosingElement2 => null;
 
   @override
-  LabelFragment get firstFragment => _wrappedElement;
+  LabelElementImpl get firstFragment => _wrappedElement;
+
+  @override
+  List<LabelElementImpl> get fragments {
+    return [firstFragment];
+  }
 
   @override
   LibraryElement2 get library2 {
@@ -7468,6 +7623,16 @@
           .toList();
 
   @override
+  List<FunctionElementImpl> get fragments {
+    return [
+      for (FunctionElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   bool get hasImplicitReturnType => _wrappedElement.hasImplicitReturnType;
 
   @override
@@ -7569,10 +7734,10 @@
   int? get nameOffset2 => nameOffset;
 
   @override
-  LocalVariableFragment? get nextFragment => null;
+  LocalVariableElementImpl? get nextFragment => null;
 
   @override
-  LocalVariableFragment? get previousFragment => null;
+  LocalVariableElementImpl? get previousFragment => null;
 
   @override
   T? accept<T>(ElementVisitor<T> visitor) =>
@@ -7594,7 +7759,12 @@
   String? get documentationComment => null;
 
   @override
-  LocalVariableFragment get firstFragment => _wrappedElement;
+  LocalVariableElementImpl get firstFragment => _wrappedElement;
+
+  @override
+  List<LocalVariableElementImpl> get fragments {
+    return [firstFragment];
+  }
 
   @override
   bool get hasImplicitType => _wrappedElement.hasImplicitType;
@@ -8119,7 +8289,7 @@
   }
 
   @override
-  MethodFragment? get nextFragment => augmentation;
+  MethodElementImpl? get nextFragment => augmentation;
 
   @override
   Element get nonSynthetic {
@@ -8130,7 +8300,7 @@
   }
 
   @override
-  MethodFragment? get previousFragment => augmentationTarget;
+  MethodElementImpl? get previousFragment => augmentationTarget;
 
   @override
   T? accept<T>(ElementVisitor<T> visitor) => visitor.visitMethodElement(this);
@@ -8167,6 +8337,16 @@
       (firstFragment._enclosingElement3 as InstanceFragment).element;
 
   @override
+  List<MethodElementImpl> get fragments {
+    return [
+      for (MethodElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   bool get isOperator => firstFragment.isOperator;
 
   @override
@@ -8241,11 +8421,11 @@
   }
 
   @override
-  MixinFragment? get nextFragment => super.nextFragment as MixinFragment?;
+  MixinElementImpl? get nextFragment => super.nextFragment as MixinElementImpl?;
 
   @override
-  MixinFragment? get previousFragment =>
-      super.previousFragment as MixinFragment?;
+  MixinElementImpl? get previousFragment =>
+      super.previousFragment as MixinElementImpl?;
 
   @override
   List<InterfaceType> get superclassConstraints {
@@ -8301,6 +8481,16 @@
   }
 
   @override
+  List<MixinElementImpl> get fragments {
+    return [
+      for (MixinElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   bool get isBase => firstFragment.isBase;
 
   @override
@@ -8714,7 +8904,8 @@
   final List<Element2> conflictingElements2;
 
   @override
-  late final firstFragment = MultiplyDefinedFragmentImpl(this);
+  late final MultiplyDefinedFragmentImpl firstFragment =
+      MultiplyDefinedFragmentImpl(this);
 
   MultiplyDefinedElementImpl2(
     this.libraryFragment,
@@ -8743,6 +8934,11 @@
   Null get enclosingElement2 => null;
 
   @override
+  List<MultiplyDefinedFragmentImpl> get fragments {
+    return [firstFragment];
+  }
+
+  @override
   bool get isPrivate => false;
 
   @override
@@ -8946,6 +9142,11 @@
   NeverElementImpl get firstFragment => NeverElementImpl.instance;
 
   @override
+  List<NeverElementImpl> get fragments {
+    return [firstFragment];
+  }
+
+  @override
   bool get isSynthetic => true;
 
   @override
@@ -9136,7 +9337,7 @@
 
   @override
   // TODO(augmentations): Support chaining between the fragments.
-  FormalParameterFragment? get nextFragment => null;
+  ParameterElementImpl? get nextFragment => null;
 
   @override
   List<ParameterElement> get parameters {
@@ -9154,7 +9355,7 @@
 
   @override
   // TODO(augmentations): Support chaining between the fragments.
-  FormalParameterFragment? get previousFragment => null;
+  ParameterElementImpl? get previousFragment => null;
 
   @override
   List<TypeParameterElement> get typeParameters {
@@ -9365,12 +9566,12 @@
   JoinPatternVariableFragment? get join2 => join;
 
   @override
-  PatternVariableFragment? get nextFragment =>
-      super.nextFragment as PatternVariableFragment?;
+  PatternVariableElementImpl? get nextFragment =>
+      super.nextFragment as PatternVariableElementImpl?;
 
   @override
-  PatternVariableFragment? get previousFragment =>
-      super.previousFragment as PatternVariableFragment?;
+  PatternVariableElementImpl? get previousFragment =>
+      super.previousFragment as PatternVariableElementImpl?;
 
   /// Return the root [join], or self.
   PatternVariableElementImpl get rootVariable {
@@ -9383,8 +9584,18 @@
   PatternVariableElementImpl2(super._wrappedElement);
 
   @override
-  PatternVariableFragment get firstFragment =>
-      super.firstFragment as PatternVariableFragment;
+  PatternVariableElementImpl get firstFragment =>
+      super.firstFragment as PatternVariableElementImpl;
+
+  @override
+  List<PatternVariableElementImpl> get fragments {
+    return [
+      for (PatternVariableElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
 
   /// This flag is set to `true` while we are visiting the [WhenClause] of
   /// the [GuardedPattern] that declares this variable.
@@ -9500,6 +9711,7 @@
   @override
   Null get enclosingElement2 => null;
 
+  @override
   List<PrefixFragmentImpl> get fragments {
     return [
       for (PrefixFragmentImpl? fragment = firstFragment;
@@ -9690,7 +9902,7 @@
     PropertyAccessorElementImpl firstFragment = this;
     var previousFragment = firstFragment.previousFragment;
     while (previousFragment != null) {
-      firstFragment = previousFragment as PropertyAccessorElementImpl;
+      firstFragment = previousFragment;
       previousFragment = firstFragment.previousFragment;
     }
     // As a side-effect of creating the element, all of the fragments in the
@@ -9770,10 +9982,10 @@
   }
 
   @override
-  PropertyAccessorFragment? get nextFragment => augmentation;
+  PropertyAccessorElementImpl? get nextFragment => augmentation;
 
   @override
-  PropertyAccessorFragment? get previousFragment => augmentationTarget;
+  PropertyAccessorElementImpl? get previousFragment => augmentationTarget;
 
   @override
   PropertyInducingElementImpl? get variable2 {
@@ -10185,7 +10397,7 @@
     PropertyAccessorElementImpl? fragment = firstFragment;
     while (fragment != null) {
       fragment.element = this;
-      fragment = fragment.nextFragment as PropertyAccessorElementImpl?;
+      fragment = fragment.nextFragment;
     }
   }
 
@@ -10200,6 +10412,16 @@
   Element2? get enclosingElement2 => firstFragment.enclosingFragment?.element;
 
   @override
+  List<PropertyAccessorElementImpl> get fragments {
+    return [
+      for (PropertyAccessorElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   ElementKind get kind => ElementKind.SETTER;
 
   @override
@@ -10283,12 +10505,12 @@
   bool get isSuperFormal => true;
 
   @override
-  SuperFormalParameterFragment? get nextFragment =>
-      super.nextFragment as SuperFormalParameterFragment?;
+  SuperFormalParameterElementImpl? get nextFragment =>
+      super.nextFragment as SuperFormalParameterElementImpl?;
 
   @override
-  SuperFormalParameterFragment? get previousFragment =>
-      super.previousFragment as SuperFormalParameterFragment?;
+  SuperFormalParameterElementImpl? get previousFragment =>
+      super.previousFragment as SuperFormalParameterElementImpl?;
 
   @override
   ParameterElement? get superConstructorParameter {
@@ -10340,6 +10562,16 @@
       super.firstFragment as SuperFormalParameterElementImpl;
 
   @override
+  List<SuperFormalParameterElementImpl> get fragments {
+    return [
+      for (SuperFormalParameterElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   FormalParameterElement? get superConstructorParameter2 {
     return firstFragment.superConstructorParameter?.asElement2;
   }
@@ -10380,6 +10612,16 @@
   Element2? get enclosingElement2 => firstFragment._enclosingElement3?.library2;
 
   @override
+  List<FunctionElementImpl> get fragments {
+    return [
+      for (FunctionElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   bool get isDartCoreIdentical => firstFragment.isDartCoreIdentical;
 
   @override
@@ -10444,12 +10686,12 @@
   }
 
   @override
-  TopLevelVariableFragment? get nextFragment =>
-      super.nextFragment as TopLevelVariableFragment?;
+  TopLevelVariableElementImpl? get nextFragment =>
+      super.nextFragment as TopLevelVariableElementImpl?;
 
   @override
-  TopLevelVariableFragment? get previousFragment =>
-      super.previousFragment as TopLevelVariableFragment?;
+  TopLevelVariableElementImpl? get previousFragment =>
+      super.previousFragment as TopLevelVariableElementImpl?;
 
   @override
   T? accept<T>(ElementVisitor<T> visitor) =>
@@ -10481,6 +10723,16 @@
       firstFragment.library as LibraryElement2;
 
   @override
+  List<TopLevelVariableElementImpl> get fragments {
+    return [
+      for (TopLevelVariableElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   GetterElement? get getter2 =>
       firstFragment.getter2?.element as GetterElement?;
 
@@ -10662,11 +10914,11 @@
 
   @override
   // TODO(augmentations): Support the fragment chain.
-  TypeAliasFragment? get nextFragment => null;
+  TypeAliasElementImpl? get nextFragment => null;
 
   @override
   // TODO(augmentations): Support the fragment chain.
-  TypeAliasFragment? get previousFragment => null;
+  TypeAliasElementImpl? get previousFragment => null;
 
   /// Instantiates this type alias with its type parameters as arguments.
   DartType get rawType {
@@ -10817,6 +11069,16 @@
       firstFragment.library as LibraryElement2;
 
   @override
+  List<TypeAliasElementImpl> get fragments {
+    return [
+      for (TypeAliasElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   bool get isSimplyBounded => firstFragment.isSimplyBounded;
 
   @override
@@ -11073,6 +11335,16 @@
   @override
   DartType? get boundShared => bound;
 
+  @override
+  List<TypeParameterElementImpl> get fragments {
+    return [
+      for (TypeParameterElementImpl? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
   bool get isLegacyCovariant => firstFragment.isLegacyCovariant;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 36334fa..70163ae 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -62,6 +62,16 @@
   ConstructorFragment get firstFragment => _element2.firstFragment;
 
   @override
+  List<ConstructorFragment> get fragments {
+    return [
+      for (ConstructorFragment? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   bool get isConst => declaration.isConst;
 
   @override
@@ -229,6 +239,16 @@
       parameters.map((fragment) => fragment.asElement2).toList();
 
   @override
+  List<ExecutableFragment> get fragments {
+    return [
+      for (ExecutableFragment? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   bool get hasImplicitReturnType => declaration.hasImplicitReturnType;
 
   @override
@@ -520,6 +540,16 @@
   FieldFragment get firstFragment => _element2.firstFragment;
 
   @override
+  List<FieldFragment> get fragments {
+    return [
+      for (FieldFragment? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   PropertyAccessorElement? get getter {
     var baseGetter = declaration.getter;
     if (baseGetter == null) {
@@ -708,6 +738,16 @@
   GetterFragment get firstFragment => _element2.firstFragment;
 
   @override
+  List<GetterFragment> get fragments {
+    return [
+      for (GetterFragment? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment as GetterFragment?)
+        fragment,
+    ];
+  }
+
+  @override
   String? get lookupName => _element2.lookupName;
 
   @override
@@ -1015,6 +1055,16 @@
   MethodFragment get firstFragment => _element2.firstFragment;
 
   @override
+  List<MethodFragment> get fragments {
+    return [
+      for (MethodFragment? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   LibraryElement2 get library2 => _element2.library2;
 
   @override
@@ -1146,6 +1196,16 @@
       _element2.formalParameters;
 
   @override
+  List<FormalParameterFragment> get fragments {
+    return [
+      for (FormalParameterFragment? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment)
+        fragment,
+    ];
+  }
+
+  @override
   bool get hasDefaultValue => declaration.hasDefaultValue;
 
   @override
@@ -1432,6 +1492,16 @@
   SetterFragment get firstFragment => _element2.firstFragment;
 
   @override
+  List<SetterFragment> get fragments {
+    return [
+      for (SetterFragment? fragment = firstFragment;
+          fragment != null;
+          fragment = fragment.nextFragment as SetterFragment?)
+        fragment,
+    ];
+  }
+
+  @override
   String? get lookupName => _element2.lookupName;
 
   @override
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart
index d234639..8ffcc2b 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/element.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -25,17 +25,6 @@
   }
 }
 
-extension ClassElementImpl2Extension on ClassElementImpl2 {
-  List<ClassElementImpl> get fragments {
-    return [
-      for (ClassElementImpl? fragment = firstFragment;
-          fragment != null;
-          fragment = fragment.nextFragment)
-        fragment,
-    ];
-  }
-}
-
 extension CompilationUnitElementExtension on CompilationUnitElement {
   LibraryFragment get asElement2 {
     return this as LibraryFragment;
@@ -77,15 +66,6 @@
 }
 
 extension Element2Extension on Element2 {
-  List<Fragment> get fragments {
-    return [
-      for (Fragment? fragment = firstFragment;
-          fragment != null;
-          fragment = fragment.nextFragment)
-        fragment,
-    ];
-  }
-
   /// Whether the element is effectively [internal].
   bool get isInternal {
     if (this case Annotatable annotatable) {