Skip to content

Commit e2fb9e7

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Report extension access type parameter bounds before lowering
This changes the checking of type parameter bounds to be performed before lowering. Change-Id: I4f6753359b68c9d5e7daa74be8958d3be8b6c104 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/447781 Reviewed-by: Erik Ernst <[email protected]> Commit-Queue: Johnni Winther <[email protected]> Reviewed-by: Chloe Stefantsova <[email protected]>
1 parent 101fcad commit e2fb9e7

15 files changed

+1138
-969
lines changed

pkg/front_end/lib/src/kernel/expression_generator.dart

Lines changed: 73 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -527,21 +527,6 @@ class VariableUseGenerator extends Generator {
527527
forEffect: voidContext,
528528
isPost: true,
529529
);
530-
/*
531-
Expression value = _forest.createIntLiteral(operatorOffset, 1);
532-
if (voidContext) {
533-
return buildCompoundAssignment(binaryOperator, value,
534-
operatorOffset: operatorOffset,
535-
voidContext: voidContext,
536-
isPostIncDec: true);
537-
}
538-
VariableDeclarationImpl read =
539-
_helper.createVariableDeclarationForValue(_createRead());
540-
Expression binary = _helper.forest.createBinary(operatorOffset,
541-
_helper.createVariableGet(read, fileOffset), binaryOperator, value);
542-
VariableDeclarationImpl write = _helper.createVariableDeclarationForValue(
543-
_createWrite(operatorOffset, binary));
544-
return new LocalIncDec(read, write)..fileOffset = operatorOffset;*/
545530
}
546531

