Skip to content

Commit bf5fa95

Browse files
johnniwintherCommit Queue
authored and
Commit Queue
committed
[cfe] Handle inline class method access in inference visitor
Change-Id: Ifc0b6ecafc6f9223147a0aec772d2af279cae176 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/277680 Reviewed-by: Chloe Stefantsova <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 40be3ef commit bf5fa95

38 files changed

+1657
-611
lines changed

pkg/front_end/lib/src/fasta/scope.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,9 @@ class AccessErrorBuilder extends ProblemBuilder {
791791
@override
792792
bool get isExtensionInstanceMember => builder.isExtensionInstanceMember;
793793

794+
@override
795+
bool get isInlineClassInstanceMember => builder.isInlineClassInstanceMember;
796+
794797
@override
795798
bool get isStatic => builder.isStatic;
796799

pkg/front_end/lib/src/fasta/source/outline_builder.dart

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1972,19 +1972,19 @@ class OutlineBuilder extends StackListenerImpl {
19721972
TypeParameterScopeKind.extensionDeclaration ||
19731973
libraryBuilder.currentTypeParameterScopeBuilder.kind ==
19741974
TypeParameterScopeKind.inlineClassDeclaration)) {
1975-
TypeParameterScopeBuilder extension =
1975+
TypeParameterScopeBuilder declaration =
19761976
libraryBuilder.currentTypeParameterScopeBuilder;
19771977
Map<TypeVariableBuilder, TypeBuilder>? substitution;
1978-
if (extension.typeVariables != null) {
1978+
if (declaration.typeVariables != null) {
19791979
// We synthesize the names of the generated [TypeParameter]s, i.e.
19801980
// rename 'T' to '#T'. We cannot do it on the builders because their
19811981
// names are used to create the scope.
19821982
List<TypeVariableBuilder> synthesizedTypeVariables = libraryBuilder
1983-
.copyTypeVariables(extension.typeVariables!, declarationBuilder,
1983+
.copyTypeVariables(declaration.typeVariables!, declarationBuilder,
19841984
kind: TypeVariableKind.extensionSynthesized);
19851985
substitution = {};
19861986
for (int i = 0; i < synthesizedTypeVariables.length; i++) {
1987-
substitution[extension.typeVariables![i]] =
1987+
substitution[declaration.typeVariables![i]] =
19881988
new NamedTypeBuilder.fromTypeDeclarationBuilder(
19891989
synthesizedTypeVariables[i],
19901990
const NullabilityBuilder.omitted(),
@@ -1999,15 +1999,15 @@ class OutlineBuilder extends StackListenerImpl {
19991999
}
20002000
List<FormalParameterBuilder> synthesizedFormals = [];
20012001
TypeBuilder thisType;
2002-
if (extension.kind == TypeParameterScopeKind.extensionDeclaration) {
2003-
thisType = extension.extensionThisType;
2002+
if (declaration.kind == TypeParameterScopeKind.extensionDeclaration) {
2003+
thisType = declaration.extensionThisType;
20042004
} else {
20052005
thisType = libraryBuilder.addNamedType(
2006-
extension.name,
2006+
declaration.name,
20072007
const NullabilityBuilder.omitted(),
2008-
extension.typeVariables != null
2008+
declaration.typeVariables != null
20092009
? new List<TypeBuilder>.generate(
2010-
extension.typeVariables!.length,
2010+
declaration.typeVariables!.length,
20112011
(int index) =>
20122012
new NamedTypeBuilder.fromTypeDeclarationBuilder(
20132013
typeVariables![index],
@@ -2026,7 +2026,7 @@ class OutlineBuilder extends StackListenerImpl {
20262026
unboundTypes: unboundTypes,
20272027
unboundTypeVariables: unboundTypeVariables);
20282028
for (NamedTypeBuilder unboundType in unboundTypes) {
2029-
extension.registerUnresolvedNamedType(unboundType);
2029+
declaration.registerUnresolvedNamedType(unboundType);
20302030
}
20312031
libraryBuilder.unboundTypeVariables.addAll(unboundTypeVariables);
20322032
}

pkg/front_end/lib/src/fasta/source/source_function_builder.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ abstract class SourceFunctionBuilderImpl extends SourceMemberBuilderImpl
372372
}
373373
}
374374
}
375-
if (!isExtensionInstanceMember &&
375+
if (!(isExtensionInstanceMember || isInlineClassInstanceMember) &&
376376
isSetter &&
377377
(formals?.length != 1 || formals![0].isOptionalPositional)) {
378378
// Replace illegal parameters by single dummy parameter.

pkg/front_end/lib/src/fasta/type_inference/inference_visitor.dart

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -584,13 +584,14 @@ class InferenceVisitorImpl extends InferenceVisitorBase
584584
}
585585
break;
586586
case ObjectAccessTargetKind.extensionMember:
587+
case ObjectAccessTargetKind.inlineClassMember:
587588
if (callMember.tearoffTarget != null &&
588-
callMember.extensionMethodKind == ProcedureKind.Method) {
589+
callMember.declarationMethodKind == ProcedureKind.Method) {
589590
operandType = callMember.getGetterType(this);
590591
operand = new StaticInvocation(
591592
callMember.tearoffTarget as Procedure,
592593
new Arguments(<Expression>[operand],
593-
types: callMember.inferredExtensionTypeArguments)
594+
types: callMember.receiverTypeArguments)
594595
..fileOffset = operand.fileOffset)
595596
..fileOffset = operand.fileOffset;
596597
}
@@ -610,6 +611,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
610611
case ObjectAccessTargetKind.nullableRecordIndexed:
611612
case ObjectAccessTargetKind.nullableRecordNamed:
612613
case ObjectAccessTargetKind.recordNamed:
614+
case ObjectAccessTargetKind.nullableInlineClassMember:
613615
break;
614616
}
615617
}
@@ -1045,7 +1047,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
10451047
readTarget.member as Procedure,
10461048
new Arguments(<Expression>[
10471049
readReceiver,
1048-
], types: readTarget.inferredExtensionTypeArguments)
1050+
], types: readTarget.receiverTypeArguments)
10491051
..fileOffset = node.readOffset)
10501052
..fileOffset = node.readOffset;
10511053
}
@@ -1090,7 +1092,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
10901092
new Arguments(<Expression>[
10911093
writeReceiver,
10921094
value,
1093-
], types: writeTarget.inferredExtensionTypeArguments)
1095+
], types: writeTarget.receiverTypeArguments)
10941096
..fileOffset = node.writeOffset)
10951097
..fileOffset = node.writeOffset;
10961098
}
@@ -5540,13 +5542,15 @@ class InferenceVisitorImpl extends InferenceVisitorBase
55405542
break;
55415543
case ObjectAccessTargetKind.extensionMember:
55425544
case ObjectAccessTargetKind.nullableExtensionMember:
5543-
assert(binaryTarget.extensionMethodKind != ProcedureKind.Setter);
5545+
case ObjectAccessTargetKind.inlineClassMember:
5546+
case ObjectAccessTargetKind.nullableInlineClassMember:
5547+
assert(binaryTarget.declarationMethodKind != ProcedureKind.Setter);
55445548
binary = new StaticInvocation(
55455549
binaryTarget.member as Procedure,
55465550
new Arguments(<Expression>[
55475551
left,
55485552
right,
5549-
], types: binaryTarget.inferredExtensionTypeArguments)
5553+
], types: binaryTarget.receiverTypeArguments)
55505554
..fileOffset = fileOffset)
55515555
..fileOffset = fileOffset;
55525556
break;
@@ -5682,12 +5686,14 @@ class InferenceVisitorImpl extends InferenceVisitorBase
56825686
break;
56835687
case ObjectAccessTargetKind.extensionMember:
56845688
case ObjectAccessTargetKind.nullableExtensionMember:
5685-
assert(unaryTarget.extensionMethodKind != ProcedureKind.Setter);
5689+
case ObjectAccessTargetKind.inlineClassMember:
5690+
case ObjectAccessTargetKind.nullableInlineClassMember:
5691+
assert(unaryTarget.declarationMethodKind != ProcedureKind.Setter);
56865692
unary = new StaticInvocation(
56875693
unaryTarget.member as Procedure,
56885694
new Arguments(<Expression>[
56895695
expression,
5690-
], types: unaryTarget.inferredExtensionTypeArguments)
5696+
], types: unaryTarget.receiverTypeArguments)
56915697
..fileOffset = fileOffset)
56925698
..fileOffset = fileOffset;
56935699
break;
@@ -5795,12 +5801,14 @@ class InferenceVisitorImpl extends InferenceVisitorBase
57955801
break;
57965802
case ObjectAccessTargetKind.extensionMember:
57975803
case ObjectAccessTargetKind.nullableExtensionMember:
5804+
case ObjectAccessTargetKind.inlineClassMember:
5805+
case ObjectAccessTargetKind.nullableInlineClassMember:
57985806
read = new StaticInvocation(
57995807
readTarget.member as Procedure,
58005808
new Arguments(<Expression>[
58015809
readReceiver,
58025810
readIndex,
5803-
], types: readTarget.inferredExtensionTypeArguments)
5811+
], types: readTarget.receiverTypeArguments)
58045812
..fileOffset = fileOffset)
58055813
..fileOffset = fileOffset;
58065814
break;
@@ -5934,11 +5942,13 @@ class InferenceVisitorImpl extends InferenceVisitorBase
59345942
break;
59355943
case ObjectAccessTargetKind.extensionMember:
59365944
case ObjectAccessTargetKind.nullableExtensionMember:
5937-
assert(writeTarget.extensionMethodKind != ProcedureKind.Setter);
5945+
case ObjectAccessTargetKind.inlineClassMember:
5946+
case ObjectAccessTargetKind.nullableInlineClassMember:
5947+
assert(writeTarget.declarationMethodKind != ProcedureKind.Setter);
59385948
write = new StaticInvocation(
59395949
writeTarget.member as Procedure,
59405950
new Arguments(<Expression>[receiver, index, value],
5941-
types: writeTarget.inferredExtensionTypeArguments)
5951+
types: writeTarget.receiverTypeArguments)
59425952
..fileOffset = fileOffset)
59435953
..fileOffset = fileOffset;
59445954
break;
@@ -6056,13 +6066,15 @@ class InferenceVisitorImpl extends InferenceVisitorBase
60566066
break;
60576067
case ObjectAccessTargetKind.extensionMember:
60586068
case ObjectAccessTargetKind.nullableExtensionMember:
6059-
switch (readTarget.extensionMethodKind) {
6069+
case ObjectAccessTargetKind.inlineClassMember:
6070+
case ObjectAccessTargetKind.nullableInlineClassMember:
6071+
switch (readTarget.declarationMethodKind) {
60606072
case ProcedureKind.Getter:
60616073
read = new StaticInvocation(
60626074
readTarget.member as Procedure,
60636075
new Arguments(<Expression>[
60646076
receiver,
6065-
], types: readTarget.inferredExtensionTypeArguments)
6077+
], types: readTarget.receiverTypeArguments)
60666078
..fileOffset = fileOffset)
60676079
..fileOffset = fileOffset;
60686080
break;
@@ -6071,7 +6083,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
60716083
readTarget.tearoffTarget as Procedure,
60726084
new Arguments(<Expression>[
60736085
receiver,
6074-
], types: readTarget.inferredExtensionTypeArguments)
6086+
], types: readTarget.receiverTypeArguments)
60756087
..fileOffset = fileOffset)
60766088
..fileOffset = fileOffset;
60776089
readResult = instantiateTearOff(readType, typeContext, read);
@@ -6241,11 +6253,13 @@ class InferenceVisitorImpl extends InferenceVisitorBase
62416253
break;
62426254
case ObjectAccessTargetKind.extensionMember:
62436255
case ObjectAccessTargetKind.nullableExtensionMember:
6256+
case ObjectAccessTargetKind.inlineClassMember:
6257+
case ObjectAccessTargetKind.nullableInlineClassMember:
62446258
if (forEffect) {
62456259
write = new StaticInvocation(
62466260
writeTarget.member as Procedure,
62476261
new Arguments(<Expression>[receiver, value],
6248-
types: writeTarget.inferredExtensionTypeArguments)
6262+
types: writeTarget.receiverTypeArguments)
62496263
..fileOffset = fileOffset)
62506264
..fileOffset = fileOffset;
62516265
// The generate invocation has a void return type.
@@ -6257,7 +6271,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
62576271
writeTarget.member as Procedure,
62586272
new Arguments(
62596273
<Expression>[receiver, createVariableGet(valueVariable)],
6260-
types: writeTarget.inferredExtensionTypeArguments)
6274+
types: writeTarget.receiverTypeArguments)
62616275
..fileOffset = fileOffset)
62626276
..fileOffset = fileOffset,
62636277
const VoidType());

0 commit comments

Comments
 (0)