From d80cff6b2ba676fff3eca3eaae1b2855d92718d9 Mon Sep 17 00:00:00 2001 From: Johnni Winther Date: Fri, 10 Sep 2021 11:27:37 +0000 Subject: [PATCH] [cfe] Rename isCovariant and isGenericCovariantImpl - to isCovariantByDeclaration and isCovariantByClass, respectively. This is done to align the terminology with the spec. TEST=existing Change-Id: I96b2e5d6e05caca431aad2b54545e928aee034e5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/213041 Commit-Queue: Johnni Winther Reviewed-by: Dmitry Stefantsov --- .../lib/src/js_model/element_map_impl.dart | 3 +- .../lib/src/kernel/element_map_impl.dart | 3 +- pkg/compiler/lib/src/ssa/builder_kernel.dart | 2 +- pkg/dev_compiler/lib/src/kernel/compiler.dart | 2 +- .../lib/src/kernel/kernel_helpers.dart | 4 +- .../lib/src/kernel/property_model.dart | 4 +- pkg/dev_compiler/lib/src/kernel/target.dart | 19 +++--- .../lib/src/fasta/builder/field_builder.dart | 65 +++++++++---------- .../builder/formal_parameter_builder.dart | 4 +- .../src/fasta/builder/function_builder.dart | 4 +- .../fasta/kernel/class_hierarchy_builder.dart | 34 +++++++--- .../kernel/combined_member_signature.dart | 38 ++++++----- .../lib/src/fasta/kernel/forest.dart | 4 +- .../lib/src/fasta/kernel/internal_ast.dart | 4 +- .../src/fasta/kernel/member_covariance.dart | 20 +++--- .../fasta/source/source_class_builder.dart | 42 ++++++------ pkg/kernel/binary.md | 10 +-- pkg/kernel/lib/ast.dart | 52 +++++++-------- pkg/kernel/lib/naive_type_checker.dart | 22 ++++--- pkg/kernel/lib/text/ast_to_text.dart | 10 +-- pkg/kernel/lib/text/text_serializer.dart | 2 +- .../mixin_full_resolution.dart | 12 ++-- .../transformations/call_site_annotator.dart | 4 +- .../transformations/type_flow/analysis.dart | 6 +- .../type_flow/signature_shaking.dart | 2 +- .../transformations/type_flow/summary.dart | 2 +- .../type_flow/summary_collector.dart | 2 +- .../type_flow/transformer.dart | 4 +- 28 files changed, 203 insertions(+), 177 deletions(-) diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart index 22d4a6106ea..364ce65d4cb 100644 --- a/pkg/compiler/lib/src/js_model/element_map_impl.dart +++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart @@ -882,7 +882,8 @@ class JsKernelToElementMap implements JsToElementMap, IrToElementMap { DartType getParameterType(ir.VariableDeclaration variable) { // isCovariant implies this FunctionNode is a class Procedure. - var isCovariant = variable.isCovariant || variable.isGenericCovariantImpl; + var isCovariant = + variable.isCovariantByDeclaration || variable.isCovariantByClass; var isFromNonNullableByDefaultLibrary = isCovariant && (node.parent as ir.Procedure).enclosingLibrary.isNonNullableByDefault; return types.getTearOffParameterType(getDartType(variable.type), diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart index 7bf5db7e054..08eea7155ad 100644 --- a/pkg/compiler/lib/src/kernel/element_map_impl.dart +++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart @@ -518,7 +518,8 @@ class KernelToElementMapImpl implements KernelToElementMap, IrToElementMap { DartType getParameterType(ir.VariableDeclaration variable) { // isCovariant implies this FunctionNode is a class Procedure. - var isCovariant = variable.isCovariant || variable.isGenericCovariantImpl; + var isCovariant = + variable.isCovariantByDeclaration || variable.isCovariantByClass; var isFromNonNullableByDefaultLibrary = isCovariant && (node.parent as ir.Procedure).enclosingLibrary.isNonNullableByDefault; return types.getTearOffParameterType(getDartType(variable.type), diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart index e74ad8a424d..d1755aa40d2 100644 --- a/pkg/compiler/lib/src/ssa/builder_kernel.dart +++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart @@ -1409,7 +1409,7 @@ class KernelSsaGraphBuilder extends ir.Visitor with ir.VisitorVoidMixin { if (targetChecks.checkAllParameters || (targetChecks.checkCovariantParameters && - (variable.isGenericCovariantImpl || variable.isCovariant))) { + (variable.isCovariantByClass || variable.isCovariantByDeclaration))) { newParameter = _typeBuilder.potentiallyCheckOrTrustTypeOfParameter( targetElement, newParameter, type); } else { diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart index 102b0e857de..dbea6f07c32 100644 --- a/pkg/dev_compiler/lib/src/kernel/compiler.dart +++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart @@ -3719,7 +3719,7 @@ class ProgramCompiler extends ComputeOnceConstantVisitor void _emitCovarianceBoundsCheck( List typeFormals, List body) { for (var t in typeFormals) { - if (t.isGenericCovariantImpl && !_types.isTop(t.bound)) { + if (t.isCovariantByClass && !_types.isTop(t.bound)) { body.add(runtimeStatement('checkTypeBound(#, #, #)', [ _emitTypeParameterType(TypeParameterType(t, Nullability.undetermined), emitNullability: false), diff --git a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart index 166080a22e6..958e4afc7a1 100644 --- a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart +++ b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart @@ -211,13 +211,13 @@ bool isInlineJS(Member e) => /// Whether the parameter [p] is covariant (either explicitly `covariant` or /// implicitly due to generics) and needs a check for soundness. bool isCovariantParameter(VariableDeclaration p) { - return p.isCovariant || p.isGenericCovariantImpl; + return p.isCovariantByDeclaration || p.isCovariantByClass; } /// Whether the field [p] is covariant (either explicitly `covariant` or /// implicitly due to generics) and needs a check for soundness. bool isCovariantField(Field f) { - return f.isCovariant || f.isGenericCovariantImpl; + return f.isCovariantByDeclaration || f.isCovariantByClass; } /// Returns true iff this factory constructor just throws [UnsupportedError]/ diff --git a/pkg/dev_compiler/lib/src/kernel/property_model.dart b/pkg/dev_compiler/lib/src/kernel/property_model.dart index fc403b30014..294b9a3ed59 100644 --- a/pkg/dev_compiler/lib/src/kernel/property_model.dart +++ b/pkg/dev_compiler/lib/src/kernel/property_model.dart @@ -273,8 +273,8 @@ class ClassPropertyModel { var name = field.name.text; if (virtualAccessorNames.contains(name) || fieldModel.isVirtual(field) || - field.isCovariant || - field.isGenericCovariantImpl) { + field.isCovariantByDeclaration || + field.isCovariantByClass) { virtualFields[field] = js_ast.TemporaryId(js_ast.toJSIdentifier(name)); } } diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart index 2bab5158ea0..2f8ae5c2185 100644 --- a/pkg/dev_compiler/lib/src/kernel/target.dart +++ b/pkg/dev_compiler/lib/src/kernel/target.dart @@ -276,14 +276,15 @@ class _CovarianceTransformer extends RecursiveVisitor { _CovarianceTransformer(this._library); - /// Transforms [_library], eliminating unncessary checks for private members. + /// Transforms [_library], eliminating unnecessary checks for private members. /// /// Kernel will mark covariance checks on members, for example: - /// - a field with [Field.isGenericCovariantImpl] or [Field.isCovariant]. + /// - a field with [Field.isCovariantByClass] or + /// [Field.isCovariantByDeclaration]. /// - a method/setter with parameter(s) or type parameter(s) that have - /// `isGenericCovariantImpl` or `isCovariant` set. + /// `isCovariantByClass` or `isCovariantByDeclaration` set. /// - /// If the check can be safely eliminanted, those properties will be set to + /// If the check can be safely eliminated, those properties will be set to /// false so the JS compiler does not emit checks. /// /// Public members always need covariance checks (we cannot see all potential @@ -319,13 +320,13 @@ class _CovarianceTransformer extends RecursiveVisitor { // Update the tree based on the methods that need checks. for (var field in _privateFields) { if (!_checkedMembers.contains(field)) { - field.isCovariant = false; - field.isGenericCovariantImpl = false; + field.isCovariantByDeclaration = false; + field.isCovariantByClass = false; } } void clearCovariant(VariableDeclaration parameter) { - parameter.isCovariant = false; - parameter.isGenericCovariantImpl = false; + parameter.isCovariantByDeclaration = false; + parameter.isCovariantByClass = false; } for (var member in _privateProcedures) { @@ -334,7 +335,7 @@ class _CovarianceTransformer extends RecursiveVisitor { function.positionalParameters.forEach(clearCovariant); function.namedParameters.forEach(clearCovariant); for (var t in function.typeParameters) { - t.isGenericCovariantImpl = false; + t.isCovariantByClass = false; } } } diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart index e3b28d2952f..2c6ea0cc31d 100644 --- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart @@ -50,7 +50,7 @@ abstract class FieldBuilder implements MemberBuilder { TypeBuilder? get type; - bool get isCovariant; + bool get isCovariantByDeclaration; bool get isLate; @@ -154,7 +154,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder { isAbstract: isAbstract, isExternal: isExternal, isFinal: isFinal, - isCovariant: isCovariant, + isCovariantByDeclaration: isCovariantByDeclaration, isNonNullableByDefault: library.isNonNullableByDefault); } else if (isLate && libraryBuilder.loader.target.backendTarget.isLateFieldLoweringEnabled( @@ -175,7 +175,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder { lateIsSetSetterReference, lateGetterReference, lateSetterReference, - isCovariant, + isCovariantByDeclaration, isSetStrategy); } else { _fieldEncoding = new LateFieldWithInitializerEncoding( @@ -190,7 +190,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder { lateIsSetSetterReference, lateGetterReference, lateSetterReference, - isCovariant, + isCovariantByDeclaration, isSetStrategy); } } else { @@ -207,7 +207,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder { lateIsSetSetterReference, lateGetterReference, lateSetterReference, - isCovariant, + isCovariantByDeclaration, isSetStrategy); } else { _fieldEncoding = new LateFieldWithoutInitializerEncoding( @@ -222,7 +222,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder { lateIsSetSetterReference, lateGetterReference, lateSetterReference, - isCovariant, + isCovariantByDeclaration, isSetStrategy); } } @@ -244,7 +244,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder { lateIsSetSetterReference, lateGetterReference, lateSetterReference, - isCovariant, + isCovariantByDeclaration, isSetStrategy); } else { _fieldEncoding = new LateFieldWithInitializerEncoding( @@ -259,7 +259,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder { lateIsSetSetterReference, lateGetterReference, lateSetterReference, - isCovariant, + isCovariantByDeclaration, isSetStrategy); } } else { @@ -320,7 +320,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder { bool get isLate => (modifiers & lateMask) != 0; @override - bool get isCovariant => (modifiers & covariantMask) != 0; + bool get isCovariantByDeclaration => (modifiers & covariantMask) != 0; @override bool get hasInitializer => (modifiers & hasInitializerMask) != 0; @@ -665,7 +665,7 @@ class RegularFieldEncoding implements FieldEncoding { @override void build( SourceLibraryBuilder libraryBuilder, SourceFieldBuilder fieldBuilder) { - _field..isCovariant = fieldBuilder.isCovariant; + _field..isCovariantByDeclaration = fieldBuilder.isCovariantByDeclaration; if (fieldBuilder.isExtensionMember) { _field ..isStatic = true @@ -695,7 +695,7 @@ class RegularFieldEncoding implements FieldEncoding { @override void setGenericCovariantImpl() { - _field.isGenericCovariantImpl = true; + _field.isCovariantByClass = true; } @override @@ -814,7 +814,7 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding { Reference? lateIsSetSetterReference, Reference? lateGetterReference, Reference? lateSetterReference, - bool isCovariant, + bool isCovariantByDeclaration, late_lowering.IsSetStrategy isSetStrategy) : fileOffset = charOffset, fileEndOffset = charEndOffset, @@ -867,7 +867,7 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding { fileUri, charOffset, lateSetterReference, - isCovariant: isCovariant); + isCovariantByDeclaration: isCovariantByDeclaration); } late_lowering.IsSetEncoding get isSetEncoding { @@ -975,11 +975,11 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding { Procedure? _createSetter( Name name, Uri fileUri, int charOffset, Reference? reference, - {required bool isCovariant}) { + {required bool isCovariantByDeclaration}) { // ignore: unnecessary_null_comparison - assert(isCovariant != null); + assert(isCovariantByDeclaration != null); VariableDeclaration parameter = new VariableDeclaration(null) - ..isCovariant = isCovariant + ..isCovariantByDeclaration = isCovariantByDeclaration ..fileOffset = fileOffset; return new Procedure( name, @@ -1025,9 +1025,8 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding { @override void setGenericCovariantImpl() { - _field.isGenericCovariantImpl = true; - _lateSetter?.function.positionalParameters.single.isGenericCovariantImpl = - true; + _field.isCovariantByClass = true; + _lateSetter?.function.positionalParameters.single.isCovariantByClass = true; } @override @@ -1198,7 +1197,7 @@ class LateFieldWithoutInitializerEncoding extends AbstractLateFieldEncoding Reference? lateIsSetSetterReference, Reference? lateGetterReference, Reference? lateSetterReference, - bool isCovariant, + bool isCovariantByDeclaration, late_lowering.IsSetStrategy isSetStrategy) : super( name, @@ -1212,7 +1211,7 @@ class LateFieldWithoutInitializerEncoding extends AbstractLateFieldEncoding lateIsSetSetterReference, lateGetterReference, lateSetterReference, - isCovariant, + isCovariantByDeclaration, isSetStrategy); } @@ -1230,7 +1229,7 @@ class LateFieldWithInitializerEncoding extends AbstractLateFieldEncoding Reference? lateIsSetSetterReference, Reference? lateGetterReference, Reference? lateSetterReference, - bool isCovariant, + bool isCovariantByDeclaration, late_lowering.IsSetStrategy isSetStrategy) : super( name, @@ -1244,7 +1243,7 @@ class LateFieldWithInitializerEncoding extends AbstractLateFieldEncoding lateIsSetSetterReference, lateGetterReference, lateSetterReference, - isCovariant, + isCovariantByDeclaration, isSetStrategy); @override @@ -1277,7 +1276,7 @@ class LateFinalFieldWithoutInitializerEncoding extends AbstractLateFieldEncoding Reference? lateIsSetSetterReference, Reference? lateGetterReference, Reference? lateSetterReference, - bool isCovariant, + bool isCovariantByDeclaration, late_lowering.IsSetStrategy isSetStrategy) : super( name, @@ -1291,7 +1290,7 @@ class LateFinalFieldWithoutInitializerEncoding extends AbstractLateFieldEncoding lateIsSetSetterReference, lateGetterReference, lateSetterReference, - isCovariant, + isCovariantByDeclaration, isSetStrategy); @override @@ -1325,7 +1324,7 @@ class LateFinalFieldWithInitializerEncoding extends AbstractLateFieldEncoding { Reference? lateIsSetSetterReference, Reference? lateGetterReference, Reference? lateSetterReference, - bool isCovariant, + bool isCovariantByDeclaration, late_lowering.IsSetStrategy isSetStrategy) : super( name, @@ -1339,7 +1338,7 @@ class LateFinalFieldWithInitializerEncoding extends AbstractLateFieldEncoding { lateIsSetSetterReference, lateGetterReference, lateSetterReference, - isCovariant, + isCovariantByDeclaration, isSetStrategy); @override Statement _createGetterBody( @@ -1360,7 +1359,7 @@ class LateFinalFieldWithInitializerEncoding extends AbstractLateFieldEncoding { @override Procedure? _createSetter( Name name, Uri fileUri, int charOffset, Reference? reference, - {required bool isCovariant}) => + {required bool isCovariantByDeclaration}) => null; @override @@ -1537,7 +1536,7 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding { {required this.isAbstract, required this.isExternal, required bool isFinal, - required bool isCovariant, + required bool isCovariantByDeclaration, required bool isNonNullableByDefault}) // ignore: unnecessary_null_comparison : assert(isAbstract != null), @@ -1546,7 +1545,7 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding { // ignore: unnecessary_null_comparison assert(isFinal != null), // ignore: unnecessary_null_comparison - assert(isCovariant != null), + assert(isCovariantByDeclaration != null), // ignore: unnecessary_null_comparison assert(isNonNullableByDefault != null), _isExtensionInstanceMember = isExternal && @@ -1567,7 +1566,7 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding { if (!isFinal) { VariableDeclaration parameter = new VariableDeclaration("#externalFieldValue") - ..isCovariant = isCovariant + ..isCovariantByDeclaration = isCovariantByDeclaration ..fileOffset = charOffset; _setter = new Procedure( nameScheme.getProcedureName(ProcedureKind.Setter, name), @@ -1600,7 +1599,7 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding { if (!isFinal) { VariableDeclaration parameter = new VariableDeclaration("#externalFieldValue") - ..isCovariant = isCovariant + ..isCovariantByDeclaration = isCovariantByDeclaration ..fileOffset = charOffset; _setter = new Procedure( nameScheme.getFieldName(FieldNameType.Setter, name, @@ -1742,7 +1741,7 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding { @override void setGenericCovariantImpl() { - _setter!.function.positionalParameters.first.isGenericCovariantImpl = true; + _setter!.function.positionalParameters.first.isCovariantByClass = true; } @override diff --git a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart index 216d04493be..bd77903e333 100644 --- a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart @@ -116,7 +116,7 @@ class FormalParameterBuilder extends ModifierBuilderImpl bool get isInitializingFormal => (modifiers & initializingFormalMask) != 0; - bool get isCovariant => (modifiers & covariantMask) != 0; + bool get isCovariantByDeclaration => (modifiers & covariantMask) != 0; // An initializing formal parameter might be final without its // VariableDeclaration being final. See @@ -142,7 +142,7 @@ class FormalParameterBuilder extends ModifierBuilderImpl isFinal: isFinal, isConst: isConst, isFieldFormal: isInitializingFormal, - isCovariant: isCovariant, + isCovariantByDeclaration: isCovariantByDeclaration, isRequired: isNamedRequired, hasDeclaredInitializer: hasDeclaredInitializer, isLowered: isExtensionThis) diff --git a/pkg/front_end/lib/src/fasta/builder/function_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_builder.dart index c4628003541..0f1cb27a56a 100644 --- a/pkg/front_end/lib/src/fasta/builder/function_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/function_builder.dart @@ -346,7 +346,7 @@ abstract class FunctionBuilderImpl extends MemberBuilderImpl function.typeParameters.add(parameter); if (needsCheckVisitor != null) { if (parameter.bound.accept(needsCheckVisitor)) { - parameter.isGenericCovariantImpl = true; + parameter.isCovariantByClass = true; } } } @@ -358,7 +358,7 @@ abstract class FunctionBuilderImpl extends MemberBuilderImpl nonInstanceContext: !isConstructor && !isDeclarationInstanceMember); if (needsCheckVisitor != null) { if (parameter.type.accept(needsCheckVisitor)) { - parameter.isGenericCovariantImpl = true; + parameter.isCovariantByClass = true; } } if (formal.isNamed) { diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart index 99eba28b303..b11496e3e1e 100644 --- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart +++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart @@ -422,7 +422,9 @@ bool hasSameSignature(FunctionNode a, FunctionNode b) { List aTypeParameters = a.typeParameters; List bTypeParameters = b.typeParameters; int typeParameterCount = aTypeParameters.length; - if (typeParameterCount != bTypeParameters.length) return false; + if (typeParameterCount != bTypeParameters.length) { + return false; + } Substitution? substitution; if (typeParameterCount != 0) { List types = new List.generate( @@ -434,11 +436,15 @@ bool hasSameSignature(FunctionNode a, FunctionNode b) { for (int i = 0; i < typeParameterCount; i++) { DartType aBound = aTypeParameters[i].bound; DartType bBound = substitution.substituteType(bTypeParameters[i].bound); - if (aBound != bBound) return false; + if (aBound != bBound) { + return false; + } } } - if (a.requiredParameterCount != b.requiredParameterCount) return false; + if (a.requiredParameterCount != b.requiredParameterCount) { + return false; + } List aPositionalParameters = a.positionalParameters; List bPositionalParameters = b.positionalParameters; if (aPositionalParameters.length != bPositionalParameters.length) { @@ -447,7 +453,10 @@ bool hasSameSignature(FunctionNode a, FunctionNode b) { for (int i = 0; i < aPositionalParameters.length; i++) { VariableDeclaration aParameter = aPositionalParameters[i]; VariableDeclaration bParameter = bPositionalParameters[i]; - if (aParameter.isCovariant != bParameter.isCovariant) return false; + if (aParameter.isCovariantByDeclaration != + bParameter.isCovariantByDeclaration) { + return false; + } DartType aType = aParameter.type; DartType bType = bParameter.type; if (substitution != null) { @@ -458,18 +467,27 @@ bool hasSameSignature(FunctionNode a, FunctionNode b) { List aNamedParameters = a.namedParameters; List bNamedParameters = b.namedParameters; - if (aNamedParameters.length != bNamedParameters.length) return false; + if (aNamedParameters.length != bNamedParameters.length) { + return false; + } for (int i = 0; i < aNamedParameters.length; i++) { VariableDeclaration aParameter = aNamedParameters[i]; VariableDeclaration bParameter = bNamedParameters[i]; - if (aParameter.isCovariant != bParameter.isCovariant) return false; - if (aParameter.name != bParameter.name) return false; + if (aParameter.isCovariantByDeclaration != + bParameter.isCovariantByDeclaration) { + return false; + } + if (aParameter.name != bParameter.name) { + return false; + } DartType aType = aParameter.type; DartType bType = bParameter.type; if (substitution != null) { bType = substitution.substituteType(bType); } - if (aType != bType) return false; + if (aType != bType) { + return false; + } } DartType aReturnType = a.returnType; diff --git a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart index 59f914c41ea..414c8c26bdc 100644 --- a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart +++ b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart @@ -483,8 +483,8 @@ abstract class CombinedMemberSignatureBase { member.function.positionalParameters.first; combinedMemberSignature = _createSetterMemberSignature( member, combinedMemberSignatureType!, - isGenericCovariantImpl: parameter.isGenericCovariantImpl, - isCovariant: parameter.isCovariant, + isCovariantByClass: parameter.isCovariantByClass, + isCovariantByDeclaration: parameter.isCovariantByDeclaration, parameter: parameter, copyLocation: copyLocation); break; @@ -503,8 +503,8 @@ abstract class CombinedMemberSignatureBase { if (forSetter) { combinedMemberSignature = _createSetterMemberSignature( member, combinedMemberSignatureType!, - isGenericCovariantImpl: member.isGenericCovariantImpl, - isCovariant: member.isCovariant, + isCovariantByClass: member.isCovariantByClass, + isCovariantByDeclaration: member.isCovariantByDeclaration, copyLocation: copyLocation); } else { combinedMemberSignature = _createGetterMemberSignature( @@ -559,17 +559,18 @@ abstract class CombinedMemberSignatureBase { } /// Creates a setter member signature for [member] with the given - /// [type]. The flags of parameter is set according to [isCovariant] and - /// [isGenericCovariantImpl] and the [parameterName] is used, if provided. + /// [type]. The flags of parameter is set according to + /// [isCovariantByDeclaration] and [isCovariantByClass] and the name of the + /// [parameter] is used, if provided. Procedure _createSetterMemberSignature(Member member, DartType type, - {required bool isCovariant, - required bool isGenericCovariantImpl, + {required bool isCovariantByDeclaration, + required bool isCovariantByClass, VariableDeclaration? parameter, required bool copyLocation}) { // ignore: unnecessary_null_comparison - assert(isCovariant != null); + assert(isCovariantByDeclaration != null); // ignore: unnecessary_null_comparison - assert(isGenericCovariantImpl != null); + assert(isCovariantByClass != null); // ignore: unnecessary_null_comparison assert(copyLocation != null); Class enclosingClass = classBuilder.cls; @@ -594,8 +595,8 @@ abstract class CombinedMemberSignatureBase { returnType: const VoidType(), positionalParameters: [ new VariableDeclaration(parameter?.name ?? 'value', - type: type, isCovariant: isCovariant) - ..isGenericCovariantImpl = isGenericCovariantImpl + type: type, isCovariantByDeclaration: isCovariantByDeclaration) + ..isCovariantByClass = isCovariantByClass ..fileOffset = copyLocation ? parameter?.fileOffset ?? fileOffset : fileOffset @@ -638,8 +639,9 @@ abstract class CombinedMemberSignatureBase { VariableDeclaration parameter = function.positionalParameters[i]; DartType parameterType = functionType.positionalParameters[i]; positionalParameters.add(new VariableDeclaration(parameter.name, - type: parameterType, isCovariant: parameter.isCovariant) - ..isGenericCovariantImpl = parameter.isGenericCovariantImpl + type: parameterType, + isCovariantByDeclaration: parameter.isCovariantByDeclaration) + ..isCovariantByClass = parameter.isCovariantByClass ..fileOffset = copyLocation ? parameter.fileOffset : fileOffset); } List namedParameters = []; @@ -650,8 +652,8 @@ abstract class CombinedMemberSignatureBase { namedParameters.add(new VariableDeclaration(parameter.name, type: namedType.type, isRequired: namedType.isRequired, - isCovariant: parameter.isCovariant) - ..isGenericCovariantImpl = parameter.isGenericCovariantImpl + isCovariantByDeclaration: parameter.isCovariantByDeclaration) + ..isCovariantByClass = parameter.isCovariantByClass ..fileOffset = copyLocation ? parameter.fileOffset : fileOffset); } else if (namedParameterCount > 1) { Map namedTypes = {}; @@ -664,8 +666,8 @@ abstract class CombinedMemberSignatureBase { namedParameters.add(new VariableDeclaration(parameter.name, type: namedParameterType.type, isRequired: namedParameterType.isRequired, - isCovariant: parameter.isCovariant) - ..isGenericCovariantImpl = parameter.isGenericCovariantImpl + isCovariantByDeclaration: parameter.isCovariantByDeclaration) + ..isCovariantByClass = parameter.isCovariantByClass ..fileOffset = copyLocation ? parameter.fileOffset : fileOffset); } } diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart index 12ba2264bfa..2d5435a7e0d 100644 --- a/pkg/front_end/lib/src/fasta/kernel/forest.dart +++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart @@ -645,7 +645,7 @@ class Forest { bool isFinal: false, bool isConst: false, bool isFieldFormal: false, - bool isCovariant: false, + bool isCovariantByDeclaration: false, bool isLocalFunction: false}) { // ignore: unnecessary_null_comparison assert(fileOffset != null); @@ -655,7 +655,7 @@ class Forest { isFinal: isFinal, isConst: isConst, isFieldFormal: isFieldFormal, - isCovariant: isCovariant, + isCovariantByDeclaration: isCovariantByDeclaration, isLocalFunction: isLocalFunction, hasDeclaredInitializer: initializer != null); } diff --git a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart index 3a1de7dd828..92a9dca9397 100644 --- a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart +++ b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart @@ -1592,7 +1592,7 @@ class VariableDeclarationImpl extends VariableDeclaration { bool isFinal: false, bool isConst: false, bool isFieldFormal: false, - bool isCovariant: false, + bool isCovariantByDeclaration: false, bool isLocalFunction: false, bool isLate: false, bool isRequired: false, @@ -1606,7 +1606,7 @@ class VariableDeclarationImpl extends VariableDeclaration { isFinal: isFinal, isConst: isConst, isFieldFormal: isFieldFormal, - isCovariant: isCovariant, + isCovariantByDeclaration: isCovariantByDeclaration, isLate: isLate, isRequired: isRequired, isLowered: isLowered); diff --git a/pkg/front_end/lib/src/fasta/kernel/member_covariance.dart b/pkg/front_end/lib/src/fasta/kernel/member_covariance.dart index 03c89ce7268..1e7600cf540 100644 --- a/pkg/front_end/lib/src/fasta/kernel/member_covariance.dart +++ b/pkg/front_end/lib/src/fasta/kernel/member_covariance.dart @@ -17,32 +17,32 @@ class Covariance { /// Returns the covariance mask for [parameter]. static int covarianceFromParameter(VariableDeclaration parameter) => - (parameter.isCovariant ? Covariant : 0) | - (parameter.isGenericCovariantImpl ? GenericCovariantImpl : 0); + (parameter.isCovariantByDeclaration ? Covariant : 0) | + (parameter.isCovariantByClass ? GenericCovariantImpl : 0); /// Returns the covariance mask for [field]. static int covarianceFromField(Field field) => - (field.isCovariant ? Covariant : 0) | - (field.isGenericCovariantImpl ? GenericCovariantImpl : 0); + (field.isCovariantByDeclaration ? Covariant : 0) | + (field.isCovariantByClass ? GenericCovariantImpl : 0); /// Applies the [covariance] mask to [parameter]. static void covarianceToParameter( int covariance, VariableDeclaration parameter) { if ((covariance & Covariant) != 0) { - parameter.isCovariant = true; + parameter.isCovariantByDeclaration = true; } if ((covariance & GenericCovariantImpl) != 0) { - parameter.isGenericCovariantImpl = true; + parameter.isCovariantByClass = true; } } /// Applies the [covariance] mask to parameter. static void covarianceToField(int covariance, Field field) { if ((covariance & Covariant) != 0) { - field.isCovariant = true; + field.isCovariantByDeclaration = true; } if ((covariance & GenericCovariantImpl) != 0) { - field.isGenericCovariantImpl = true; + field.isCovariantByClass = true; } } @@ -133,7 +133,7 @@ class Covariance { List? typeParameters; if (function.typeParameters.isNotEmpty) { for (int index = 0; index < function.typeParameters.length; index++) { - if (function.typeParameters[index].isGenericCovariantImpl) { + if (function.typeParameters[index].isCovariantByClass) { typeParameters ??= new List.filled(function.typeParameters.length, false); typeParameters[index] = true; @@ -289,7 +289,7 @@ class Covariance { for (int index = 0; index < typeParameters.length; index++) { if (index < function.typeParameters.length) { if (typeParameters[index]) { - function.typeParameters[index].isGenericCovariantImpl = true; + function.typeParameters[index].isCovariantByClass = true; } } } diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart index 08090821b8f..cfd33e0d3c2 100644 --- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart +++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart @@ -353,7 +353,7 @@ class SourceClassBuilder extends ClassBuilderImpl } if (fieldBuilder.isClassInstanceMember && fieldBuilder.isAssignable && - !fieldBuilder.isCovariant) { + !fieldBuilder.isCovariantByDeclaration) { fieldVariance = Variance.combine(Variance.contravariant, fieldVariance); reportVariancePositionIfInvalid(fieldVariance, typeParameter, fieldBuilder.fileUri, fieldBuilder.charOffset); @@ -385,7 +385,7 @@ class SourceClassBuilder extends ClassBuilderImpl // ignore: unnecessary_null_comparison if (positionalParameters != null) { for (VariableDeclaration formal in positionalParameters) { - if (!formal.isCovariant) { + if (!formal.isCovariantByDeclaration) { for (TypeParameter typeParameter in typeParameters) { int formalVariance = Variance.combine(Variance.contravariant, computeVariance(typeParameter, formal.type)); @@ -1285,7 +1285,7 @@ class SourceClassBuilder extends ClassBuilderImpl for (int i = 0; i < declaredFunction.typeParameters.length; ++i) { TypeParameter declaredParameter = declaredFunction.typeParameters[i]; TypeParameter interfaceParameter = interfaceFunction!.typeParameters[i]; - if (!interfaceParameter.isGenericCovariantImpl) { + if (!interfaceParameter.isCovariantByClass) { DartType declaredBound = declaredParameter.bound; DartType interfaceBound = interfaceParameter.bound; if (interfaceSubstitution != null) { @@ -1359,7 +1359,7 @@ class SourceClassBuilder extends ClassBuilderImpl Member interfaceMemberOrigin, DartType declaredType, DartType interfaceType, - bool isCovariant, + bool isCovariantByDeclaration, VariableDeclaration? declaredParameter, bool isInterfaceCheck, bool declaredNeedsLegacyErasure, @@ -1386,7 +1386,7 @@ class SourceClassBuilder extends ClassBuilderImpl if (types.isSubtypeOf( subtype, supertype, SubtypeCheckMode.withNullabilities)) { // No problem--the proper subtyping relation is satisfied. - } else if (isCovariant && + } else if (isCovariantByDeclaration && types.isSubtypeOf( supertype, subtype, SubtypeCheckMode.withNullabilities)) { // No problem--the overriding parameter is marked "covariant" and has @@ -1398,7 +1398,7 @@ class SourceClassBuilder extends ClassBuilderImpl // Report an error. bool isErrorInNnbdOptedOutMode = !types.isSubtypeOf( subtype, supertype, SubtypeCheckMode.ignoringNullabilities) && - (!isCovariant || + (!isCovariantByDeclaration || !types.isSubtypeOf( supertype, subtype, SubtypeCheckMode.ignoringNullabilities)); if (isErrorInNnbdOptedOutMode || library.isNonNullableByDefault) { @@ -1493,8 +1493,8 @@ class SourceClassBuilder extends ClassBuilderImpl interfaceMemberOrigin, declaredFunction.returnType, interfaceFunction.returnType, - false, - null, + /* isCovariantByDeclaration = */ false, + /* declaredParameter = */ null, isInterfaceCheck, declaredNeedsLegacyErasure); if (declaredFunction.positionalParameters.length < @@ -1563,11 +1563,12 @@ class SourceClassBuilder extends ClassBuilderImpl interfaceMemberOrigin, declaredParameter.type, interfaceParameter.type, - declaredParameter.isCovariant || interfaceParameter.isCovariant, + declaredParameter.isCovariantByDeclaration || + interfaceParameter.isCovariantByDeclaration, declaredParameter, isInterfaceCheck, declaredNeedsLegacyErasure); - if (declaredParameter.isCovariant) seenCovariant = true; + if (declaredParameter.isCovariantByDeclaration) seenCovariant = true; } if (declaredFunction.namedParameters.isEmpty && interfaceFunction.namedParameters.isEmpty) { @@ -1643,7 +1644,7 @@ class SourceClassBuilder extends ClassBuilderImpl interfaceMemberOrigin, declaredParameter.type, interfaceNamedParameters.current.type, - declaredParameter.isCovariant, + declaredParameter.isCovariantByDeclaration, declaredParameter, isInterfaceCheck, declaredNeedsLegacyErasure); @@ -1670,7 +1671,7 @@ class SourceClassBuilder extends ClassBuilderImpl interfaceMemberOrigin.fileOffset, noLength) ]); } - if (declaredParameter.isCovariant) seenCovariant = true; + if (declaredParameter.isCovariantByDeclaration) seenCovariant = true; } return seenCovariant; } @@ -1709,7 +1710,7 @@ class SourceClassBuilder extends ClassBuilderImpl interfaceMemberOrigin, declaredType, interfaceType, - /* isCovariant = */ false, + /* isCovariantByDeclaration = */ false, /* declaredParameter = */ null, isInterfaceCheck, declaredNeedsLegacyErasure); @@ -1745,12 +1746,13 @@ class SourceClassBuilder extends ClassBuilderImpl DartType interfaceType = interfaceMember.setterType; VariableDeclaration? declaredParameter = declaredMember.function?.positionalParameters.elementAt(0); - bool isCovariant = declaredParameter?.isCovariant ?? false; - if (!isCovariant && declaredMember is Field) { - isCovariant = declaredMember.isCovariant; + bool isCovariantByDeclaration = + declaredParameter?.isCovariantByDeclaration ?? false; + if (!isCovariantByDeclaration && declaredMember is Field) { + isCovariantByDeclaration = declaredMember.isCovariantByDeclaration; } - if (!isCovariant && interfaceMember is Field) { - isCovariant = interfaceMember.isCovariant; + if (!isCovariantByDeclaration && interfaceMember is Field) { + isCovariantByDeclaration = interfaceMember.isCovariantByDeclaration; } _checkTypes( types, @@ -1761,12 +1763,12 @@ class SourceClassBuilder extends ClassBuilderImpl interfaceMemberOrigin, declaredType, interfaceType, - isCovariant, + isCovariantByDeclaration, declaredParameter, isInterfaceCheck, declaredNeedsLegacyErasure, asIfDeclaredParameter: true); - return isCovariant; + return isCovariantByDeclaration; } // When the overriding member is inherited, report the class containing diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md index bf0cb40c6f7..06ba9682d6b 100644 --- a/pkg/kernel/binary.md +++ b/pkg/kernel/binary.md @@ -368,8 +368,8 @@ type Field extends Member { UriReference fileUri; FileOffset fileOffset; FileOffset fileEndOffset; - UInt flags (isFinal, isConst, isStatic, isCovariant, - isGenericCovariantImpl, isLate, isExtensionMember, + UInt flags (isFinal, isConst, isStatic, isCovariantByDeclaration, + isCovariantByClass, isLate, isExtensionMember, isNonNullableByDefault, isInternalImplementation); Name name; List annotations; @@ -1377,8 +1377,8 @@ type VariableDeclarationPlain { List annotations; - Byte flags (isFinal, isConst, isFieldFormal, isCovariant, - isGenericCovariantImpl, isLate, isRequired, isLowered); + Byte flags (isFinal, isConst, isFieldFormal, isCovariantByDeclaration, + isCovariantByClass, isLate, isRequired, isLowered); // For named parameters, this is the parameter name. // For other variables, the name is cosmetic, may be empty, // and is not necessarily unique. @@ -1501,7 +1501,7 @@ type TypedefType { type TypeParameter { // Note: there is no tag on TypeParameter - Byte flags (isGenericCovariantImpl); + Byte flags (isCovariantByClass); List annotations; Byte variance; // Index into the Variance enum above StringReference name; // Cosmetic, may be empty, not unique. diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart index a95b5d363f1..9a4165c8911 100644 --- a/pkg/kernel/lib/ast.dart +++ b/pkg/kernel/lib/ast.dart @@ -1865,7 +1865,7 @@ class Field extends Member { Field.mutable(Name name, {this.type: const DynamicType(), this.initializer, - bool isCovariant: false, + bool isCovariantByDeclaration: false, bool isFinal: false, bool isStatic: false, bool isLate: false, @@ -1879,7 +1879,7 @@ class Field extends Member { // ignore: unnecessary_null_comparison assert(type != null); initializer?.parent = this; - this.isCovariant = isCovariant; + this.isCovariantByDeclaration = isCovariantByDeclaration; this.isFinal = isFinal; this.isStatic = isStatic; this.isLate = isLate; @@ -1889,7 +1889,7 @@ class Field extends Member { Field.immutable(Name name, {this.type: const DynamicType(), this.initializer, - bool isCovariant: false, + bool isCovariantByDeclaration: false, bool isFinal: false, bool isConst: false, bool isStatic: false, @@ -1902,7 +1902,7 @@ class Field extends Member { // ignore: unnecessary_null_comparison assert(type != null); initializer?.parent = this; - this.isCovariant = isCovariant; + this.isCovariantByDeclaration = isCovariantByDeclaration; this.isFinal = isFinal; this.isConst = isConst; this.isStatic = isStatic; @@ -1922,14 +1922,14 @@ class Field extends Member { static const int FlagConst = 1 << 1; static const int FlagStatic = 1 << 2; static const int FlagCovariant = 1 << 3; - static const int FlagGenericCovariantImpl = 1 << 4; + static const int FlagCovariantByClass = 1 << 4; static const int FlagLate = 1 << 5; static const int FlagExtensionMember = 1 << 6; static const int FlagNonNullableByDefault = 1 << 7; static const int FlagInternalImplementation = 1 << 8; /// Whether the field is declared with the `covariant` keyword. - bool get isCovariant => flags & FlagCovariant != 0; + bool get isCovariantByDeclaration => flags & FlagCovariant != 0; bool get isFinal => flags & FlagFinal != 0; @@ -1946,7 +1946,7 @@ class Field extends Member { /// /// When `true`, runtime checks may need to be performed; see /// [DispatchCategory] for details. - bool get isGenericCovariantImpl => flags & FlagGenericCovariantImpl != 0; + bool get isCovariantByClass => flags & FlagCovariantByClass != 0; /// Whether the field is declared with the `late` keyword. bool get isLate => flags & FlagLate != 0; @@ -1958,7 +1958,7 @@ class Field extends Member { // lowering. bool get isInternalImplementation => flags & FlagInternalImplementation != 0; - void set isCovariant(bool value) { + void set isCovariantByDeclaration(bool value) { flags = value ? (flags | FlagCovariant) : (flags & ~FlagCovariant); } @@ -1979,10 +1979,10 @@ class Field extends Member { value ? (flags | FlagExtensionMember) : (flags & ~FlagExtensionMember); } - void set isGenericCovariantImpl(bool value) { + void set isCovariantByClass(bool value) { flags = value - ? (flags | FlagGenericCovariantImpl) - : (flags & ~FlagGenericCovariantImpl); + ? (flags | FlagCovariantByClass) + : (flags & ~FlagCovariantByClass); } void set isLate(bool value) { @@ -2396,8 +2396,8 @@ enum ProcedureStubKind { /// The stub target is `null`. Regular, - /// An abstract procedure inserted to add `isCovariant` and - /// `isGenericCovariantImpl` to parameters for a set of overridden members. + /// An abstract procedure inserted to add `isCovariantByDeclaration` and + /// `isCovariantByClass` to parameters for a set of overridden members. /// /// The stub is inserted when not all of the overridden members agree on /// the covariance flags. For instance: @@ -2422,8 +2422,8 @@ enum ProcedureStubKind { /// The stub target is one of the overridden members. AbstractForwardingStub, - /// A concrete procedure inserted to add `isCovariant` and - /// `isGenericCovariantImpl` checks to parameters before calling the + /// A concrete procedure inserted to add `isCovariantByDeclaration` and + /// `isCovariantByClass` checks to parameters before calling the /// overridden member in the superclass. /// /// The stub is inserted when not all of the overridden members agree on @@ -9927,7 +9927,7 @@ class VariableDeclaration extends Statement implements Annotatable { bool isFinal: false, bool isConst: false, bool isFieldFormal: false, - bool isCovariant: false, + bool isCovariantByDeclaration: false, bool isLate: false, bool isRequired: false, bool isLowered: false}) { @@ -9940,7 +9940,7 @@ class VariableDeclaration extends Statement implements Annotatable { this.isFinal = isFinal; this.isConst = isConst; this.isFieldFormal = isFieldFormal; - this.isCovariant = isCovariant; + this.isCovariantByDeclaration = isCovariantByDeclaration; this.isLate = isLate; this.isRequired = isRequired; this.isLowered = isLowered; @@ -9981,7 +9981,7 @@ class VariableDeclaration extends Statement implements Annotatable { /// Whether the parameter is declared with the `covariant` keyword. // TODO(johnniwinther): Rename to isCovariantByDeclaration - bool get isCovariant => flags & FlagCovariant != 0; + bool get isCovariantByDeclaration => flags & FlagCovariant != 0; /// Whether the variable is declared as a field formal parameter of /// a constructor. @@ -9995,7 +9995,7 @@ class VariableDeclaration extends Statement implements Annotatable { /// When `true`, runtime checks may need to be performed; see /// [DispatchCategory] for details. // TODO(johnniwinther): Rename to isCovariantByClass - bool get isGenericCovariantImpl => flags & FlagGenericCovariantImpl != 0; + bool get isCovariantByClass => flags & FlagGenericCovariantImpl != 0; /// Whether the variable is declared with the `late` keyword. /// @@ -10040,7 +10040,7 @@ class VariableDeclaration extends Statement implements Annotatable { flags = value ? (flags | FlagConst) : (flags & ~FlagConst); } - void set isCovariant(bool value) { + void set isCovariantByDeclaration(bool value) { flags = value ? (flags | FlagCovariant) : (flags & ~FlagCovariant); } @@ -10049,7 +10049,7 @@ class VariableDeclaration extends Statement implements Annotatable { flags = value ? (flags | FlagFieldFormal) : (flags & ~FlagFieldFormal); } - void set isGenericCovariantImpl(bool value) { + void set isCovariantByClass(bool value) { flags = value ? (flags | FlagGenericCovariantImpl) : (flags & ~FlagGenericCovariantImpl); @@ -12032,7 +12032,7 @@ class TypeParameter extends TreeNode implements Annotatable { defaultType = defaultType ?? unsetDefaultTypeSentinel; // Must match serialized bit positions. - static const int FlagGenericCovariantImpl = 1 << 0; + static const int FlagCovariantByClass = 1 << 0; /// If this [TypeParameter] is a type parameter of a generic method, indicates /// whether the method implementation needs to contain a runtime type check to @@ -12040,12 +12040,12 @@ class TypeParameter extends TreeNode implements Annotatable { /// /// When `true`, runtime checks may need to be performed; see /// [DispatchCategory] for details. - bool get isGenericCovariantImpl => flags & FlagGenericCovariantImpl != 0; + bool get isCovariantByClass => flags & FlagCovariantByClass != 0; - void set isGenericCovariantImpl(bool value) { + void set isCovariantByClass(bool value) { flags = value - ? (flags | FlagGenericCovariantImpl) - : (flags & ~FlagGenericCovariantImpl); + ? (flags | FlagCovariantByClass) + : (flags & ~FlagCovariantByClass); } @override diff --git a/pkg/kernel/lib/naive_type_checker.dart b/pkg/kernel/lib/naive_type_checker.dart index 747071857f6..0f86d1c2fdf 100644 --- a/pkg/kernel/lib/naive_type_checker.dart +++ b/pkg/kernel/lib/naive_type_checker.dart @@ -75,11 +75,13 @@ ${superMember} is a ${_memberKind(superMember)} if (isSetter) { final DartType ownType = setterType(host, ownMember); final DartType superType = setterType(host, superMember); - final bool isCovariant = ownMember is Field - ? ownMember.isCovariant - : ownMember.function!.positionalParameters[0].isCovariant; - if (!_isValidParameterOverride(isCovariant, ownType, superType)) { - if (isCovariant) { + final bool isCovariantByDeclaration = ownMember is Field + ? ownMember.isCovariantByDeclaration + : ownMember + .function!.positionalParameters[0].isCovariantByDeclaration; + if (!_isValidParameterOverride( + isCovariantByDeclaration, ownType, superType)) { + if (isCovariantByDeclaration) { return failures.reportInvalidOverride(ownMember, superMember, ''' ${ownType} is neither a subtype nor supertype of ${superType} '''); @@ -198,7 +200,7 @@ ${ownType} is not a subtype of ${superType} final VariableDeclaration superParameter = superFunction.positionalParameters[i]; if (!_isValidParameterOverride( - ownParameter.isCovariant, + ownParameter.isCovariantByDeclaration, ownSubstitution.substituteType(ownParameter.type), superSubstitution.substituteType(superParameter.type))) { return ''' @@ -227,7 +229,7 @@ super method declares ${superParameter.type} } if (!_isValidParameterOverride( - ownParameter.isCovariant, + ownParameter.isCovariantByDeclaration, ownSubstitution.substituteType(ownParameter.type), superSubstitution.substituteType(superParameter.type))) { return ''' @@ -244,11 +246,11 @@ super method declares ${superParameter.type} /// Checks whether parameter with [ownParameterType] type is a valid override /// for parameter with [superParameterType] type taking into account its /// covariance and applying type parameter [substitution] if necessary. - bool _isValidParameterOverride(bool isCovariant, DartType ownParameterType, - DartType superParameterType) { + bool _isValidParameterOverride(bool isCovariantByDeclaration, + DartType ownParameterType, DartType superParameterType) { if (_isSubtypeOf(superParameterType, ownParameterType)) { return true; - } else if (isCovariant && + } else if (isCovariantByDeclaration && _isSubtypeOf(ownParameterType, superParameterType)) { return true; } else { diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart index 5485bdc7d98..c7db100e4d2 100644 --- a/pkg/kernel/lib/text/ast_to_text.dart +++ b/pkg/kernel/lib/text/ast_to_text.dart @@ -1123,8 +1123,8 @@ class Printer extends Visitor with VisitorVoidMixin { writeIndentation(); writeModifier(node.isLate, 'late'); writeModifier(node.isStatic, 'static'); - writeModifier(node.isCovariant, 'covariant'); - writeModifier(node.isGenericCovariantImpl, 'generic-covariant-impl'); + writeModifier(node.isCovariantByDeclaration, 'covariant'); + writeModifier(node.isCovariantByClass, 'generic-covariant-impl'); writeModifier(node.isFinal, 'final'); writeModifier(node.isConst, 'const'); // Only show implicit getter/setter modifiers in cases where they are @@ -2404,8 +2404,8 @@ class Printer extends Visitor with VisitorVoidMixin { writeModifier(node.isLowered, 'lowered'); writeModifier(node.isLate, 'late'); writeModifier(node.isRequired, 'required'); - writeModifier(node.isCovariant, 'covariant'); - writeModifier(node.isGenericCovariantImpl, 'generic-covariant-impl'); + writeModifier(node.isCovariantByDeclaration, 'covariant'); + writeModifier(node.isCovariantByClass, 'generic-covariant-impl'); writeModifier(node.isFinal, 'final'); writeModifier(node.isConst, 'const'); // ignore: unnecessary_null_comparison @@ -2623,7 +2623,7 @@ class Printer extends Visitor with VisitorVoidMixin { @override void visitTypeParameter(TypeParameter node) { - writeModifier(node.isGenericCovariantImpl, 'generic-covariant-impl'); + writeModifier(node.isCovariantByClass, 'generic-covariant-impl'); writeAnnotationList(node.annotations, separateLines: false); if (node.variance != Variance.covariant) { writeWord(const [ diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart index 0f6e9f53119..aec6e352be5 100644 --- a/pkg/kernel/lib/text/text_serializer.dart +++ b/pkg/kernel/lib/text/text_serializer.dart @@ -1980,7 +1980,7 @@ const Map fieldFlagToName = const { Field.FlagConst: "const", Field.FlagStatic: "static", Field.FlagCovariant: "covariant", - Field.FlagGenericCovariantImpl: "generic-covariant-impl", + Field.FlagCovariantByClass: "generic-covariant-impl", Field.FlagLate: "late", Field.FlagExtensionMember: "extension-member", Field.FlagNonNullableByDefault: "non-nullable-by-default", diff --git a/pkg/kernel/lib/transformations/mixin_full_resolution.dart b/pkg/kernel/lib/transformations/mixin_full_resolution.dart index 6c80c5aff7f..d05be909b40 100644 --- a/pkg/kernel/lib/transformations/mixin_full_resolution.dart +++ b/pkg/kernel/lib/transformations/mixin_full_resolution.dart @@ -139,8 +139,8 @@ class MixinFullResolution { setters.remove(field.name); VariableDeclaration parameter = setter.function.positionalParameters.first; - clone.isCovariant = parameter.isCovariant; - clone.isGenericCovariantImpl = parameter.isGenericCovariantImpl; + clone.isCovariantByDeclaration = parameter.isCovariantByDeclaration; + clone.isCovariantByClass = parameter.isCovariantByClass; } nonSetters.remove(field.name); class_.addField(clone); @@ -225,10 +225,10 @@ class MixinFullResolution { // TODO(kernel team): The named parameters are not sorted, // this might not be correct. for (int j = 0; j < src.namedParameters.length; ++j) { - dst.namedParameters[j].isCovariant = - src.namedParameters[j].isCovariant; - dst.namedParameters[j].isGenericCovariantImpl = - src.namedParameters[j].isGenericCovariantImpl; + dst.namedParameters[j].isCovariantByDeclaration = + src.namedParameters[j].isCovariantByDeclaration; + dst.namedParameters[j].isCovariantByClass = + src.namedParameters[j].isCovariantByClass; } class_.procedures[originalIndex] = clone; diff --git a/pkg/vm/lib/transformations/call_site_annotator.dart b/pkg/vm/lib/transformations/call_site_annotator.dart index 691ba8455e7..e0267ca6e12 100644 --- a/pkg/vm/lib/transformations/call_site_annotator.dart +++ b/pkg/vm/lib/transformations/call_site_annotator.dart @@ -110,7 +110,7 @@ class AnnotateWithStaticTypes extends RecursiveVisitor { /// Return [true] if the given list of [VariableDeclaration] contains /// any annotated with generic-covariant-impl. static bool containsGenericCovariantImpl(List decls) => - decls.any((p) => p.isGenericCovariantImpl); + decls.any((p) => p.isCovariantByClass); /// Returns [true] if the given [member] has any parameters annotated with /// generic-covariant-impl attribute. @@ -120,7 +120,7 @@ class AnnotateWithStaticTypes extends RecursiveVisitor { member.function.positionalParameters) || containsGenericCovariantImpl(member.function.namedParameters); } else if (member is Field) { - return member.isGenericCovariantImpl; + return member.isCovariantByClass; } return false; diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart index 75eff47e919..989ad8339f0 100644 --- a/pkg/vm/lib/transformations/type_flow/analysis.dart +++ b/pkg/vm/lib/transformations/type_flow/analysis.dart @@ -195,12 +195,12 @@ class _DirectInvocation extends _Invocation { final function = selector.member.function; if (function != null) { typeChecksNeeded = - function.typeParameters.any((t) => t.isGenericCovariantImpl); + function.typeParameters.any((t) => t.isCovariantByClass); } else { Field field = selector.member as Field; if (selector.callKind == CallKind.PropertySet) { // TODO(dartbug.com/40615): Use TFA results to improve this criterion. - typeChecksNeeded = field.isGenericCovariantImpl; + typeChecksNeeded = field.isCovariantByClass; } } } @@ -1499,7 +1499,7 @@ class TypeFlowAnalysis implements EntryPointsListener, CallHandler { _FieldValue? fieldValue = _fieldValues[field]; if (fieldValue == null) { Summary? typeGuardSummary = null; - if (field.isGenericCovariantImpl) { + if (field.isCovariantByClass) { typeGuardSummary = summaryCollector.createSummary(field, fieldSummaryType: FieldSummaryType.kFieldGuard); } diff --git a/pkg/vm/lib/transformations/type_flow/signature_shaking.dart b/pkg/vm/lib/transformations/type_flow/signature_shaking.dart index f09fc1a65bb..7ec6ff99a36 100644 --- a/pkg/vm/lib/transformations/type_flow/signature_shaking.dart +++ b/pkg/vm/lib/transformations/type_flow/signature_shaking.dart @@ -190,7 +190,7 @@ class _ParameterInfo { // Covariant parameters have implicit type checks, which count as reads. // When run in weak mode with null assertions enabled, parameters with // non-nullable types have implicit null checks, which count as reads. - if ((param.isCovariant || param.isGenericCovariantImpl) || + if ((param.isCovariantByDeclaration || param.isCovariantByClass) || (!shaker.typeFlowAnalysis.target.flags.enableNullSafety && param.type.nullability == Nullability.nonNullable && (type == null || type is NullableType))) { diff --git a/pkg/vm/lib/transformations/type_flow/summary.dart b/pkg/vm/lib/transformations/type_flow/summary.dart index fb18cec1bed..72b0b68d8da 100644 --- a/pkg/vm/lib/transformations/type_flow/summary.dart +++ b/pkg/vm/lib/transformations/type_flow/summary.dart @@ -546,7 +546,7 @@ class TypeCheck extends Statement { TypeCheck(this.arg, this.type, this.node, this.staticType, this.kind) : isTestedOnlyOnCheckedEntryPoint = - node is VariableDeclaration && !node.isCovariant; + node is VariableDeclaration && !node.isCovariantByDeclaration; @override void accept(StatementVisitor visitor) => visitor.visitTypeCheck(this); diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart index 49ce91708c3..952eefe8744 100644 --- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart +++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart @@ -801,7 +801,7 @@ class SummaryCollector extends RecursiveResultVisitor { } bool _useTypeCheckForParameter(VariableDeclaration decl) { - return decl.isCovariant || decl.isGenericCovariantImpl; + return decl.isCovariantByDeclaration || decl.isCovariantByClass; } Args rawArguments(Selector selector) { diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart index 2ed3a8e9eaf..13e7440448b 100644 --- a/pkg/vm/lib/transformations/type_flow/transformer.dart +++ b/pkg/vm/lib/transformations/type_flow/transformer.dart @@ -880,8 +880,8 @@ class FieldMorpher { if (isSetter) { final isAbstract = !shaker.isFieldSetterReachable(field); final parameter = new VariableDeclaration('value', type: field.type) - ..isCovariant = field.isCovariant - ..isGenericCovariantImpl = field.isGenericCovariantImpl + ..isCovariantByDeclaration = field.isCovariantByDeclaration + ..isCovariantByClass = field.isCovariantByClass ..fileOffset = field.fileOffset; accessor = new Procedure( field.name,