Skip to content

Commit f11e982

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Make MethodInvocation, PropertyGet, PropertySet, IndexGet and IndexSet null-aware
This embeds the handling of null-aware access into the regular internal nodes. This also avoids some of the lowerings performed during body building. This removes the now unused NullAwarePropertyGet and NullAwarePropertySet. NullAwareMethodInvocation will be removed latter because it is still used in other lowerings. Change-Id: I88f3d67919cc9dadf9d16dcef4a474de90780260 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/445940 Reviewed-by: Chloe Stefantsova <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent f3bbeb6 commit f11e982

25 files changed

+443
-358
lines changed

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

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6546,7 +6546,8 @@ class BodyBuilder extends StackListenerImpl
65466546
allowPotentiallyConstantType: true));
65476547
}
65486548
return forest.createMethodInvocation(invocationOffset, receiver,
6549-
new Name(constructorName, libraryBuilder.nameOrigin), arguments);
6549+
new Name(constructorName, libraryBuilder.nameOrigin), arguments,
6550+
isNullAware: false);
65506551
} else {
65516552
if (typeArguments != null) {
65526553
assert(forest.argumentsTypeArguments(arguments).isEmpty);
@@ -9534,20 +9535,8 @@ class BodyBuilder extends StackListenerImpl
95349535
offset,
95359536
name.text.length);
95369537
}
9537-
if (isNullAware) {
9538-
VariableDeclarationImpl variable =
9539-
createVariableDeclarationForValue(receiver);
9540-
return new NullAwareMethodInvocation(
9541-
variable,
9542-
forest.createMethodInvocation(
9543-
offset,
9544-
createVariableGet(variable, receiver.fileOffset),
9545-
name,
9546-
arguments))
9547-
..fileOffset = receiver.fileOffset;
9548-
} else {
9549-
return forest.createMethodInvocation(offset, receiver, name, arguments);
9550-
}
9538+
return forest.createMethodInvocation(offset, receiver, name, arguments,
9539+
isNullAware: isNullAware);
95519540
}
95529541

95539542
@override

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

Lines changed: 27 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -510,13 +510,14 @@ class PropertyAccessGenerator extends Generator {
510510

511511
@override
512512
Expression buildSimpleRead() {
513-
return _forest.createPropertyGet(fileOffset, receiver, name);
513+
return _forest.createPropertyGet(fileOffset, receiver, name,
514+
isNullAware: false);
514515
}
515516

516517
@override
517518
Expression buildAssignment(Expression value, {bool voidContext = false}) {
518519
return _helper.forest.createPropertySet(fileOffset, receiver, name, value,
519-
forEffect: voidContext);
520+
forEffect: voidContext, isNullAware: false);
520521
}
521522

522523
@override
@@ -553,7 +554,8 @@ class PropertyAccessGenerator extends Generator {
553554
_helper.createVariableDeclarationForValue(receiver);
554555
VariableDeclarationImpl read = _helper.createVariableDeclarationForValue(
555556
_forest.createPropertyGet(fileOffset,
556-
_helper.createVariableGet(variable, receiver.fileOffset), name));
557+
_helper.createVariableGet(variable, receiver.fileOffset), name,
558+
isNullAware: false));
557559
Expression binary = _helper.forest.createBinary(offset,
558560
_helper.createVariableGet(read, fileOffset), binaryOperator, value);
559561
VariableDeclarationImpl write = _helper.createVariableDeclarationForValue(
@@ -562,7 +564,8 @@ class PropertyAccessGenerator extends Generator {
562564
_helper.createVariableGet(variable, receiver.fileOffset),
563565
name,
564566
binary,
565-
forEffect: true));
567+
forEffect: true,
568+
isNullAware: false));
566569
return new PropertyPostIncDec(variable, read, write)..fileOffset = offset;
567570
}
568571

@@ -654,7 +657,8 @@ class ThisPropertyAccessGenerator extends Generator {
654657
}
655658

656659
Expression _createRead() {
657-
return _forest.createPropertyGet(fileOffset, _thisExpression, name);
660+
return _forest.createPropertyGet(fileOffset, _thisExpression, name,
661+
isNullAware: false);
658662
}
659663

660664
@override
@@ -666,7 +670,7 @@ class ThisPropertyAccessGenerator extends Generator {
666670
{required bool forEffect}) {
667671
return _helper.forest.createPropertySet(
668672
fileOffset, _thisExpression, name, value,
669-
forEffect: forEffect);
673+
forEffect: forEffect, isNullAware: false);
670674
}
671675