547532
@override
@@ -2690,7 +2675,7 @@ class ExtensionInstanceAccessGenerator extends Generator {
26902675
class ExplicitExtensionInstanceAccessGenerator extends Generator {
26912676
/// The file offset used for the explicit extension application type
26922677
/// arguments.
2693-
final int extensionTypeArgumentOffset;
2678+
final int? extensionTypeArgumentOffset;
26942679

26952680
final Extension extension;
26962681

@@ -2752,53 +2737,53 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
27522737
),
27532738
super(helper, token);
27542739

2755-
factory ExplicitExtensionInstanceAccessGenerator.fromBuilder(
2756-
ExpressionGeneratorHelper helper,
2757-
Token token,
2758-
int extensionTypeArgumentOffset,
2759-
Extension extension,
2760-
Name targetName,
2761-
MemberBuilder? getterBuilder,
2762-
MemberBuilder? setterBuilder,
2763-
Expression receiver,
2764-
List<DartType>? explicitTypeArguments,
2765-
int extensionTypeParameterCount, {
2740+
factory ExplicitExtensionInstanceAccessGenerator.fromBuilder({
2741+
required ExpressionGeneratorHelper helper,
2742+
required Token token,
2743+
required int? extensionTypeArgumentOffset,
2744+
required Extension extension,
2745+
required Name name,
2746+
required MemberBuilder? getter,
2747+
required MemberBuilder? setter,
2748+
required Expression receiver,
2749+
required List<DartType>? explicitTypeArguments,
2750+
required int extensionTypeParameterCount,
27662751
required bool isNullAware,
27672752
}) {
2768-
assert(getterBuilder != null || setterBuilder != null);
2753+
assert(getter != null || setter != null);
27692754
Procedure? readTarget;
27702755
Procedure? invokeTarget;
2771-
if (getterBuilder != null) {
2772-
assert(!getterBuilder.isStatic);
2773-
if (getterBuilder is PropertyBuilder) {
2774-
assert(!getterBuilder.hasConcreteField);
2775-
readTarget = getterBuilder.readTarget as Procedure?;
2776-
} else if (getterBuilder is MethodBuilder) {
2777-
if (getterBuilder.isOperator) {
2778-
invokeTarget = getterBuilder.invokeTarget as Procedure?;
2756+
if (getter != null) {
2757+
assert(!getter.isStatic);
2758+
if (getter is PropertyBuilder) {
2759+
assert(!getter.hasConcreteField);
2760+
readTarget = getter.readTarget as Procedure?;
2761+
} else if (getter is MethodBuilder) {
2762+
if (getter.isOperator) {
2763+
invokeTarget = getter.invokeTarget as Procedure?;
27792764
} else {
2780-
readTarget = getterBuilder.readTarget as Procedure?;
2781-
invokeTarget = getterBuilder.invokeTarget as Procedure?;
2765+
readTarget = getter.readTarget as Procedure?;
2766+
invokeTarget = getter.invokeTarget as Procedure?;
27822767
}
27832768
} else {
27842769
return unhandled(
2785-
"$getterBuilder (${getterBuilder.runtimeType})",
2770+
"$getter (${getter.runtimeType})",
27862771
"InstanceExtensionAccessGenerator.fromBuilder",
27872772
offsetForToken(token),
27882773
helper.uri,
27892774
);
27902775
}
27912776
}
27922777
Procedure? writeTarget;
2793-
if (setterBuilder != null) {
2794-
assert(!setterBuilder.isStatic);
2795-
if (setterBuilder is PropertyBuilder) {
2796-
if (setterBuilder.hasSetter) {
2797-
writeTarget = setterBuilder.writeTarget as Procedure?;
2778+
if (setter != null) {
2779+
assert(!setter.isStatic);
2780+
if (setter is PropertyBuilder) {
2781+
if (setter.hasSetter) {
2782+
writeTarget = setter.writeTarget as Procedure?;
27982783
}
27992784
} else {
28002785
return unhandled(
2801-
"$setterBuilder (${setterBuilder.runtimeType})",
2786+
"$setter (${setter.runtimeType})",
28022787
"InstanceExtensionAccessGenerator.fromBuilder",
28032788
offsetForToken(token),
28042789
helper.uri,
@@ -2810,7 +2795,7 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
28102795
token,
28112796
extensionTypeArgumentOffset,
28122797
extension,
2813-
targetName,
2798+
name,
28142799
readTarget,
28152800
invokeTarget,
28162801
writeTarget,
@@ -2853,6 +2838,7 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
28532838
name: targetName,
28542839
tearOff: getter,
28552840
isNullAware: isNullAware,
2841+
extensionTypeArgumentOffset: extensionTypeArgumentOffset,
28562842
)..fileOffset = fileOffset;
28572843
} else {
28582844
return new ExtensionGet.explicit(
@@ -2862,6 +2848,7 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
28622848
name: targetName,
28632849
getter: getter,
28642850
isNullAware: isNullAware,
2851+
extensionTypeArgumentOffset: extensionTypeArgumentOffset,
28652852
)..fileOffset = fileOffset;
28662853
}
28672854
}
@@ -2898,6 +2885,7 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
28982885
value: value,
28992886
forEffect: forEffect,
29002887
isNullAware: isNullAware,
2888+
extensionTypeArgumentOffset: extensionTypeArgumentOffset,
29012889
)..fileOffset = offset;
29022890
}
29032891
}
@@ -2930,6 +2918,7 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
29302918
binaryOffset: offset,
29312919
writeOffset: fileOffset,
29322920
isNullAware: isNullAware,
2921+
extensionTypeArgumentOffset: extensionTypeArgumentOffset,
29332922
)..fileOffset = offset;
29342923
}
29352924

@@ -2964,6 +2953,7 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
29642953
binaryOffset: operatorOffset,
29652954
writeOffset: fileOffset,
29662955
isNullAware: isNullAware,
2956+
extensionTypeArgumentOffset: extensionTypeArgumentOffset,
29672957
)..fileOffset = operatorOffset;
29682958
}
29692959

@@ -2992,6 +2982,7 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
29922982
isInc: binaryOperator == plusName,
29932983
forEffect: forEffect,
29942984
isNullAware: isNullAware,
2985+
extensionTypeArgumentOffset: extensionTypeArgumentOffset,
29952986
)..fileOffset = operatorOffset;
29962987
}
29972988

@@ -3107,7 +3098,7 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
31073098
class ExplicitExtensionIndexedAccessGenerator extends Generator {
31083099
/// The file offset used for the explicit extension application type
31093100
/// arguments.
3110-
final int extensionTypeArgumentOffset;
3101+
final int? extensionTypeArgumentOffset;
31113102

31123103
final Extension extension;
31133104

@@ -3155,7 +3146,7 @@ class ExplicitExtensionIndexedAccessGenerator extends Generator {
31553146
factory ExplicitExtensionIndexedAccessGenerator.fromBuilder(
31563147
ExpressionGeneratorHelper helper,
31573148
Token token,
3158-
int extensionTypeArgumentOffset,
3149+
int? extensionTypeArgumentOffset,
31593150
Extension extension,
31603151
MemberBuilder? getterBuilder,
31613152
MemberBuilder? setterBuilder,
@@ -3204,6 +3195,7 @@ class ExplicitExtensionIndexedAccessGenerator extends Generator {
32043195
getter,
32053196
index,
32063197
isNullAware: isNullAware,
3198+
extensionTypeArgumentOffset: extensionTypeArgumentOffset,
32073199
)..fileOffset = fileOffset;
32083200
}
32093201

@@ -3223,6 +3215,7 @@ class ExplicitExtensionIndexedAccessGenerator extends Generator {
32233215
value,
32243216
isNullAware: isNullAware,
32253217
forEffect: voidContext,
3218+
extensionTypeArgumentOffset: extensionTypeArgumentOffset,
32263219
)..fileOffset = fileOffset;
32273220
}
32283221

@@ -3255,6 +3248,7 @@ class ExplicitExtensionIndexedAccessGenerator extends Generator {
32553248
writeOffset: fileOffset,
32563249
forEffect: voidContext,
32573250
isNullAware: isNullAware,
3251+
extensionTypeArgumentOffset: extensionTypeArgumentOffset,
32583252
)..fileOffset = offset;
32593253
}
32603254

@@ -3291,6 +3285,7 @@ class ExplicitExtensionIndexedAccessGenerator extends Generator {
32913285
forEffect: voidContext,
32923286
forPostIncDec: isPostIncDec,
32933287
isNullAware: isNullAware,
3288+
extensionTypeArgumentOffset: extensionTypeArgumentOffset,
32943289
);
32953290
}
32963291

