Elements. Migrate OverrideHelper.
Change-Id: I645d901fd0655c33c0c147c2b08a67b4791e6186
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/394360
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/analyzer_use_new_elements.txt b/pkg/analysis_server/analyzer_use_new_elements.txt
index 69e7efb..c6a47ab 100644
--- a/pkg/analysis_server/analyzer_use_new_elements.txt
+++ b/pkg/analysis_server/analyzer_use_new_elements.txt
@@ -42,7 +42,6 @@
lib/src/services/completion/dart/identifier_helper.dart
lib/src/services/completion/dart/in_scope_completion_pass.dart
lib/src/services/completion/dart/not_imported_completion_pass.dart
-lib/src/services/completion/dart/override_helper.dart
lib/src/services/completion/dart/relevance_computer.dart
lib/src/services/completion/dart/suggestion_builder.dart
lib/src/services/completion/dart/utilities.dart
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/candidate_suggestion.dart b/pkg/analysis_server/lib/src/services/completion/dart/candidate_suggestion.dart
index 772776c..f9e14cd 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/candidate_suggestion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/candidate_suggestion.dart
@@ -10,8 +10,10 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.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/source/source_range.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
/// Information about a code completion suggestion that might or might not be
/// sent to the client (that is, one that is a candidate for being sent).
@@ -797,12 +799,12 @@
/// Initialize a newly created candidate suggestion to suggest the [element]
/// by inserting the [shouldInvokeSuper].
OverrideSuggestion({
- required this.element,
+ required ExecutableElement2 element,
required this.shouldInvokeSuper,
required this.skipAt,
required this.replacementRange,
required super.matcherScore,
- });
+ }) : element = element.asElement;
@override
String get completion =>
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
index b6f5f56..e675878 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
@@ -407,11 +407,7 @@
) {
// This method is only visible for the metrics computation and might be made
// private at some future date.
- return _inheritanceDistance(
- subclass.asElement2 as InterfaceElement2?,
- superclass.asElement2 as InterfaceElement2,
- {},
- );
+ return _inheritanceDistance(subclass.asElement2, superclass.asElement2, {});
}
/// Return the inheritance distance between the [subclass] and the
@@ -437,8 +433,8 @@
InterfaceElement superclass,
) {
var distance = _inheritanceDistance(
- subclass.asElement2 as InterfaceElement2,
- superclass.asElement2 as InterfaceElement2,
+ subclass.asElement2,
+ superclass.asElement2,
{},
);
return distanceToPercent(distance);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart b/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart
index 9116a92..fb1ba09 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart
@@ -29,6 +29,7 @@
import 'package:analyzer/src/dart/ast/extensions.dart';
import 'package:analyzer/src/dart/ast/token.dart';
import 'package:analyzer/src/utilities/extensions/ast.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
import 'package:analyzer/src/utilities/extensions/flutter.dart';
/// A completion pass that will create candidate suggestions based on the
@@ -3896,7 +3897,7 @@
}
if (suggestOverrides && element != null) {
overrideHelper.computeOverridesFor(
- interfaceElement: element,
+ interfaceElement: element.asElement2,
replacementRange: SourceRange(offset, 0),
skipAt: skipAt,
);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/override_helper.dart b/pkg/analysis_server/lib/src/services/completion/dart/override_helper.dart
index 9d9bab1..ec7c675 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/override_helper.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/override_helper.dart
@@ -7,7 +7,7 @@
import 'package:analysis_server/src/services/completion/dart/candidate_suggestion.dart';
import 'package:analysis_server/src/services/completion/dart/completion_state.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_collector.dart';
-import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/source/source_range.dart';
import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
@@ -29,14 +29,14 @@
: inheritanceManager = state.request.inheritanceManager;
void computeOverridesFor({
- required InterfaceElement interfaceElement,
+ required InterfaceElement2 interfaceElement,
required SourceRange replacementRange,
required bool skipAt,
}) {
- var interface = inheritanceManager.getInterface(interfaceElement);
- var interfaceMap = interface.map;
+ var interface = inheritanceManager.getInterface2(interfaceElement);
+ var interfaceMap = interface.map2;
var namesToOverride = _namesToOverride(
- interfaceElement.librarySource.uri,
+ interfaceElement.library2.firstFragment.source.uri,
interface,
);
@@ -73,21 +73,21 @@
}
/// Checks if the [element] has the `@nonVirtual` annotation.
- bool _hasNonVirtualAnnotation(ExecutableElement element) {
- if (element is PropertyAccessorElement && element.isSynthetic) {
- var variable = element.variable2;
- if (variable != null && variable.hasNonVirtual) {
+ bool _hasNonVirtualAnnotation(ExecutableElement2 element) {
+ if (element is GetterElement && element.isSynthetic) {
+ var variable = element.variable3;
+ if (variable != null && variable.metadata2.hasNonVirtual) {
return true;
}
}
- return element.hasNonVirtual;
+ return element.metadata2.hasNonVirtual;
}
/// Return the list of names that belong to the [interface] of a class, but
/// are not yet declared in the class.
List<Name> _namesToOverride(Uri libraryUri, Interface interface) {
var namesToOverride = <Name>[];
- for (var name in interface.map.keys) {
+ for (var name in interface.map2.keys) {
if (name.isAccessibleFor(libraryUri)) {
// TODO(brianwilkerson): When the user is typing the name of an
// inherited member, the map will contain a key matching the current
@@ -95,7 +95,7 @@
// declaration consists of a single identifier), and that identifier
// matches the name of an overridden member, then the override should
// still be suggested.
- if (!interface.declared.containsKey(name)) {
+ if (!interface.declared2.containsKey(name)) {
namesToOverride.add(name);
}
}
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 7e6c7ea..74c06d8 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -8596,8 +8596,9 @@
@experimental
@override
- ExecutableElement2? get element =>
- staticElement?.asElement2 as ExecutableElement2?;
+ ExecutableElement2? get element {
+ return staticElement?.asElement2;
+ }
@override
Token get endToken => _argumentList.endToken;
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
index 37fe1f5..8ccd980 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -354,7 +354,7 @@
forMixinIndex: forMixinIndex,
forSuper: forSuper,
);
- return element?.asElement2 as ExecutableElement2?;
+ return element?.asElement2;
}
/// Returns the member with the given [name].
@@ -384,7 +384,7 @@
forMixinIndex: forMixinIndex,
forSuper: forSuper,
);
- return oldElement?.asElement2 as ExecutableElement2?;
+ return oldElement?.asElement2;
}
/// Returns all members of mixins, superclasses, and interfaces that a member
@@ -401,7 +401,7 @@
if (elements == null) {
return null;
}
- return elements.map((fragment) => fragment.asExecutableElement2).toList();
+ return elements.map((fragment) => fragment.asElement2).toList();
}
/// Return all members of mixins, superclasses, and interfaces that a member
@@ -419,9 +419,7 @@
InterfaceElement2 element, Name name) {
var interface = getInterface2(element);
var fragments = interface.overridden[name];
- return fragments
- ?.map((fragment) => fragment.asElement2 as ExecutableElement2)
- .toList();
+ return fragments?.map((fragment) => fragment.asElement2).toList();
}
/// Remove interfaces for classes defined in specified libraries.
@@ -920,8 +918,7 @@
var uniqueRedeclared2 = <Name, List<ExecutableElement2>>{};
for (var entry in redeclared.entries) {
var name = entry.key;
- var fragments =
- entry.value.map((fragment) => fragment.asExecutableElement2);
+ var fragments = entry.value.map((fragment) => fragment.asElement2);
if (fragments.length == 1) {
uniqueRedeclared2[name] = fragments.toFixedList();
} else {
@@ -1284,8 +1281,7 @@
/// The map of names to their signature in the interface.
@experimental
Map<Name, ExecutableElement2> get map2 {
- return map
- .map((name, element) => MapEntry(name, element.asExecutableElement2));
+ return map.map((name, element) => MapEntry(name, element.asElement2));
}
/// Return `true` if the [name] is implemented in the supertype.
@@ -1435,11 +1431,3 @@
other.name == name;
}
}
-
-extension on ExecutableElement {
- ExecutableElement2 get asExecutableElement2 => switch (this) {
- ExecutableFragment(:var element) => element,
- ExecutableMember member => member,
- _ => throw UnsupportedError('Unsupported type: $runtimeType'),
- };
-}
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 57edf2c..397244a 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -312,8 +312,7 @@
.nonNulls
.toList();
- ExecutableElement2 get _element2 =>
- declaration.asElement2 as ExecutableElement2;
+ ExecutableElement2 get _element2 => declaration.asElement2;
@override
void appendTo(ElementDisplayStringBuilder builder) {
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index 27db4a3..73b4f36 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -1091,9 +1091,6 @@
extension on List<ExecutableElement>? {
List<ExecutableElement2> get asElement2 {
- return this
- ?.map((element) => element.asElement2 as ExecutableElement2)
- .toList() ??
- const [];
+ return this?.map((element) => element.asElement2).toList() ?? const [];
}
}
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart
index 821366d..4ed918e 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/element.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -168,6 +168,22 @@
}
}
+extension ExecutableElement2Extension on ExecutableElement2 {
+ ExecutableElement get asElement {
+ return firstFragment as ExecutableElement;
+ }
+}
+
+extension ExecutableElementExtension on ExecutableElement {
+ ExecutableElement2 get asElement2 {
+ return switch (this) {
+ ExecutableFragment(:var element) => element,
+ ExecutableMember member => member,
+ _ => throw UnsupportedError('Unsupported type: $runtimeType'),
+ };
+ }
+}
+
extension FormalParameterExtension on FormalParameterElement {
void appendToWithoutDelimiters(
StringBuffer buffer, {
@@ -189,6 +205,12 @@
}
}
+extension InterfaceElementExtension on InterfaceElement {
+ InterfaceElement2 get asElement2 {
+ return (this as InterfaceElementImpl).element;
+ }
+}
+
extension LibraryFragmentExtension on LibraryFragment {
/// Returns a list containing this library fragment and all of its enclosing
/// fragments.