@@ -260,7 +260,9 @@ abstract class Generator {
260
260
Expression_Generator applyTypeArguments (
261
261
int fileOffset, List <UnresolvedType >? typeArguments) {
262
262
return new Instantiation (
263
- buildSimpleRead (), _helper.buildDartTypeArguments (typeArguments))
263
+ buildSimpleRead (),
264
+ _helper.buildDartTypeArguments (typeArguments,
265
+ allowPotentiallyConstantType: true ))
264
266
..fileOffset = fileOffset;
265
267
}
266
268
@@ -270,7 +272,8 @@ abstract class Generator {
270
272
/// The type arguments have not been resolved and should be resolved to
271
273
/// create a [TypeBuilder] for a valid type.
272
274
TypeBuilder buildTypeWithResolvedArguments (
273
- NullabilityBuilder nullabilityBuilder, List <UnresolvedType >? arguments) {
275
+ NullabilityBuilder nullabilityBuilder, List <UnresolvedType >? arguments,
276
+ {required bool allowPotentiallyConstantType}) {
274
277
// TODO(johnniwinther): Could we use a FixedTypeBuilder(InvalidType()) here?
275
278
NamedTypeBuilder result = new NamedTypeBuilder (
276
279
token.lexeme,
@@ -2897,11 +2900,13 @@ class DeferredAccessGenerator extends Generator {
2897
2900
2898
2901
@override
2899
2902
TypeBuilder buildTypeWithResolvedArguments (
2900
- NullabilityBuilder nullabilityBuilder, List <UnresolvedType >? arguments) {
2903
+ NullabilityBuilder nullabilityBuilder, List <UnresolvedType >? arguments,
2904
+ {required bool allowPotentiallyConstantType}) {
2901
2905
String name = "${prefixGenerator ._plainNameForRead }."
2902
2906
"${suffixGenerator ._plainNameForRead }" ;
2903
2907
TypeBuilder type = suffixGenerator.buildTypeWithResolvedArguments (
2904
- nullabilityBuilder, arguments);
2908
+ nullabilityBuilder, arguments,
2909
+ allowPotentiallyConstantType: allowPotentiallyConstantType);
2905
2910
LocatedMessage message;
2906
2911
if (type is NamedTypeBuilder &&
2907
2912
type.declaration is InvalidTypeDeclarationBuilder ) {
@@ -2912,7 +2917,8 @@ class DeferredAccessGenerator extends Generator {
2912
2917
int charOffset = offsetForToken (prefixGenerator.token);
2913
2918
message = templateDeferredTypeAnnotation
2914
2919
.withArguments (
2915
- _helper.buildDartType (new UnresolvedType (type, charOffset, _uri)),
2920
+ _helper.buildDartType (new UnresolvedType (type, charOffset, _uri),
2921
+ allowPotentiallyConstantType: allowPotentiallyConstantType),
2916
2922
prefixGenerator._plainNameForRead,
2917
2923
_helper.libraryBuilder.isNonNullableByDefault)
2918
2924
.withLocation (
@@ -3022,17 +3028,19 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
3022
3028
3023
3029
@override
3024
3030
TypeBuilder buildTypeWithResolvedArguments (
3025
- NullabilityBuilder nullabilityBuilder, List <UnresolvedType >? arguments) {
3031
+ NullabilityBuilder nullabilityBuilder, List <UnresolvedType >? arguments,
3032
+ {required bool allowPotentiallyConstantType}) {
3026
3033
if (declaration.isExtension && ! _helper.enableExtensionTypesInLibrary) {
3027
3034
// Extension declarations cannot be used as types.
3028
- return super
3029
- . buildTypeWithResolvedArguments (nullabilityBuilder, arguments );
3035
+ return super . buildTypeWithResolvedArguments (nullabilityBuilder, arguments,
3036
+ allowPotentiallyConstantType : allowPotentiallyConstantType );
3030
3037
}
3031
3038
if (arguments != null ) {
3032
3039
int expected = declaration.typeVariablesCount;
3033
3040
if (arguments.length != expected) {
3034
3041
// Build the type arguments to report any errors they may have.
3035
- _helper.buildDartTypeArguments (arguments);
3042
+ _helper.buildDartTypeArguments (arguments,
3043
+ allowPotentiallyConstantType: allowPotentiallyConstantType);
3036
3044
_helper.warnTypeArgumentsMismatch (
3037
3045
declaration.name, expected, fileOffset);
3038
3046
// We ignore the provided arguments, which will in turn return the
@@ -3048,11 +3056,8 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
3048
3056
argumentBuilders =
3049
3057
new List <TypeBuilder >.generate (arguments.length, (int i) {
3050
3058
return _helper
3051
- .validateTypeUse (arguments! [i],
3052
- nonInstanceAccessIsError: false ,
3053
- allowPotentiallyConstantType:
3054
- _helper.libraryBuilder.isNonNullableByDefault &&
3055
- _helper.inIsOrAsOperatorType)
3059
+ .validateTypeVariableUse (arguments! [i],
3060
+ allowPotentiallyConstantType: allowPotentiallyConstantType)
3056
3061
.builder;
3057
3062
}, growable: false );
3058
3063
}
@@ -3105,10 +3110,12 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
3105
3110
new UnresolvedType (
3106
3111
buildTypeWithResolvedArguments (
3107
3112
_helper.libraryBuilder.nonNullableBuilder,
3108
- typeArguments),
3113
+ typeArguments,
3114
+ allowPotentiallyConstantType: true ),
3109
3115
fileOffset,
3110
3116
_uri),
3111
- nonInstanceAccessIsError: true ));
3117
+ allowPotentiallyConstantType:
3118
+ _helper.enableConstructorTearOffsInLibrary));
3112
3119
}
3113
3120
}
3114
3121
return _expression! ;
@@ -3131,8 +3138,16 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
3131
3138
isUsedAsClass: true ,
3132
3139
usedAsClassCharOffset: this .fileOffset,
3133
3140
usedAsClassFileUri: _uri);
3134
- List <TypeBuilder >? aliasedTypeArguments =
3135
- typeArguments? .map ((unknownType) => unknownType.builder).toList ();
3141
+
3142
+ bool isConstructorTearOff = send is PropertySelector &&
3143
+ _helper.enableConstructorTearOffsInLibrary &&
3144
+ declarationBuilder is ClassBuilder ;
3145
+ List <TypeBuilder >? aliasedTypeArguments = typeArguments
3146
+ ? .map ((unknownType) => _helper
3147
+ .validateTypeVariableUse (unknownType,
3148
+ allowPotentiallyConstantType: isConstructorTearOff)
3149
+ .builder)
3150
+ .toList ();
3136
3151
if (aliasedTypeArguments != null &&
3137
3152
aliasedTypeArguments.length != aliasBuilder.typeVariablesCount) {
3138
3153
_helper.libraryBuilder.addProblem (
@@ -3236,8 +3251,9 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
3236
3251
_helper.libraryBuilder, unaliasedTypeArguments);
3237
3252
}
3238
3253
} else if (typeArguments != null ) {
3239
- builtTypeArguments =
3240
- _helper.buildDartTypeArguments (typeArguments);
3254
+ builtTypeArguments = _helper.buildDartTypeArguments (
3255
+ typeArguments,
3256
+ allowPotentiallyConstantType: true );
3241
3257
}
3242
3258
if (isGenericTypedefTearOff) {
3243
3259
if (isProperRenameForClass (_helper.typeEnvironment,
@@ -3670,7 +3686,9 @@ abstract class ErroneousExpressionGenerator extends Generator {
3670
3686
if (typeArguments != null ) {
3671
3687
assert (_forest.argumentsTypeArguments (arguments).isEmpty);
3672
3688
_forest.argumentsSetTypeArguments (
3673
- arguments, _helper.buildDartTypeArguments (typeArguments));
3689
+ arguments,
3690
+ _helper.buildDartTypeArguments (typeArguments,
3691
+ allowPotentiallyConstantType: false ));
3674
3692
}
3675
3693
return buildError (arguments, kind: UnresolvedKind .Constructor );
3676
3694
}
@@ -4145,7 +4163,8 @@ class UnexpectedQualifiedUseGenerator extends Generator {
4145
4163
4146
4164
@override
4147
4165
TypeBuilder buildTypeWithResolvedArguments (
4148
- NullabilityBuilder nullabilityBuilder, List <UnresolvedType >? arguments) {
4166
+ NullabilityBuilder nullabilityBuilder, List <UnresolvedType >? arguments,
4167
+ {required bool allowPotentiallyConstantType}) {
4149
4168
Template <Message Function (String , String )> template = isUnresolved
4150
4169
? templateUnresolvedPrefixInTypeAnnotation
4151
4170
: templateNotAPrefixInTypeAnnotation;
@@ -4269,7 +4288,8 @@ class ParserErrorGenerator extends Generator {
4269
4288
4270
4289
@override
4271
4290
TypeBuilder buildTypeWithResolvedArguments (
4272
- NullabilityBuilder nullabilityBuilder, List <UnresolvedType >? arguments) {
4291
+ NullabilityBuilder nullabilityBuilder, List <UnresolvedType >? arguments,
4292
+ {required bool allowPotentiallyConstantType}) {
4273
4293
// TODO(johnniwinther): Could we use a FixedTypeBuilder(InvalidType()) here?
4274
4294
NamedTypeBuilder result = new NamedTypeBuilder (
4275
4295
token.lexeme,
0 commit comments