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:
committed by
Commit Queue
parent
7dee49e473
commit
6556336b1e
@@ -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) {
|
||||
|
||||
@@ -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`.
|
||||
|
||||
Reference in New Issue
Block a user