Elements. Remove FragmentedElement.

Change-Id: If73caa44e64f469a16646794f96be044ad25d33f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/394561
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_super.dart b/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_super.dart
index 8737c2a..863a8f8 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_super.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_super.dart
@@ -112,7 +112,7 @@
     return _lastFragment(member);
   }
 
-  Fragment? _lastFragment(FragmentedElement? element) {
+  Fragment? _lastFragment(Element2? element) {
     Fragment? fragment = element?.firstFragment;
     while (fragment?.nextFragment != null) {
       fragment = fragment?.nextFragment;
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index 9a2bcf0..cbe2d4a 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -302,16 +302,11 @@
   if (element == null) {
     return null;
   }
-  if (element is engine.FragmentedElement) {
-    var fragment = (element as engine.FragmentedElement).firstFragment;
-    var offset = fragment.nameOffset2 ?? 0;
-    var length = fragment.name2?.length ?? 0;
-    var range = engine.SourceRange(offset, length);
-    return _locationForArgs2(fragment, range);
-  } else {
-    assert(false, 'Could not convert ${element.runtimeType} to Location.');
-    return null;
-  }
+  var fragment = element.firstFragment;
+  var offset = fragment.nameOffset2 ?? 0;
+  var length = fragment.name2?.length ?? 0;
+  var range = engine.SourceRange(offset, length);
+  return _locationForArgs2(fragment, range);
 }
 
 /// Create a Location based on an [engine.SearchMatch].
diff --git a/pkg/analysis_server/lib/src/services/correction/executable_parameters.dart b/pkg/analysis_server/lib/src/services/correction/executable_parameters.dart
index fa320a4..608ddaa 100644
--- a/pkg/analysis_server/lib/src/services/correction/executable_parameters.dart
+++ b/pkg/analysis_server/lib/src/services/correction/executable_parameters.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:analysis_server/src/utilities/extensions/object.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
@@ -87,8 +86,7 @@
     } else if (invocation is ConstructorReferenceNode) {
       element = invocation.element;
     }
-    var firstFragment =
-        element.ifTypeOrNull<FragmentedElement>()?.firstFragment;
+    var firstFragment = element?.firstFragment;
     if (element is ExecutableElement2 &&
         !element.isSynthetic &&
         firstFragment is ExecutableFragment) {
diff --git a/pkg/analyzer/lib/dart/element/element2.dart b/pkg/analyzer/lib/dart/element/element2.dart
index 07db524..3d03e5b 100644
--- a/pkg/analyzer/lib/dart/element/element2.dart
+++ b/pkg/analyzer/lib/dart/element/element2.dart
@@ -256,8 +256,7 @@
 /// type.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class ConstructorElement2
-    implements ExecutableElement2, FragmentedElement {
+abstract class ConstructorElement2 implements ExecutableElement2 {
   @override
   ConstructorElement2 get baseElement;
 
@@ -396,6 +395,13 @@
   /// top-level elements in the model.
   Element2? get enclosingElement2;
 
+  /// The first fragment in the chain of fragments that are merged to make this
+  /// element.
+  ///
+  /// The other fragments in the chain can be accessed using successive
+  /// invocations of [Fragment.nextFragment].
+  Fragment get firstFragment;
+
   /// The unique integer identifier of this element.
   int get id;
 
@@ -799,7 +805,7 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class FormalParameterElement
-    implements PromotableElement2, Annotatable, FragmentedElement {
+    implements PromotableElement2, Annotatable {
   @override
   FormalParameterElement get baseElement;
 
@@ -986,16 +992,6 @@
   Fragment? get previousFragment;
 }
 
-/// An element that can be defined by multiple fragments.
-abstract class FragmentedElement {
-  /// The first fragment in the chain of fragments that are merged to make this
-  /// element.
-  ///
-  /// The other fragments in the chain can be accessed using successive
-  /// invocations of [Fragment.nextFragment].
-  Fragment get firstFragment;
-}
-
 /// An element that has a [FunctionType] as its [type].
 ///
 /// This also provides convenient access to the parameters and return type.
@@ -1035,8 +1031,7 @@
 /// The pseudo-declaration that defines a generic function type.
 ///
 /// Clients may not extend, implement, or mix-in this class.
-abstract class GenericFunctionTypeElement2
-    implements FunctionTypedElement2, FragmentedElement {
+abstract class GenericFunctionTypeElement2 implements FunctionTypedElement2 {
   @override
   GenericFunctionTypeFragment get firstFragment;
 }
@@ -1063,7 +1058,7 @@
 /// top-level variable or a field. Induced getters are synthetic.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class GetterElement implements ExecutableElement2, FragmentedElement {
+abstract class GetterElement implements ExecutableElement2 {
   @override
   GetterElement get baseElement;
 
@@ -1329,7 +1324,7 @@
 /// A label associated with a statement.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class LabelElement2 implements Element2, FragmentedElement {
+abstract class LabelElement2 implements Element2 {
   @override
   // TODO(brianwilkerson): We shouldn't be inheriting this member.
   ExecutableElement2? get enclosingElement2;
@@ -1358,8 +1353,7 @@
 /// A library.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class LibraryElement2
-    implements Element2, Annotatable, FragmentedElement {
+abstract class LibraryElement2 implements Element2, Annotatable {
   /// The classes defined in this library.
   ///
   /// There is no guarantee of the order in which the classes will be returned.
@@ -1639,8 +1633,7 @@
 /// expression for a field or variable.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class LocalFunctionElement
-    implements ExecutableElement2, FragmentedElement {
+abstract class LocalFunctionElement implements ExecutableElement2 {
   @override
   LocalFunctionFragment get firstFragment;
 }
@@ -1678,8 +1671,7 @@
 /// A local variable.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class LocalVariableElement2
-    implements PromotableElement2, FragmentedElement {
+abstract class LocalVariableElement2 implements PromotableElement2 {
   @override
   LocalVariableElement2 get baseElement;
 
@@ -1837,7 +1829,7 @@
 /// method.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class MethodElement2 implements ExecutableElement2, FragmentedElement {
+abstract class MethodElement2 implements ExecutableElement2 {
   @override
   MethodElement2 get baseElement;
 
@@ -1931,7 +1923,7 @@
 /// and will return useless results.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class MultiplyDefinedElement2 implements Element2, FragmentedElement {
+abstract class MultiplyDefinedElement2 implements Element2 {
   /// The elements that were defined within the scope to have the same name.
   List<Element2> get conflictingElements2;
 
@@ -1990,7 +1982,7 @@
 /// A prefix used to import one or more libraries into another library.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class PrefixElement2 implements Element2, FragmentedElement {
+abstract class PrefixElement2 implements Element2 {
   /// There is no enclosing element for import prefixes, which are elements,
   /// but exist inside a single [LibraryFragment], not an element.
   @override
@@ -2077,7 +2069,7 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class PropertyInducingElement2
-    implements VariableElement2, Annotatable, FragmentedElement {
+    implements VariableElement2, Annotatable {
   @override
   PropertyInducingFragment get firstFragment;
 
@@ -2166,7 +2158,7 @@
 /// top-level variable or a field. Induced setters are synthetic.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class SetterElement implements ExecutableElement2, FragmentedElement {
+abstract class SetterElement implements ExecutableElement2 {
   @override
   SetterElement get baseElement;
 
@@ -2252,8 +2244,7 @@
 /// A top-level function.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class TopLevelFunctionElement
-    implements ExecutableElement2, FragmentedElement {
+abstract class TopLevelFunctionElement implements ExecutableElement2 {
   @override
   TopLevelFunctionElement get baseElement;
 
@@ -2383,8 +2374,7 @@
 /// An element that defines a type.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class TypeDefiningElement2
-    implements Element2, Annotatable, FragmentedElement {
+abstract class TypeDefiningElement2 implements Element2, Annotatable {
   // TODO(brianwilkerson): Evaluate to see whether this type is actually needed
   //  after converting clients to the new API.
 
@@ -2451,8 +2441,7 @@
 /// An element that has type parameters, such as a class, typedef, or method.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class TypeParameterizedElement2
-    implements Element2, FragmentedElement, Annotatable {
+abstract class TypeParameterizedElement2 implements Element2, Annotatable {
   @override
   TypeParameterizedFragment get firstFragment;
 
@@ -2496,7 +2485,7 @@
 /// There are more specific subclasses for more specific kinds of variables.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class VariableElement2 implements Element2, FragmentedElement {
+abstract class VariableElement2 implements Element2 {
   @override
   VariableFragment get firstFragment;
 
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 8da5426..7a5656c 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -2530,6 +2530,11 @@
   }
 
   @override
+  Fragment get firstFragment {
+    throw UnimplementedError('This is a fragment');
+  }
+
+  @override
   bool get hasAlwaysThrows {
     var metadata = this.metadata;
     for (var i = 0; i < metadata.length; i++) {
diff --git a/pkg/linter/lib/src/rules/analyzer_use_new_elements.dart b/pkg/linter/lib/src/rules/analyzer_use_new_elements.dart
index 316fa8d..5680523 100644
--- a/pkg/linter/lib/src/rules/analyzer_use_new_elements.dart
+++ b/pkg/linter/lib/src/rules/analyzer_use_new_elements.dart
@@ -4,11 +4,9 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/dart/element/element.dart'; // ignore: implementation_imports
 import 'package:analyzer/src/dart/element/type_visitor.dart'; // ignore: implementation_imports
 
 import '../analyzer.dart';
@@ -21,10 +19,6 @@
   }
 
   var firstFragment = element.firstFragment;
-  if (firstFragment == null) {
-    return false;
-  }
-
   var libraryFragment = firstFragment.libraryFragment;
   if (libraryFragment == null) {
     return false;
@@ -232,15 +226,3 @@
     }
   }
 }
-
-extension on Element2 {
-  Fragment? get firstFragment {
-    switch (this) {
-      case FragmentedElementMixin fragmented:
-        return fragmented.firstFragment;
-      case AugmentedInstanceElement fragmented:
-        return fragmented.firstFragment as Fragment;
-    }
-    return null;
-  }
-}