[analyzer] Use TypeImpl for type annotation types.
The types of `TypeAnnotationImpl.type`, and the fields that override
it, are changed from `DartType?` to `TypeImpl?`. Also, the type of
`TypeAnnotationExtension.typeOrThrow` is changed from `DartType` to
`TypeImpl`.
To reduce the number of casts that need to be added, the following
changes are made in parallel:
- An additional extension `TypeAnnotationImplExtension.typeOrThrow` is
added; this has the same behavior as
`TypeAnnotationExtension.typeOrThrow`, but it doesn't require a type
cast.
- Some field types, getter types, method return types, and method
parameter types are changed to `Impl` types in the following
classes:
- `AstRewriter`
- `EraseNonJSInteropTypes`
- `ExtensionTypeErasure`
- `FreshTypeParameters`
- `FullInvocationInferrer`
- `FunctionExpressionInvocationResolver`
- `FunctionReferenceResolver`
- `FunctionTypeBuilder`
- `InstanceCreationInferrer`
- `InvocationExpressionInferrer`
- `InvocationInferrer`
- `NamedTypeBuilder`
- `NamedTypeResolver`
- `ResolutionReader`
- `TypeAliasElementImpl`
- `TypeAliasElementImpl2`
- `TypeImpl`
- `TypeParameterElementImpl`
- `TypeSystemImpl`
There is no change to the analyzer public API.
This is part of a larger arc of work to change the analyzer's use of
the shared code so that the type parameters it supplies are not part
of the analyzer public API. See
https://github.com/dart-lang/sdk/issues/59763.
Change-Id: I7f753508b53f6744677fd18f66858d70eb974093
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/405221
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
index 4174415..40d5369 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
@@ -10,6 +10,7 @@
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/ast/ast.dart';
import 'package:analyzer/src/dart/ast/extensions.dart';
+import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import 'package:meta/meta.dart';
@@ -67,7 +68,7 @@
}
var matchedType = objectPattern.type.typeOrThrow;
- if (matchedType is! InterfaceType) {
+ if (matchedType is! InterfaceTypeImpl) {
return;
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart b/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart
index 821cb9d..ac716f1 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart
@@ -5,8 +5,8 @@
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/ast/extensions.dart';
+import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -41,7 +41,7 @@
}
var type = namedType.typeOrThrow;
- if (type is InterfaceType) {
+ if (type is InterfaceTypeImpl) {
var element = type.element3;
if (element.typeParameters2.length == typeArguments.arguments.length) {
await builder.addDartFileEdit(file, (builder) {
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 61c4346..1e5af8b 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -9022,7 +9022,7 @@
final Token? question;
@override
- DartType? type;
+ TypeImpl? type;
/// The element associated with the function type, or `null` if the AST
/// structure hasn't been resolved.
@@ -12546,7 +12546,7 @@
final Token? question;
@override
- DartType? type;
+ TypeImpl? type;
/// Initializes a newly created type name.
///
@@ -14860,7 +14860,7 @@
final Token? question;
@override
- DartType? type;
+ TypeImpl? type;
RecordTypeAnnotationImpl({
required this.leftParenthesis,
@@ -17834,7 +17834,10 @@
DartType? get type;
}
-sealed class TypeAnnotationImpl extends AstNodeImpl implements TypeAnnotation {}
+sealed class TypeAnnotationImpl extends AstNodeImpl implements TypeAnnotation {
+ @override
+ TypeImpl? get type;
+}
/// A list of type arguments.
///
diff --git a/pkg/analyzer/lib/src/dart/ast/extensions.dart b/pkg/analyzer/lib/src/dart/ast/extensions.dart
index 254d8aa..b40317e 100644
--- a/pkg/analyzer/lib/src/dart/ast/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/ast/extensions.dart
@@ -376,7 +376,16 @@
/// This accessor should be used on expressions that are expected to
/// be already resolved. Every such expression must have the type set,
/// at least `dynamic`.
- DartType get typeOrThrow {
+ TypeImpl get typeOrThrow => (this as TypeAnnotationImpl).typeOrThrow;
+}
+
+extension TypeAnnotationImplExtension on TypeAnnotationImpl {
+ /// Return the static type of this type annotation.
+ ///
+ /// This accessor should be used on expressions that are expected to
+ /// be already resolved. Every such expression must have the type set,
+ /// at least `dynamic`.
+ TypeImpl get typeOrThrow {
var type = this.type;
if (type == null) {
throw StateError('No type: $this');
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 6569a0b..edc8c24 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -10859,7 +10859,7 @@
ElementLinkedData? linkedData;
ElementImpl? _aliasedElement;
- DartType? _aliasedType;
+ TypeImpl? _aliasedType;
@override
late TypeAliasElementImpl2 element;
@@ -10878,13 +10878,15 @@
}
@override
- DartType get aliasedType {
+ TypeImpl get aliasedType {
linkedData?.read(this);
return _aliasedType!;
}
set aliasedType(DartType rawType) {
- _aliasedType = rawType;
+ // TODO(paulberry): eliminate this cast by changing the type of the
+ // `rawType` parameter.
+ _aliasedType = rawType as TypeImpl;
}
/// The aliased type, might be `null` if not yet linked.
@@ -10910,7 +10912,7 @@
/// the constructor-tearoffs specification.
bool get isProperRename {
var aliasedType_ = aliasedType;
- if (aliasedType_ is! InterfaceType) {
+ if (aliasedType_ is! InterfaceTypeImpl) {
return false;
}
var aliasedClass = aliasedType_.element;
@@ -11157,7 +11159,7 @@
}
@override
- DartType instantiate(
+ TypeImpl instantiate(
{required List<DartType> typeArguments,
required NullabilitySuffix nullabilitySuffix}) =>
firstFragment.instantiate(
@@ -11347,7 +11349,7 @@
}
@override
- TypeParameterType instantiate({
+ TypeParameterTypeImpl instantiate({
required NullabilitySuffix nullabilitySuffix,
}) {
return TypeParameterTypeImpl(
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 74ca4f0..deb653b 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -1536,7 +1536,7 @@
const TypeImpl({this.alias});
@override
- DartType get extensionTypeErasure {
+ TypeImpl get extensionTypeErasure {
return const ExtensionTypeErasure().perform(this);
}
diff --git a/pkg/analyzer/lib/src/dart/element/type_algebra.dart b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
index 66a9745..2fecad3 100644
--- a/pkg/analyzer/lib/src/dart/element/type_algebra.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
@@ -168,7 +168,7 @@
FreshTypeParameters(this.freshTypeParameters, this.substitution);
- FunctionType applyToFunctionType(FunctionType type) {
+ FunctionTypeImpl applyToFunctionType(FunctionType type) {
return FunctionTypeImpl(
typeFormals: freshTypeParameters.map((e) => e.firstFragment).toList(),
parameters: type.parameters.map((parameter) {
diff --git a/pkg/analyzer/lib/src/dart/element/type_system.dart b/pkg/analyzer/lib/src/dart/element/type_system.dart
index 4cc0dbe..46de540 100644
--- a/pkg/analyzer/lib/src/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_system.dart
@@ -45,8 +45,10 @@
class ExtensionTypeErasure extends ReplacementVisitor {
const ExtensionTypeErasure();
- DartType perform(DartType type) {
- return type.accept(this) ?? type;
+ TypeImpl perform(TypeImpl type) {
+ // TODO(paulberry): eliminate this cast by changing `ReplacementVisitor` so
+ // that it implements `TypeVisitor<TypeImpl?>`.
+ return (type.accept(this) ?? type) as TypeImpl;
}
@override
@@ -700,8 +702,8 @@
}
@override
- InterfaceType instantiateInterfaceToBounds({
- required InterfaceElement element,
+ InterfaceTypeImpl instantiateInterfaceToBounds({
+ required covariant InterfaceElementImpl element,
required NullabilitySuffix nullabilitySuffix,
}) {
var typeParameters = element.typeParameters;
@@ -746,8 +748,8 @@
}
@override
- DartType instantiateTypeAliasToBounds({
- required TypeAliasElement element,
+ TypeImpl instantiateTypeAliasToBounds({
+ required covariant TypeAliasElementImpl element,
required NullabilitySuffix nullabilitySuffix,
}) {
var typeParameters = element.typeParameters;
diff --git a/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
index 9a94441..8d7e283 100644
--- a/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
@@ -9,6 +9,7 @@
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/error/listener.dart';
import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer/src/dart/element/type_constraint_gatherer.dart';
import 'package:analyzer/src/dart/element/type_schema.dart';
import 'package:analyzer/src/dart/resolver/invocation_inference_helper.dart';
@@ -139,7 +140,10 @@
contextType: UnknownInferredType.instance,
whyNotPromotedArguments: whyNotPromotedArguments,
constructorName: constructorName)
- .resolveInvocation(rawType: constructorRawType);
+ .resolveInvocation(
+ // TODO(paulberry): eliminate this cast by changing the type of
+ // `ConstructorElementToInfer.asType`.
+ rawType: constructorRawType as FunctionTypeImpl);
}
void _extensionGetter(
diff --git a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
index aee96f7..efc51f3 100644
--- a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
@@ -11,6 +11,7 @@
import 'package:analyzer/src/dart/ast/ast.dart';
import 'package:analyzer/src/dart/ast/extensions.dart';
import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/error/codes.dart';
/// Handles possible rewrites of AST.
@@ -54,7 +55,7 @@
node: node,
function: SimpleIdentifierImpl(typeNode.name2),
);
- } else if (element is TypeAliasElement &&
+ } else if (element is TypeAliasElementImpl &&
element.aliasedElement is GenericFunctionTypeElement) {
return _toMethodInvocationOfAliasedTypeLiteral(
node: node,
@@ -77,7 +78,7 @@
identifier: SimpleIdentifierImpl(typeNode.name2),
),
);
- } else if (element is TypeAliasElement &&
+ } else if (element is TypeAliasElementImpl &&
element.aliasedElement is GenericFunctionTypeElement) {
return _toMethodInvocationOfAliasedTypeLiteral(
node: node,
@@ -635,7 +636,7 @@
MethodInvocation _toMethodInvocationOfAliasedTypeLiteral({
required InstanceCreationExpressionImpl node,
required Identifier function,
- required TypeAliasElement element,
+ required TypeAliasElementImpl element,
}) {
var typeName = NamedTypeImpl(
importPrefix: node.constructorName.type.importPrefix,
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
index 0d7c2d6..568b3c7 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
@@ -152,7 +152,10 @@
argumentList: node.argumentList,
whyNotPromotedArguments: whyNotPromotedArguments,
contextType: contextType,
- ).resolveInvocation(rawType: rawType);
+ ).resolveInvocation(
+ // TODO(paulberry): eliminate this cast by changing the type of
+ // `rawType`.
+ rawType: rawType as FunctionTypeImpl);
node.recordStaticType(returnType, resolver: _resolver);
}
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
index 130d91f..a5a53f2 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
@@ -11,6 +11,7 @@
import 'package:analyzer/error/listener.dart';
import 'package:analyzer/src/dart/ast/ast.dart';
import 'package:analyzer/src/dart/ast/extensions.dart';
+import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer/src/dart/resolver/extension_member_resolver.dart';
@@ -318,7 +319,7 @@
/// Resolves [node] as a [TypeLiteral] referencing an interface type directly
/// (not through a type alias).
void _resolveDirectTypeLiteral(FunctionReferenceImpl node,
- IdentifierImpl name, InterfaceElement element) {
+ IdentifierImpl name, InterfaceElementImpl element) {
var typeArguments = _checkTypeArguments(
// `node.typeArguments`, coming from the parser, is never null.
node.typeArguments!, name.name, element.typeParameters,
@@ -622,13 +623,13 @@
if (node.parent is PropertyAccess) {
_resolveConstructorReference(node);
return;
- } else if (element is InterfaceElement) {
+ } else if (element is InterfaceElementImpl) {
_resolver.analyzeExpression(
node.function, _resolver.operations.unknownType);
_resolver.popRewrite();
_resolveDirectTypeLiteral(node, prefix, element);
return;
- } else if (element is TypeAliasElement) {
+ } else if (element is TypeAliasElementImpl) {
_resolver.analyzeExpression(prefix, _resolver.operations.unknownType);
_resolver.popRewrite();
_resolveTypeAlias(node: node, element: element, typeAlias: prefix);
@@ -743,7 +744,7 @@
// `prefix.C<int>.name` is initially represented as a [PropertyAccess]
// with a [FunctionReference] target.
if (node.parent is PropertyAccess) {
- if (element is TypeAliasElement &&
+ if (element is TypeAliasElementImpl &&
element.aliasedType is FunctionType) {
function.staticElement = element;
_resolveTypeAlias(node: node, element: element, typeAlias: function);
@@ -751,11 +752,11 @@
_resolveConstructorReference(node);
}
return;
- } else if (element is InterfaceElement) {
+ } else if (element is InterfaceElementImpl) {
function.staticElement = element;
_resolveDirectTypeLiteral(node, function, element);
return;
- } else if (element is TypeAliasElement) {
+ } else if (element is TypeAliasElementImpl) {
function.staticElement = element;
_resolveTypeAlias(node: node, element: element, typeAlias: function);
return;
@@ -830,7 +831,7 @@
void _resolveTypeAlias({
required FunctionReferenceImpl node,
- required TypeAliasElement element,
+ required TypeAliasElementImpl element,
required IdentifierImpl typeAlias,
}) {
var typeArguments = _checkTypeArguments(
@@ -847,7 +848,7 @@
void _resolveTypeLiteral({
required FunctionReferenceImpl node,
- required DartType instantiatedType,
+ required TypeImpl instantiatedType,
required IdentifierImpl name,
}) {
// TODO(srawlins): set the static element of [typeName].
diff --git a/pkg/analyzer/lib/src/dart/resolver/instance_creation_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/instance_creation_expression_resolver.dart
index b5fa095..1527d9d 100644
--- a/pkg/analyzer/lib/src/dart/resolver/instance_creation_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/instance_creation_expression_resolver.dart
@@ -67,7 +67,10 @@
argumentList: node.argumentList,
contextType: contextType,
whyNotPromotedArguments: whyNotPromotedArguments)
- .resolveInvocation(rawType: elementToInfer?.asType);
+ .resolveInvocation(
+ // TODO(paulberry): eliminate this cast by changing the type of
+ // `ConstructorElementToInfer.asType`.
+ rawType: elementToInfer?.asType as FunctionTypeImpl?);
node.recordStaticType(node.constructorName.type.type!, resolver: _resolver);
_resolver.checkForArgumentTypesNotAssignableInList(
node.argumentList, whyNotPromotedArguments);
diff --git a/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart b/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
index ec08d46..fbea7d8 100644
--- a/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
@@ -164,7 +164,10 @@
argumentList: node.argumentList,
contextType: contextType,
whyNotPromotedArguments: whyNotPromotedArguments,
- ).resolveInvocation(rawType: rawType);
+ ).resolveInvocation(
+ // TODO(paulberry): eliminate this cast by changing the type of
+ // `rawType`.
+ rawType: rawType as FunctionTypeImpl);
node.recordStaticType(returnType, resolver: _resolver);
}
diff --git a/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart b/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart
index b8c07ed..9967d5d 100644
--- a/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart
@@ -156,7 +156,7 @@
CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD;
@override
- DartType resolveInvocation({required FunctionType? rawType}) {
+ DartType resolveInvocation({required FunctionTypeImpl? rawType}) {
var typeArgumentList = _typeArguments;
var originalType = rawType;
@@ -280,7 +280,7 @@
if (inferrer != null) {
typeArgumentTypes = inferrer.chooseFinalTypes();
}
- FunctionType? invokeType = typeArgumentTypes != null
+ FunctionTypeImpl? invokeType = typeArgumentTypes != null
? originalType?.instantiate(typeArgumentTypes)
: originalType;
@@ -333,7 +333,7 @@
}
List<ParameterElement>? _storeResult(
- List<DartType>? typeArgumentTypes, FunctionType? invokeType) {
+ List<DartType>? typeArgumentTypes, FunctionTypeImpl? invokeType) {
return invokeType?.parameters;
}
}
@@ -390,7 +390,7 @@
@override
List<ParameterElement>? _storeResult(
- List<DartType>? typeArgumentTypes, FunctionType? invokeType) {
+ List<DartType>? typeArgumentTypes, FunctionTypeImpl? invokeType) {
if (invokeType != null) {
var constructedType = invokeType.returnType;
node.constructorName.type.type = constructedType;
@@ -426,7 +426,7 @@
@override
List<ParameterElement>? _storeResult(
- List<DartType>? typeArgumentTypes, FunctionType? invokeType) {
+ List<DartType>? typeArgumentTypes, FunctionTypeImpl? invokeType) {
node.typeArgumentTypes = typeArgumentTypes;
node.staticInvokeType = invokeType ?? DynamicTypeImpl.instance;
return super._storeResult(typeArgumentTypes, invokeType);
@@ -461,7 +461,7 @@
/// Performs type inference on the invocation expression. [rawType] should be
/// the type of the function the invocation is resolved to (with type
/// arguments not applied yet).
- void resolveInvocation({required FunctionType? rawType}) {
+ void resolveInvocation({required FunctionTypeImpl? rawType}) {
var deferredFunctionLiterals = _visitArguments(
parameterMap: _computeParameterMap(rawType?.parameters ?? const []));
if (deferredFunctionLiterals != null) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index 3b6e73b..c22b7a0 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -492,7 +492,10 @@
argumentList: node.argumentList,
whyNotPromotedArguments: whyNotPromotedArguments,
contextType: contextType)
- .resolveInvocation(rawType: rawType);
+ .resolveInvocation(
+ // TODO(paulberry): eliminate this cast by changing the type of
+ // `rawType`.
+ rawType: rawType as FunctionTypeImpl?);
}
/// Resolves the method invocation, [node], as an instance invocation on an
diff --git a/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart
index b7ff26d..ef7c1b2 100644
--- a/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart
@@ -171,7 +171,7 @@
/// We are resolving the [NamedType] in a redirecting constructor of the
/// [enclosingClass].
- InterfaceType _inferRedirectedConstructor(InterfaceElement element,
+ InterfaceTypeImpl _inferRedirectedConstructor(InterfaceElementImpl element,
{required TypeConstraintGenerationDataForTesting? dataForTesting,
required AstNodeImpl? nodeForTesting}) {
if (element == enclosingClass) {
@@ -202,13 +202,13 @@
}
}
- DartType _instantiateElement(NamedTypeImpl node, Element element,
+ TypeImpl _instantiateElement(NamedTypeImpl node, Element element,
{required TypeConstraintGenerationDataForTesting? dataForTesting}) {
var nullability = _getNullability(node);
var argumentList = node.typeArguments;
if (argumentList != null) {
- if (element is InterfaceElement) {
+ if (element is InterfaceElementImpl) {
var typeArguments = _buildTypeArguments(
node,
argumentList,
@@ -218,7 +218,7 @@
typeArguments: typeArguments,
nullabilitySuffix: nullability,
);
- } else if (element is TypeAliasElement) {
+ } else if (element is TypeAliasElementImpl) {
var typeArguments = _buildTypeArguments(
node,
argumentList,
@@ -238,7 +238,7 @@
} else if (element is NeverElementImpl) {
_buildTypeArguments(node, argumentList, 0);
return _instantiateElementNever(nullability);
- } else if (element is TypeParameterElement) {
+ } else if (element is TypeParameterElementImpl) {
_buildTypeArguments(node, argumentList, 0);
return element.instantiate(
nullabilitySuffix: nullability,
@@ -249,7 +249,7 @@
}
}
- if (element is InterfaceElement) {
+ if (element is InterfaceElementImpl) {
if (identical(node, withClause_namedType)) {
for (var mixin in enclosingClass!.mixins) {
if (mixin.element == element) {
@@ -267,7 +267,7 @@
element: element,
nullabilitySuffix: nullability,
);
- } else if (element is TypeAliasElement) {
+ } else if (element is TypeAliasElementImpl) {
var type = typeSystem.instantiateTypeAliasToBounds(
element: element,
nullabilitySuffix: nullability,
@@ -280,7 +280,7 @@
return DynamicTypeImpl.instance;
} else if (element is NeverElementImpl) {
return _instantiateElementNever(nullability);
- } else if (element is TypeParameterElement) {
+ } else if (element is TypeParameterElementImpl) {
return element.instantiate(
nullabilitySuffix: nullability,
);
@@ -290,7 +290,7 @@
}
}
- DartType _instantiateElementNever(NullabilitySuffix nullability) {
+ TypeImpl _instantiateElementNever(NullabilitySuffix nullability) {
return NeverTypeImpl.instance.withNullability(nullability);
}
@@ -387,7 +387,7 @@
/// but the [type] is nullable (because the question mark was specified,
/// or the type alias is nullable), report an error, and return the
/// corresponding non-nullable type.
- DartType _verifyNullability(NamedType node, DartType type) {
+ TypeImpl _verifyNullability(NamedType node, TypeImpl type) {
if (identical(node, classHierarchy_namedType)) {
if (type.nullabilitySuffix == NullabilitySuffix.question) {
var parent = node.parent;
@@ -412,17 +412,17 @@
CompileTimeErrorCode.NULLABLE_TYPE_IN_WITH_CLAUSE,
);
}
- return (type as TypeImpl).withNullability(NullabilitySuffix.none);
+ return type.withNullability(NullabilitySuffix.none);
}
}
return type;
}
- DartType _verifyTypeAliasForContext(
+ TypeImpl _verifyTypeAliasForContext(
NamedType node,
TypeAliasElement element,
- DartType type,
+ TypeImpl type,
) {
// If a type alias that expands to a type parameter.
if (element.aliasedType is TypeParameterType) {
diff --git a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
index e210d34..d34c216 100644
--- a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
+++ b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
@@ -9,7 +9,6 @@
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/dart/element/element2.dart';
-import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/error/error.dart';
import 'package:analyzer/error/listener.dart';
import 'package:analyzer/src/dart/ast/ast.dart';
@@ -18,6 +17,7 @@
show JoinPatternVariableElementImpl2, MetadataImpl;
import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
import 'package:analyzer/src/dart/element/member.dart' show ExecutableMember;
+import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer/src/utilities/extensions/object.dart';
import 'package:collection/collection.dart';
@@ -162,7 +162,7 @@
void visitGenericTypeAlias(GenericTypeAlias node) {
if (!Identifier.isPrivateName(node.name.lexeme)) {
var type = node.type.type;
- if (type is InterfaceType) {
+ if (type is InterfaceTypeImpl) {
for (var constructor in type.constructors2) {
if (!Identifier.isPrivateName(constructor.name3!)) {
usedElements.addElement(constructor);
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index d6290c9..da786af 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -150,7 +150,7 @@
}
if (type is DynamicType) {
// Nothing to do.
- } else if (type is InterfaceType) {
+ } else if (type is InterfaceTypeImpl) {
// look up ConstructorElement
ConstructorElement? constructor;
var name = node.name;
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 3164d01..f3d8076 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -2063,7 +2063,10 @@
argumentList: node.arguments,
contextType: contextType,
whyNotPromotedArguments: whyNotPromotedArguments,
- ).resolveInvocation(rawType: rawType);
+ ).resolveInvocation(
+ // TODO(paulberry): eliminate this cast by changing the type of
+ // `rawType`.
+ rawType: rawType as FunctionTypeImpl?);
node.recordStaticType(
augmentationTarget is ExecutableElementImpl
@@ -3546,7 +3549,10 @@
argumentList: node.argumentList,
contextType: UnknownInferredType.instance,
whyNotPromotedArguments: whyNotPromotedArguments)
- .resolveInvocation(rawType: node.staticElement?.type);
+ .resolveInvocation(
+ // TODO(paulberry): eliminate this cast by changing the type of
+ // `RedirectingConstructorInvocationImpl.staticElement`.
+ rawType: node.staticElement?.type as FunctionTypeImpl?);
checkForArgumentTypesNotAssignableInList(
node.argumentList, whyNotPromotedArguments);
}
@@ -3683,7 +3689,10 @@
argumentList: node.argumentList,
contextType: UnknownInferredType.instance,
whyNotPromotedArguments: whyNotPromotedArguments)
- .resolveInvocation(rawType: node.staticElement?.type);
+ .resolveInvocation(
+ // TODO(paulberry): eliminate this cast by changing the type of
+ // `SuperConstructorInvocationImpl.staticElement`.
+ rawType: node.staticElement?.type as FunctionTypeImpl?);
checkForArgumentTypesNotAssignableInList(
node.argumentList, whyNotPromotedArguments);
}
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index 0e580a0..f5b8d12 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -7,7 +7,6 @@
import 'package:_fe_analyzer_shared/src/scanner/string_canonicalizer.dart';
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/ast/ast.dart';
import 'package:analyzer/src/dart/ast/token.dart';
import 'package:analyzer/src/dart/element/element.dart';
@@ -676,7 +675,7 @@
parameters: formalParameters,
question: AstBinaryFlags.hasQuestion(flags) ? Tokens.question() : null,
);
- var type = _reader.readRequiredType() as FunctionType;
+ var type = _reader.readRequiredType() as FunctionTypeImpl;
node.type = type;
var element = GenericFunctionTypeElementImpl.forOffset(-1);
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 16eaeeb..b08a3d0 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -2155,7 +2155,7 @@
FunctionType? readOptionalFunctionType() {
var type = readType();
- return type is FunctionType ? type : null;
+ return type is FunctionTypeImpl ? type : null;
}
T? readOptionalObject<T>(T Function(SummaryDataReader reader) read) {
@@ -2188,7 +2188,7 @@
return _reader.readStringReferenceList();
}
- DartType? readType() {
+ TypeImpl? readType() {
var tag = _reader.readByte();
if (tag == Tag.NullType) {
return null;
@@ -2209,13 +2209,13 @@
);
return _readAliasElementArguments(type);
} else if (tag == Tag.InterfaceType_noTypeArguments_none) {
- var element = readElement() as InterfaceElement;
+ var element = readElement() as InterfaceElementImpl;
var type = element.instantiate(
typeArguments: const <DartType>[],
nullabilitySuffix: NullabilitySuffix.none);
return _readAliasElementArguments(type);
} else if (tag == Tag.InterfaceType_noTypeArguments_question) {
- var element = readElement() as InterfaceElement;
+ var element = readElement() as InterfaceElementImpl;
var type = element.instantiate(
typeArguments: const <DartType>[],
nullabilitySuffix: NullabilitySuffix.question,
@@ -2295,14 +2295,14 @@
}
}
- DartType _readAliasElementArguments(DartType type) {
+ TypeImpl _readAliasElementArguments(TypeImpl type) {
var aliasElement = _readRawElement();
if (aliasElement is TypeAliasElement) {
var aliasArguments = _readTypeList();
- if (type is DynamicType) {
+ if (type is DynamicTypeImpl) {
// TODO(scheglov): add support for `dynamic` aliasing
return type;
- } else if (type is FunctionType) {
+ } else if (type is FunctionTypeImpl) {
return FunctionTypeImpl(
typeFormals: type.typeFormals,
parameters: type.parameters,
@@ -2333,7 +2333,7 @@
typeArguments: aliasArguments,
),
);
- } else if (type is TypeParameterType) {
+ } else if (type is TypeParameterTypeImpl) {
return TypeParameterTypeImpl(
element: type.element,
nullabilitySuffix: type.nullabilitySuffix,
@@ -2342,7 +2342,7 @@
typeArguments: aliasArguments,
),
);
- } else if (type is VoidType) {
+ } else if (type is VoidTypeImpl) {
// TODO(scheglov): add support for `void` aliasing
return type;
} else {
@@ -2419,7 +2419,7 @@
}
// TODO(scheglov): Optimize for write/read of types without type parameters.
- FunctionType _readFunctionType() {
+ FunctionTypeImpl _readFunctionType() {
// TODO(scheglov): reuse for formal parameters
var typeParameters = _readTypeParameters(null);
var returnType = readRequiredType();
diff --git a/pkg/analyzer/lib/src/summary2/function_type_builder.dart b/pkg/analyzer/lib/src/summary2/function_type_builder.dart
index 27b292c..5aa072c 100644
--- a/pkg/analyzer/lib/src/summary2/function_type_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/function_type_builder.dart
@@ -37,7 +37,7 @@
///
/// When [build] is called, the type is built, stored into this field,
/// and set for the [node].
- FunctionType? _type;
+ FunctionTypeImpl? _type;
FunctionTypeBuilder(
this.typeFormals,
@@ -98,7 +98,7 @@
);
var fresh = getFreshTypeParameters(typeFormals);
- type = fresh.applyToFunctionType(type) as FunctionTypeImpl;
+ type = fresh.applyToFunctionType(type);
_type = type;
node?.type = type;
diff --git a/pkg/analyzer/lib/src/summary2/named_type_builder.dart b/pkg/analyzer/lib/src/summary2/named_type_builder.dart
index f02830c..6110ccf 100644
--- a/pkg/analyzer/lib/src/summary2/named_type_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/named_type_builder.dart
@@ -46,7 +46,7 @@
///
/// When [build] is called, the type is built, stored into this field,
/// and set for the [node].
- DartType? _type;
+ TypeImpl? _type;
NamedTypeBuilder(this.linker, this.typeSystem, this.element, this.arguments,
this.nullabilitySuffix,
@@ -96,7 +96,7 @@
}
var element = this.element;
- if (element is InterfaceElement) {
+ if (element is InterfaceElementImpl) {
var parameters = element.typeParameters;
var arguments = _buildArguments(parameters);
_type = element.instantiate(
diff --git a/pkg/linter/lib/src/rules/invalid_runtime_check_with_js_interop_types.dart b/pkg/linter/lib/src/rules/invalid_runtime_check_with_js_interop_types.dart
index 7bbc6a4..4eeadde 100644
--- a/pkg/linter/lib/src/rules/invalid_runtime_check_with_js_interop_types.dart
+++ b/pkg/linter/lib/src/rules/invalid_runtime_check_with_js_interop_types.dart
@@ -85,9 +85,10 @@
// what we want here.
if (element.metadata2.hasJS) return true;
return _sdkWebLibraries.any((uri) => element.isFromLibrary(uri)) ||
- // While a type test with types from this library is very rare, we should
- // still ignore it for consistency.
- element.isFromLibrary(_dartJsUri);
+ // While a type test with types from this library is very rare, we should
+ // still ignore it for consistency.
+ element
+ .isFromLibrary(_dartJsUri);
}
/// If [type] is a type declared using `@staticInterop` through
@@ -137,7 +138,7 @@
final _visitedTypes = <DartType>{};
@override
- DartType perform(DartType type, {bool keepUserInteropTypes = false}) {
+ TypeImpl perform(TypeImpl type, {bool keepUserInteropTypes = false}) {
_keepUserInteropTypes = keepUserInteropTypes;
_visitedTypes.clear();
return super.perform(type);
@@ -296,11 +297,14 @@
}) {
LintCode? lintCode;
(DartType, DartType) eraseTypes(DartType left, DartType right) {
+ // Note: type casts are needed here because `EraseNonJSInteropTypes`
+ // extends the analyzer's private class `ExtensionTypeErasure`, which uses
+ // `TypeImpl` rather than `DartType`.
DartType erasedLeft = typeSystem.promoteToNonNull(
- eraseNonJsInteropTypes.perform(left),
+ eraseNonJsInteropTypes.perform(left as TypeImpl),
);
DartType erasedRight = typeSystem.promoteToNonNull(
- eraseNonJsInteropTypes.perform(right),
+ eraseNonJsInteropTypes.perform(right as TypeImpl),
);
var leftIsInteropType = _isJsInteropType(
erasedLeft,