Elements. Migrate ReplacementVisitor.
Change-Id: I06104d34aee22a3355929fc53f99d1cee93ee5c5
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/405606
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index a5ff16d..59d1d66d 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -4637,6 +4637,11 @@
String get nameShared => wrappedElement.name;
@override
+ ParameterKind get parameterKind {
+ return firstFragment.parameterKind;
+ }
+
+ @override
// TODO(augmentations): Implement the merge of formal parameters.
TypeImpl get type => wrappedElement.type;
@@ -4665,6 +4670,7 @@
child.accept2(visitor);
}
}
+
// firstFragment.typeParameters
// .map((fragment) => (fragment as TypeParameterElementImpl).element)
// .toList();
@@ -4677,6 +4683,8 @@
FormalParameterElement,
SharedNamedFunctionParameter,
VariableElement2OrMember {
+ ParameterKind get parameterKind;
+
@override
TypeImpl get type;
diff --git a/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart b/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart
index 30b102d..a9685b7 100644
--- a/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart
@@ -2,9 +2,7 @@
// 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.
-// ignore_for_file: analyzer_use_new_elements
-
-import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/nullability_suffix.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/dart/element/type_visitor.dart';
@@ -18,6 +16,7 @@
import 'package:analyzer/src/summary2/function_type_builder.dart';
import 'package:analyzer/src/summary2/named_type_builder.dart';
import 'package:analyzer/src/summary2/record_type_builder.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
/// Helper visitor that clones a type if a nested type is replaced, and
/// otherwise returns `null`.
@@ -33,8 +32,8 @@
DartType? createFunctionType({
required FunctionType type,
required InstantiatedTypeAliasElement? newAlias,
- required List<TypeParameterElement>? newTypeParameters,
- required List<ParameterElement>? newParameters,
+ required List<TypeParameterElement2>? newTypeParameters,
+ required List<FormalParameterElement>? newParameters,
required DartType? newReturnType,
required NullabilitySuffix? newNullability,
}) {
@@ -45,9 +44,9 @@
return null;
}
- return FunctionTypeImpl(
- typeFormals: newTypeParameters ?? type.typeFormals,
- parameters: newParameters ?? type.parameters,
+ return FunctionTypeImpl.v2(
+ typeParameters: newTypeParameters ?? type.typeParameters,
+ formalParameters: newParameters ?? type.formalParameters,
returnType: newReturnType ?? type.returnType,
nullabilitySuffix: newNullability ?? type.nullabilitySuffix,
alias: newAlias ?? type.alias,
@@ -56,8 +55,8 @@
DartType? createFunctionTypeBuilder({
required FunctionTypeBuilder type,
- required List<TypeParameterElement>? newTypeParameters,
- required List<ParameterElement>? newParameters,
+ required List<TypeParameterElement2>? newTypeParameters,
+ required List<FormalParameterElement>? newParameters,
required TypeImpl? newReturnType,
required NullabilitySuffix? newNullability,
}) {
@@ -67,11 +66,11 @@
return null;
}
- return FunctionTypeBuilder(
- newTypeParameters ?? type.typeFormals,
- newParameters ?? type.parameters,
- newReturnType ?? type.returnType,
- newNullability ?? type.nullabilitySuffix,
+ return FunctionTypeBuilder.v2(
+ typeParameters: newTypeParameters ?? type.typeParameters,
+ formalParameters: newParameters ?? type.formalParameters,
+ returnType: newReturnType ?? type.returnType,
+ nullabilitySuffix: newNullability ?? type.nullabilitySuffix,
);
}
@@ -104,12 +103,12 @@
return null;
}
- return NamedTypeBuilder(
- type.linker,
- type.typeSystem,
- type.element,
- newTypeArguments ?? type.arguments,
- newNullability ?? type.nullabilitySuffix,
+ return NamedTypeBuilder.v2(
+ linker: type.linker,
+ typeSystem: type.typeSystem,
+ element: type.element3,
+ arguments: newTypeArguments ?? type.arguments,
+ nullabilitySuffix: newNullability ?? type.nullabilitySuffix,
);
}
@@ -134,8 +133,8 @@
}
var promotedBound = (type as TypeParameterTypeImpl).promotedBound;
- return TypeParameterTypeImpl(
- element: type.element,
+ return TypeParameterTypeImpl.v2(
+ element: type.element3,
nullabilitySuffix: newNullability ?? type.nullabilitySuffix,
promotedBound: newPromotedBound ?? promotedBound,
alias: type.alias,
@@ -150,8 +149,8 @@
return null;
}
- return TypeParameterTypeImpl(
- element: type.element,
+ return TypeParameterTypeImpl.v2(
+ element: type.element3,
nullabilitySuffix: newNullability,
alias: type.alias,
);
@@ -164,42 +163,42 @@
@override
DartType? visitFunctionType(FunctionType node) {
+ // TODO(scheglov): avoid this cast
+ node as FunctionTypeImpl;
var newNullability = visitNullability(node);
- List<TypeParameterElement>? newTypeParameters;
- for (var i = 0; i < node.typeFormals.length; i++) {
- var typeParameter = node.typeFormals[i];
+ List<TypeParameterElementImpl2>? newTypeParameters;
+ for (var i = 0; i < node.typeParameters.length; i++) {
+ var typeParameter = node.typeParameters[i];
var bound = typeParameter.bound;
if (bound != null) {
var newBound = visitTypeParameterBound(bound);
if (newBound != null) {
- newTypeParameters ??= node.typeFormals.toList(growable: false);
- newTypeParameters[i] = TypeParameterElementImpl.synthetic(
- typeParameter.name,
- )..bound = newBound;
+ newTypeParameters ??= node.typeParameters.toList(growable: false);
+ newTypeParameters[i] = typeParameter.freshCopy()..bound = newBound;
}
}
}
Substitution? substitution;
if (newTypeParameters != null) {
- var map = <TypeParameterElement, DartType>{};
+ var map = <TypeParameterElement2, DartType>{};
for (var i = 0; i < newTypeParameters.length; ++i) {
- var typeParameter = node.typeFormals[i];
+ var typeParameter = node.typeParameters[i];
var newTypeParameter = newTypeParameters[i];
map[typeParameter] = newTypeParameter.instantiate(
nullabilitySuffix: NullabilitySuffix.none,
);
}
- substitution = Substitution.fromMap(map);
+ substitution = Substitution.fromMap2(map);
for (var i = 0; i < newTypeParameters.length; i++) {
var newTypeParameter = newTypeParameters[i];
var bound = newTypeParameter.bound;
if (bound != null) {
var newBound = substitution.substituteType(bound);
- (newTypeParameter as TypeParameterElementImpl).bound = newBound;
+ newTypeParameter.bound = newBound;
}
}
}
@@ -228,8 +227,8 @@
}
}
if (newArguments != null) {
- newAlias = InstantiatedTypeAliasElementImpl(
- element: alias.element,
+ newAlias = InstantiatedTypeAliasElementImpl.v2(
+ element: alias.element2,
typeArguments: newArguments,
);
}
@@ -237,19 +236,18 @@
changeVariance();
- List<ParameterElement>? newParameters;
- for (var i = 0; i < node.parameters.length; i++) {
- var parameter = node.parameters[i];
+ List<FormalParameterElement>? newParameters;
+ for (var i = 0; i < node.formalParameters.length; i++) {
+ var parameter = node.formalParameters[i];
var type = parameter.type;
var newType = visitType(type);
- // ignore: deprecated_member_use_from_same_package
var kind = parameter.parameterKind;
var newKind = visitParameterKind(kind);
if (newType != null || newKind != null) {
- newParameters ??= node.parameters.toList(growable: false);
+ newParameters ??= node.formalParameters.toList(growable: false);
newParameters[i] = parameter.copyWith(
type: newType,
kind: newKind,
@@ -273,40 +271,38 @@
DartType? visitFunctionTypeBuilder(FunctionTypeBuilder node) {
var newNullability = visitNullability(node);
- List<TypeParameterElement>? newTypeParameters;
- for (var i = 0; i < node.typeFormals.length; i++) {
- var typeParameter = node.typeFormals[i];
+ List<TypeParameterElementImpl2>? newTypeParameters;
+ for (var i = 0; i < node.typeParameters.length; i++) {
+ var typeParameter = node.typeParameters[i];
var bound = typeParameter.bound;
if (bound != null) {
var newBound = visitTypeParameterBound(bound);
if (newBound != null) {
- newTypeParameters ??= node.typeFormals.toList(growable: false);
- newTypeParameters[i] = TypeParameterElementImpl.synthetic(
- typeParameter.name,
- )..bound = newBound;
+ newTypeParameters ??= node.typeParameters.toList(growable: false);
+ newTypeParameters[i] = typeParameter.freshCopy()..bound = newBound;
}
}
}
Substitution? substitution;
if (newTypeParameters != null) {
- var map = <TypeParameterElement, DartType>{};
+ var map = <TypeParameterElement2, DartType>{};
for (var i = 0; i < newTypeParameters.length; ++i) {
- var typeParameter = node.typeFormals[i];
+ var typeParameter = node.typeParameters[i];
var newTypeParameter = newTypeParameters[i];
map[typeParameter] = newTypeParameter.instantiate(
nullabilitySuffix: NullabilitySuffix.none,
);
}
- substitution = Substitution.fromMap(map);
+ substitution = Substitution.fromMap2(map);
for (var i = 0; i < newTypeParameters.length; i++) {
var newTypeParameter = newTypeParameters[i];
var bound = newTypeParameter.bound;
if (bound != null) {
var newBound = substitution.substituteType(bound);
- (newTypeParameter as TypeParameterElementImpl).bound = newBound;
+ newTypeParameter.bound = newBound;
}
}
}
@@ -326,9 +322,9 @@
changeVariance();
- List<ParameterElement>? newParameters;
- for (var i = 0; i < node.parameters.length; i++) {
- var parameter = node.parameters[i];
+ List<FormalParameterElement>? newParameters;
+ for (var i = 0; i < node.formalParameters.length; i++) {
+ var parameter = node.formalParameters[i];
var type = parameter.type;
var newType = visitType(type);
@@ -338,7 +334,7 @@
var newKind = visitParameterKind(kind);
if (newType != null || newKind != null) {
- newParameters ??= node.parameters.toList(growable: false);
+ newParameters ??= node.formalParameters.toList(growable: false);
newParameters[i] = parameter.copyWith(
type: newType,
kind: newKind,
@@ -365,19 +361,19 @@
var alias = type.alias;
if (alias != null) {
var newArguments = _typeArguments(
- alias.element.typeParameters,
+ alias.element2.typeParameters2,
alias.typeArguments,
);
if (newArguments != null) {
- newAlias = InstantiatedTypeAliasElementImpl(
- element: alias.element,
+ newAlias = InstantiatedTypeAliasElementImpl.v2(
+ element: alias.element2,
typeArguments: newArguments,
);
}
}
var newTypeArguments = _typeArguments(
- type.element.typeParameters,
+ type.element3.typeParameters2,
type.typeArguments,
);
@@ -398,12 +394,12 @@
DartType? visitNamedTypeBuilder(NamedTypeBuilder type) {
var newNullability = visitNullability(type);
- var parameters = const <TypeParameterElement>[];
- var element = type.element;
- if (element is InterfaceElement) {
- parameters = element.typeParameters;
- } else if (element is TypeAliasElement) {
- parameters = element.typeParameters;
+ var parameters = const <TypeParameterElement2>[];
+ var element = type.element3;
+ if (element is InterfaceElement2) {
+ parameters = element.typeParameters2;
+ } else if (element is TypeAliasElement2) {
+ parameters = element.typeParameters2;
}
var newArguments = _typeArguments(parameters, type.arguments);
@@ -440,12 +436,12 @@
var alias = type.alias;
if (alias != null) {
var newArguments = _typeArguments(
- alias.element.typeParameters,
+ alias.element2.typeParameters2,
alias.typeArguments,
);
if (newArguments != null) {
- newAlias = InstantiatedTypeAliasElementImpl(
- element: alias.element,
+ newAlias = InstantiatedTypeAliasElementImpl.v2(
+ element: alias.element2,
typeArguments: newArguments,
);
}
@@ -521,7 +517,7 @@
}
DartType? visitTypeArgument(
- TypeParameterElement parameter,
+ TypeParameterElement2 parameter,
DartType argument,
) {
return argument.accept(this);
@@ -533,9 +529,11 @@
@override
DartType? visitTypeParameterType(TypeParameterType type) {
+ // TODO(scheglov): avoid this cast
+ type as TypeParameterTypeImpl;
var newNullability = visitNullability(type);
- var promotedBound = (type as TypeParameterTypeImpl).promotedBound;
+ var promotedBound = type.promotedBound;
if (promotedBound != null) {
var newPromotedBound = promotedBound.accept(this);
return createPromotedTypeParameterType(
@@ -562,7 +560,7 @@
}
List<DartType>? _typeArguments(
- List<TypeParameterElement> parameters,
+ List<TypeParameterElement2> parameters,
List<DartType> arguments,
) {
if (arguments.length != parameters.length) {
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 6f57fcd..ae41a02 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -561,6 +561,16 @@
required this.typeArguments,
});
+ factory InstantiatedTypeAliasElementImpl.v2({
+ required TypeAliasElement2 element,
+ required List<DartType> typeArguments,
+ }) {
+ return InstantiatedTypeAliasElementImpl(
+ element: element.asElement,
+ typeArguments: typeArguments,
+ );
+ }
+
@override
TypeAliasElement2 get element2 => (element as TypeAliasFragment).element;
}
diff --git a/pkg/analyzer/lib/src/summary2/default_types_builder.dart b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
index f114947..906f815 100644
--- a/pkg/analyzer/lib/src/summary2/default_types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
@@ -6,6 +6,7 @@
import 'package:_fe_analyzer_shared/src/type_inference/type_analyzer_operations.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/src/dart/ast/ast.dart';
import 'package:analyzer/src/dart/ast/extensions.dart';
@@ -447,13 +448,13 @@
@override
DartType? visitTypeArgument(
- TypeParameterElement parameter,
+ TypeParameterElement2 parameter,
DartType argument,
) {
var savedVariance = _variance;
try {
_variance = _variance.combine(
- (parameter as TypeParameterElementImpl).variance,
+ (parameter as TypeParameterElementImpl2).variance,
);
return super.visitTypeArgument(parameter, argument);
} finally {
diff --git a/pkg/analyzer/lib/src/summary2/function_type_builder.dart b/pkg/analyzer/lib/src/summary2/function_type_builder.dart
index 91888f5..6022817 100644
--- a/pkg/analyzer/lib/src/summary2/function_type_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/function_type_builder.dart
@@ -5,6 +5,7 @@
// ignore_for_file: analyzer_use_new_elements
import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/nullability_suffix.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/dart/element/type_visitor.dart';
@@ -16,6 +17,7 @@
import 'package:analyzer/src/dart/element/type_visitor.dart';
import 'package:analyzer/src/summary2/type_builder.dart';
import 'package:analyzer/src/utilities/extensions/collection.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
/// The type builder for a [GenericFunctionType].
class FunctionTypeBuilder extends TypeBuilder {
@@ -60,6 +62,30 @@
);
}
+ factory FunctionTypeBuilder.v2({
+ required List<TypeParameterElement2> typeParameters,
+ required List<FormalParameterElement> formalParameters,
+ required TypeImpl returnType,
+ required NullabilitySuffix nullabilitySuffix,
+ GenericFunctionTypeImpl? node,
+ }) {
+ return FunctionTypeBuilder(
+ typeParameters.map((e) => e.asElement).toList(),
+ formalParameters.map((e) => e.asElement).toList(),
+ returnType,
+ nullabilitySuffix,
+ node: node,
+ );
+ }
+
+ List<FormalParameterElementMixin> get formalParameters {
+ return parameters.map((p) => p.asElement2).toList(growable: false);
+ }
+
+ List<TypeParameterElementImpl2> get typeParameters => typeFormals
+ .map((fragment) => fragment.asElement2 as TypeParameterElementImpl2)
+ .toList();
+
@override
R accept<R>(TypeVisitor<R> visitor) {
if (visitor is LinkingTypeVisitor<R>) {
diff --git a/pkg/analyzer/lib/src/summary2/named_type_builder.dart b/pkg/analyzer/lib/src/summary2/named_type_builder.dart
index c1724c6..7ddffc1 100644
--- a/pkg/analyzer/lib/src/summary2/named_type_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/named_type_builder.dart
@@ -6,6 +6,7 @@
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/nullability_suffix.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/dart/element/type_visitor.dart';
@@ -18,6 +19,7 @@
import 'package:analyzer/src/summary2/link.dart';
import 'package:analyzer/src/summary2/type_builder.dart';
import 'package:analyzer/src/utilities/extensions/collection.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
/// The type builder for a [NamedType].
class NamedTypeBuilder extends TypeBuilder {
@@ -72,6 +74,29 @@
node: node);
}
+ factory NamedTypeBuilder.v2({
+ required Linker linker,
+ required TypeSystemImpl typeSystem,
+ required Element2 element,
+ required List<DartType> arguments,
+ required NullabilitySuffix nullabilitySuffix,
+ NamedTypeImpl? node,
+ }) {
+ return NamedTypeBuilder(
+ linker,
+ typeSystem,
+ element.asElement!,
+ arguments,
+ nullabilitySuffix,
+ node: node,
+ );
+ }
+
+ @override
+ Element2 get element3 {
+ return element.asElement2!;
+ }
+
// TODO(scheglov): Only when enabled both in the element, and target?
bool get _isNonFunctionTypeAliasesEnabled {
return element.library!.featureSet.isEnabled(