Use internally more precise types for typeParameters, remove many casts.

Change-Id: I9d8326c00a2b50aadd4310979e0ec936bfe5e66e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/440780
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
This commit is contained in:
Fedor Shcheglov
2025-07-23 15:16:10 -07:00
committed by Commit Queue
parent 7dee49e473
commit 6556336b1e
9 changed files with 24 additions and 32 deletions
@@ -157,8 +157,7 @@ class ConstantFinder extends RecursiveAstVisitor<void> {
if (fragment != null) {
var element = fragment.element;
constantsToCompute.add(element);
// TODO(scheglov): remove cast
constantsToCompute.addAll(element.baseElement.formalParameters.cast());
constantsToCompute.addAll(element.baseElement.formalParameters);
}
}
}
@@ -171,7 +171,7 @@ class ElementDisplayStringBuilder {
_writeType(element.returnType);
_write(' Function');
_writeTypeParameters(element.typeParameters);
_writeFormalParameters(element.formalParameters.cast(), forElement: true);
_writeFormalParameters(element.formalParameters, forElement: true);
}
void writeGetterElement(GetterElementImpl element) {
+8 -12
View File
@@ -2204,7 +2204,7 @@ abstract class ExecutableElementImpl extends FunctionTypedElementImpl
ExecutableFragmentImpl get firstFragment;
@override
List<FormalParameterElementMixin> get formalParameters {
List<FormalParameterElementImpl> get formalParameters {
_ensureReadResolution();
return firstFragment.formalParameters
.map((fragment) => fragment.asElement2)
@@ -3830,7 +3830,7 @@ class GenericFunctionTypeElementImpl extends FunctionTypedElementImpl
GenericFunctionTypeFragmentImpl get firstFragment => _wrappedElement;
@override
List<FormalParameterElement> get formalParameters =>
List<FormalParameterElementImpl> get formalParameters =>
_wrappedElement.formalParameters
.map((fragment) => fragment.element)
.toList();
@@ -5132,7 +5132,7 @@ abstract class InterfaceFragmentImpl extends InstanceFragmentImpl
List<InterfaceTypeImpl> _interfaces = const [];
/// This callback is set during mixins inference to handle reentrant calls.
List<InterfaceType>? Function(InterfaceFragmentImpl)? mixinInferenceCallback;
List<InterfaceTypeImpl>? Function(InterfaceFragmentImpl)? mixinInferenceCallback;
InterfaceTypeImpl? _supertype;
@@ -5213,9 +5213,7 @@ abstract class InterfaceFragmentImpl extends InstanceFragmentImpl
if (mixinInferenceCallback != null) {
var mixins = mixinInferenceCallback!(this);
if (mixins != null) {
// TODO(paulberry): eliminate this cast by changing the type of
// `InterfaceElementImpl.mixinInferenceCallback`.
return _mixins = mixins.cast();
return _mixins = mixins;
}
}
@@ -7682,10 +7680,8 @@ class MixinFragmentImpl extends InterfaceFragmentImpl implements MixinFragment {
return _superclassConstraints;
}
set superclassConstraints(List<InterfaceType> superclassConstraints) {
// TODO(paulberry): eliminate this cast by changing the type of the
// `superclassConstraints` parameter.
_superclassConstraints = superclassConstraints.cast();
set superclassConstraints(List<InterfaceTypeImpl> superclassConstraints) {
_superclassConstraints = superclassConstraints;
}
@override
@@ -8739,7 +8735,7 @@ abstract class PropertyInducingElementImpl extends VariableElementImpl
if (element.setter case var setterElement?) {
if (setterElement.isSynthetic) {
setterElement.returnType = VoidTypeImpl.instance;
(setterElement.formalParameters.single as FormalParameterElementImpl)
setterElement.formalParameters.single
.type = type;
}
}
@@ -8926,7 +8922,7 @@ class SetterElementImpl extends PropertyAccessorElementImpl
}
FormalParameterElementImpl get valueFormalParameter {
return formalParameters.single as FormalParameterElementImpl;
return formalParameters.single;
}
@override
@@ -224,7 +224,7 @@ abstract class ExecutableMember extends Member
);
default:
return ParameterMember(
baseElement: element as FormalParameterElementImpl,
baseElement: element,
substitution: substitution,
);
}
@@ -1656,7 +1656,7 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
for (var variable in variables.values) {
_define(variable);
}
guardedPattern.variables = variables.cast();
guardedPattern.variables = variables;
guardedPattern.whenClause?.accept(this);
if (then != null) {
then();
@@ -70,7 +70,7 @@ class DefaultValueResolver {
}) {
for (var formalParameter in element.formalParameters) {
_formalParameterElement(
formalParameter as FormalParameterElementImpl,
formalParameter,
enclosingInterfaceElement: enclosingInterfaceElement,
enclosingExecutableElement: element,
);
@@ -259,7 +259,7 @@ class InstanceMemberInferrer {
if (setter != null) {
if (overriddenSetters.any((s) => _isCovariantSetter(s.baseElement))) {
var formalParameter = setter.formalParameters[0];
(formalParameter as FormalParameterElementImpl).inheritsCovariant =
formalParameter.inheritsCovariant =
true;
}
}
@@ -492,7 +492,7 @@ class InstanceMemberInferrer {
for (var index = 0; index < formalParameters.length; index++) {
var formalParameter = formalParameters[index];
_inferParameterCovariance(
formalParameter as FormalParameterElementImpl,
formalParameter,
index,
overriddenElements,
);
@@ -45,11 +45,11 @@ bool _isInterfaceTypeInterface(InterfaceType type) {
return true;
}
List<InterfaceType> _toInterfaceTypeList(List<NamedType>? nodeList) {
List<InterfaceTypeImpl> _toInterfaceTypeList(List<NamedType>? nodeList) {
if (nodeList != null) {
return nodeList
.map((e) => e.type)
.whereType<InterfaceType>()
.whereType<InterfaceTypeImpl>()
.where(_isInterfaceTypeInterface)
.toList();
}
@@ -187,8 +187,7 @@ class TypesBuilder {
case SetterElementImpl():
element.returnType = returnType;
var valueElement =
element.formalParameters.singleOrNull
as FormalParameterElementImpl?;
element.formalParameters.singleOrNull;
var valueNode =
node.functionExpression.parameters?.parameters.firstOrNull;
var valueNodeElement = valueNode?.declaredFragment!.element;
@@ -231,8 +230,7 @@ class TypesBuilder {
case SetterElementImpl():
element.returnType = returnType;
var valueElement =
element.formalParameters.singleOrNull
as FormalParameterElementImpl?;
element.formalParameters.singleOrNull;
var valueNode = node.parameters?.parameters.firstOrNull;
var valueNodeElement = valueNode?.declaredFragment!.element;
var valueNodeType = valueNodeElement?.type;
@@ -268,8 +266,7 @@ class TypesBuilder {
}
if (variableElement.setter case var setterElement?) {
setterElement.returnType = VoidTypeImpl.instance;
(setterElement.formalParameters.single
as FormalParameterElementImpl)
setterElement.formalParameters.single
.type = type;
}
}
@@ -644,14 +641,14 @@ class _MixinsInference {
/// we are inferring the [element] now, i.e. there is a loop.
///
/// This is an error. So, we return the empty list, and break the loop.
List<InterfaceType> _callbackWhenLoop(InterfaceFragmentImpl element) {
List<InterfaceTypeImpl> _callbackWhenLoop(InterfaceFragmentImpl element) {
element.mixinInferenceCallback = null;
return <InterfaceType>[];
return <InterfaceTypeImpl>[];
}
/// This method is invoked when mixins are asked from the [element], and
/// we are not inferring the [element] now, i.e. there is no loop.
List<InterfaceType>? _callbackWhenRecursion(InterfaceFragmentImpl element) {
List<InterfaceTypeImpl>? _callbackWhenRecursion(InterfaceFragmentImpl element) {
var declaration = _declarations[element];
if (declaration != null) {
_inferDeclaration(declaration);
@@ -40,7 +40,7 @@ const a = const A();
var aLib = findElement2.import('package:test/a.dart').importedLibrary!;
var aConstructor = aLib.getClass('A')!.constructors.single;
var p = aConstructor.formalParameters.single as FormalParameterElementImpl;
var p = aConstructor.formalParameters.single;
// To evaluate `const A()` we have to evaluate `{int p}`.
// Even if its value is `null`.