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;
- }
-}