@@ -3380,14 +3375,16 @@ class ExplicitExtensionAccessGenerator extends Generator {
33803375
final ExtensionBuilder extensionBuilder;
33813376
final Expression receiver;
33823377
final List<DartType>? explicitTypeArguments;
3383-
3384-
ExplicitExtensionAccessGenerator(
3385-
ExpressionGeneratorHelper helper,
3386-
Token token,
3387-
this.extensionBuilder,
3388-
this.receiver,
3389-
this.explicitTypeArguments,
3390-
) : super(helper, token);
3378+
final int? extensionTypeArgumentOffset;
3379+
3380+
ExplicitExtensionAccessGenerator({
3381+
required ExpressionGeneratorHelper helper,
3382+
required Token token,
3383+
required this.extensionBuilder,
3384+
required this.receiver,
3385+
required this.explicitTypeArguments,
3386+
required this.extensionTypeArgumentOffset,
3387+
}) : super(helper, token);
33913388

33923389
@override
33933390
// Coverage-ignore(suite): Not run.
@@ -3471,19 +3468,16 @@ class ExplicitExtensionAccessGenerator extends Generator {
34713468
);
34723469
}
34733470
return new ExplicitExtensionInstanceAccessGenerator.fromBuilder(
3474-
_helper,
3475-
token,
3476-
// TODO(johnniwinther): Improve this. This is the name of the extension
3477-
// and not the type arguments (or arguments if type arguments are
3478-
// omitted).
3479-
fileOffset,
3480-
extensionBuilder.extension,
3481-
name,
3482-
getter,
3483-
setter,
3484-
receiver,
3485-
explicitTypeArguments,
3486-
extensionBuilder.typeParameters?.length ?? 0,
3471+
helper: _helper,
3472+
token: token,
3473+
extensionTypeArgumentOffset: extensionTypeArgumentOffset,
3474+
extension: extensionBuilder.extension,
3475+
name: name,
3476+
getter: getter,
3477+
setter: setter,
3478+
receiver: receiver,
3479+
explicitTypeArguments: explicitTypeArguments,
3480+
extensionTypeParameterCount: extensionBuilder.typeParameters?.length ?? 0,
34873481
isNullAware: isNullAware,
34883482
);
34893483
}
@@ -3609,10 +3603,7 @@ class ExplicitExtensionAccessGenerator extends Generator {
36093603
return new ExplicitExtensionIndexedAccessGenerator.fromBuilder(
36103604
_helper,
36113605
token,
3612-
// TODO(johnniwinther): Improve this. This is the name of the extension
3613-
// and not the type arguments (or arguments if type arguments are
3614-
// omitted).
3615-
fileOffset,
3606+
extensionTypeArgumentOffset,
36163607
extensionBuilder.extension,
36173608
getter,
36183609
setter,
@@ -4551,6 +4542,7 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
45514542
List<DartType>? explicitTypeArguments = getExplicitTypeArguments(
45524543
arguments,
45534544
);
4545+
int? extensionTypeArgumentOffset;
45544546
if (explicitTypeArguments != null) {
45554547
int typeParameterCount = extensionBuilder.typeParameters?.length ?? 0;
45564548
if (explicitTypeArguments.length != typeParameterCount) {
@@ -4563,14 +4555,17 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
45634555
lengthForToken(token),
45644556
);
45654557
}
4558+
// TODO(johnniwinther): Provide the type arguments offsets.
4559+
extensionTypeArgumentOffset = arguments.fileOffset;
45664560
}
45674561
// TODO(johnniwinther): Check argument and type argument count.
45684562
return new ExplicitExtensionAccessGenerator(
4569-
_helper,
4570-
token,
4571-
declaration as ExtensionBuilder,
4572-
arguments.positional.single,
4573-
explicitTypeArguments,
4563+
helper: _helper,
4564+
token: token,
4565+
extensionBuilder: declaration as ExtensionBuilder,
4566+
receiver: arguments.positional.single,
4567+
explicitTypeArguments: explicitTypeArguments,
4568+
extensionTypeArgumentOffset: extensionTypeArgumentOffset,
45744569
);
45754570
} else {
45764571
return _helper.buildConstructorInvocation(

0 commit comments

Comments
 (0)