672676
@override
@@ -730,17 +734,13 @@ class ThisPropertyAccessGenerator extends Generator {
730734
}
731735

732736
class NullAwarePropertyAccessGenerator extends Generator {
733-
final VariableDeclaration receiver;
734-
735-
final Expression receiverExpression;
737+
final Expression receiver;
736738

737739
final Name name;
738740

739-
NullAwarePropertyAccessGenerator(ExpressionGeneratorHelper helper,
740-
Token token, this.receiverExpression, this.name)
741-
: this.receiver =
742-
helper.createVariableDeclarationForValue(receiverExpression),
743-
super(helper, token);
741+
NullAwarePropertyAccessGenerator(
742+
ExpressionGeneratorHelper helper, Token token, this.receiver, this.name)
743+
: super(helper, token);
744744

745745
@override
746746
// Coverage-ignore(suite): Not run.
@@ -752,37 +752,20 @@ class NullAwarePropertyAccessGenerator extends Generator {
752752

753753
@override
754754
Expression buildSimpleRead() {
755-
VariableDeclarationImpl variable =
756-
_helper.createVariableDeclarationForValue(receiverExpression);
757-
Expression read = _forest.createPropertyGet(
758-
fileOffset,
759-
_helper.createVariableGet(variable, receiverExpression.fileOffset,
760-
forNullGuardedAccess: true),
761-
name);
762-
return new NullAwarePropertyGet(variable, read)
763-
..fileOffset = receiverExpression.fileOffset;
755+
return _forest.createPropertyGet(fileOffset, receiver, name,
756+
isNullAware: true);
764757
}
765758

766759
@override
767760
Expression buildAssignment(Expression value, {bool voidContext = false}) {
768-
VariableDeclarationImpl variable =
769-
_helper.createVariableDeclarationForValue(receiverExpression);
770-
Expression read = _helper.forest.createPropertySet(
771-
fileOffset,
772-
_helper.createVariableGet(variable, receiverExpression.fileOffset,
773-
forNullGuardedAccess: true),
774-
name,
775-
value,
776-
forEffect: voidContext,
777-
readOnlyReceiver: true);
778-
return new NullAwarePropertySet(variable, read)
779-
..fileOffset = receiverExpression.fileOffset;
761+
return _forest.createPropertySet(fileOffset, receiver, name, value,
762+
forEffect: voidContext, isNullAware: true);
780763
}
781764

782765
@override
783766
Expression buildIfNullAssignment(Expression value, DartType type, int offset,
784767
{bool voidContext = false}) {
785-
return new NullAwareIfNullSet(receiverExpression, name, value,
768+
return new NullAwareIfNullSet(receiver, name, value,
786769
forEffect: voidContext,
787770
readOffset: fileOffset,
788771
testOffset: offset,
@@ -796,8 +779,7 @@ class NullAwarePropertyAccessGenerator extends Generator {
796779
bool voidContext = false,
797780
bool isPreIncDec = false,
798781
bool isPostIncDec = false}) {
799-
return new NullAwareCompoundSet(
800-
receiverExpression, name, binaryOperator, value,
782+
return new NullAwareCompoundSet(receiver, name, binaryOperator, value,
801783
readOffset: fileOffset,
802784
binaryOffset: offset,
803785
writeOffset: fileOffset,
@@ -834,8 +816,6 @@ class NullAwarePropertyAccessGenerator extends Generator {
834816
NameSystem syntheticNames = new NameSystem();
835817
sink.write(", receiver: ");
836818
printNodeOn(receiver, sink, syntheticNames: syntheticNames);
837-
sink.write(", receiverExpression: ");
838-
printNodeOn(receiverExpression, sink, syntheticNames: syntheticNames);
839819
sink.write(", name: ");
840820
sink.write(name.text);
841821
}
@@ -989,43 +969,14 @@ class IndexedAccessGenerator extends Generator {
989969

990970
@override
991971
Expression buildSimpleRead() {
992-
VariableDeclarationImpl? variable;
993-
Expression receiverValue;
994-
if (isNullAware) {
995-
variable = _helper.createVariableDeclarationForValue(receiver);
996-
receiverValue = _helper.createVariableGet(variable, fileOffset,
997-
forNullGuardedAccess: true);
998-
} else {
999-
receiverValue = receiver;
1000-
}
1001-
Expression result =
1002-
_forest.createIndexGet(fileOffset, receiverValue, index);
1003-
if (isNullAware) {
1004-
result = new NullAwareMethodInvocation(variable!, result)
1005-
..fileOffset = fileOffset;
1006-
}
1007-
return result;
972+
return _forest.createIndexGet(fileOffset, receiver, index,
973+
isNullAware: isNullAware);
1008974
}
1009975

1010976
@override
1011977
Expression buildAssignment(Expression value, {bool voidContext = false}) {
1012-
VariableDeclarationImpl? variable;
1013-
Expression receiverValue;
1014-
if (isNullAware) {
1015-
variable = _helper.createVariableDeclarationForValue(receiver);
1016-
receiverValue = _helper.createVariableGet(variable, fileOffset,
1017-
forNullGuardedAccess: true);
1018-
} else {
1019-
receiverValue = receiver;
1020-
}
1021-
Expression result = _forest.createIndexSet(
1022-
fileOffset, receiverValue, index, value,
1023-
forEffect: voidContext);
1024-
if (isNullAware) {
1025-
result = new NullAwareMethodInvocation(variable!, result)
1026-
..fileOffset = fileOffset;
1027-
}
1028-
return result;
978+
return _forest.createIndexSet(fileOffset, receiver, index, value,
979+
forEffect: voidContext, isNullAware: isNullAware);
1029980
}
1030981

1031982
@override
@@ -1157,14 +1108,15 @@ class ThisIndexedAccessGenerator extends Generator {
11571108
@override
11581109
Expression buildSimpleRead() {
11591110
Expression receiver = _helper.forest.createThisExpression(fileOffset);
1160-
return _forest.createIndexGet(fileOffset, receiver, index);
1111+
return _forest.createIndexGet(fileOffset, receiver, index,
1112+
isNullAware: isNullAware);
11611113
}
11621114

11631115
@override
11641116
Expression buildAssignment(Expression value, {bool voidContext = false}) {
11651117
Expression receiver = _helper.forest.createThisExpression(fileOffset);
11661118
return _forest.createIndexSet(fileOffset, receiver, index, value,
1167-
forEffect: voidContext);
1119+
forEffect: voidContext, isNullAware: isNullAware);
11681120
}
11691121

11701122
@override

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

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -681,8 +681,10 @@ class Forest {
681681
}
682682

683683
Expression createMethodInvocation(
684-
int fileOffset, Expression expression, Name name, Arguments arguments) {
685-
return new MethodInvocation(expression, name, arguments)
684+
int fileOffset, Expression expression, Name name, Arguments arguments,
685+
{required bool isNullAware}) {
686+
return new MethodInvocation(expression, name, arguments,
687+
isNullAware: isNullAware)
686688
..fileOffset = fileOffset;
687689
}
688690

@@ -696,27 +698,35 @@ class Forest {
696698
return new NullCheck(expression)..fileOffset = fileOffset;
697699
}
698700

699-
Expression createPropertyGet(int fileOffset, Expression receiver, Name name) {
700-
return new PropertyGet(receiver, name)..fileOffset = fileOffset;
701+
Expression createPropertyGet(int fileOffset, Expression receiver, Name name,
702+
{required bool isNullAware}) {
703+
return new PropertyGet(receiver, name, isNullAware: isNullAware)
704+
..fileOffset = fileOffset;
701705
}
702706

703707
Expression createPropertySet(
704708
int fileOffset, Expression receiver, Name name, Expression value,
705-
{required bool forEffect, bool readOnlyReceiver = false}) {
709+
{required bool forEffect,
710+
bool readOnlyReceiver = false,
711+
required bool isNullAware}) {
706712
return new PropertySet(receiver, name, value,
707-
forEffect: forEffect, readOnlyReceiver: readOnlyReceiver)
713+
forEffect: forEffect,
714+
readOnlyReceiver: readOnlyReceiver,
715+
isNullAware: isNullAware)
708716
..fileOffset = fileOffset;
709717
}
710718

711-
IndexGet createIndexGet(
712-
int fileOffset, Expression receiver, Expression index) {
713-
return new IndexGet(receiver, index)..fileOffset = fileOffset;
719+
IndexGet createIndexGet(int fileOffset, Expression receiver, Expression index,
720+
{required bool isNullAware}) {
721+
return new IndexGet(receiver, index, isNullAware: isNullAware)
722+
..fileOffset = fileOffset;
714723
}
715724

716725
IndexSet createIndexSet(
717726
int fileOffset, Expression receiver, Expression index, Expression value,
718-
{required bool forEffect}) {
719-
return new IndexSet(receiver, index, value, forEffect: forEffect)
727+
{required bool forEffect, required bool isNullAware}) {
728+
return new IndexSet(receiver, index, value,
729+
forEffect: forEffect, isNullAware: isNullAware)
720730
..fileOffset = fileOffset;
721731
}
722732

0 commit comments

Comments
 (0)