Index: pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart |
diff --git a/pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart b/pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart |
index 0346e798ebba192f0cd2a20041ecf0da53fafe83..37a10d5653f1fa64395ba27df7b10f99ce8a58fb 100644 |
--- a/pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart |
+++ b/pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart |
@@ -11,6 +11,7 @@ import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart' |
KernelComplexAssignment, |
KernelConditionalExpression, |
KernelMethodInvocation, |
+ KernelPropertyAssign, |
KernelPropertyGet, |
KernelPropertySet, |
KernelThisExpression, |
@@ -249,8 +250,10 @@ class PropertyAccessor extends Accessor { |
Expression _makeSimpleWrite(Expression value, bool voidContext, |
KernelComplexAssignment complexAssignment) { |
- return new KernelPropertySet(receiver, name, value, setter) |
+ var write = new KernelPropertySet(receiver, name, value, setter) |
..fileOffset = offsetForToken(token); |
+ complexAssignment?.write = write; |
+ return write; |
} |
receiverAccess() { |
@@ -259,19 +262,31 @@ class PropertyAccessor extends Accessor { |
..fileOffset = offsetForToken(token); |
} |
- Expression _makeRead(KernelComplexAssignment complexAssignment) => |
- new KernelPropertyGet(receiverAccess(), name, getter) |
- ..fileOffset = offsetForToken(token); |
+ Expression _makeRead(KernelComplexAssignment complexAssignment) { |
+ var read = new KernelPropertyGet(receiverAccess(), name, getter) |
+ ..fileOffset = offsetForToken(token); |
+ complexAssignment?.read = read; |
+ return read; |
+ } |
Expression _makeWrite(Expression value, bool voidContext, |
KernelComplexAssignment complexAssignment) { |
- return new KernelPropertySet(receiverAccess(), name, value, setter) |
+ var write = new KernelPropertySet(receiverAccess(), name, value, setter) |
..fileOffset = offsetForToken(token); |
+ complexAssignment?.write = write; |
+ return write; |
} |
Expression _finish( |
- Expression body, KernelComplexAssignment complexAssignment) => |
- makeLet(_receiverVariable, body); |
+ Expression body, KernelComplexAssignment complexAssignment) { |
+ body = makeLet(_receiverVariable, body); |
+ if (complexAssignment != null) { |
+ complexAssignment.desugared = body; |
+ return complexAssignment; |
+ } else { |
+ return body; |
+ } |
+ } |
} |
/// Special case of [PropertyAccessor] to avoid creating an indirect access to |
@@ -284,45 +299,67 @@ class ThisPropertyAccessor extends Accessor { |
BuilderHelper helper, this.name, this.getter, this.setter, Token token) |
: super(helper, token); |
- Expression _makeRead(KernelComplexAssignment complexAssignment) => |
- new KernelPropertyGet(new KernelThisExpression(), name, getter) |
- ..fileOffset = offsetForToken(token); |
+ Expression _makeRead(KernelComplexAssignment complexAssignment) { |
+ var read = new KernelPropertyGet(new KernelThisExpression(), name, getter) |
+ ..fileOffset = offsetForToken(token); |
+ complexAssignment?.read = read; |
+ return read; |
+ } |
Expression _makeWrite(Expression value, bool voidContext, |
KernelComplexAssignment complexAssignment) { |
- return new KernelPropertySet( |
- new KernelThisExpression(), name, value, setter) |
- ..fileOffset = offsetForToken(token); |
+ var write = |
+ new KernelPropertySet(new KernelThisExpression(), name, value, setter) |
+ ..fileOffset = offsetForToken(token); |
+ complexAssignment?.write = write; |
+ return write; |
} |
} |
class NullAwarePropertyAccessor extends Accessor { |
VariableDeclaration receiver; |
+ Expression receiverExpression; |
Name name; |
Member getter, setter; |
DartType type; |
- NullAwarePropertyAccessor(BuilderHelper helper, Expression receiver, |
+ NullAwarePropertyAccessor(BuilderHelper helper, this.receiverExpression, |
this.name, this.getter, this.setter, this.type, Token token) |
- : this.receiver = makeOrReuseVariable(receiver), |
+ : this.receiver = makeOrReuseVariable(receiverExpression), |
super(helper, token); |
receiverAccess() => new VariableGet(receiver); |
- Expression _makeRead(KernelComplexAssignment complexAssignment) => |
- new KernelPropertyGet(receiverAccess(), name, getter); |
+ Expression _makeRead(KernelComplexAssignment complexAssignment) { |
+ var read = new KernelPropertyGet(receiverAccess(), name, getter) |
+ ..fileOffset = offsetForToken(token); |
+ complexAssignment?.read = read; |
+ return read; |
+ } |
Expression _makeWrite(Expression value, bool voidContext, |
KernelComplexAssignment complexAssignment) { |
- return new KernelPropertySet(receiverAccess(), name, value, setter); |
+ var write = new KernelPropertySet(receiverAccess(), name, value, setter) |
+ ..fileOffset = offsetForToken(token); |
+ complexAssignment?.write = write; |
+ return write; |
} |
Expression _finish( |
- Expression body, KernelComplexAssignment complexAssignment) => |
- makeLet( |
- receiver, |
- new KernelConditionalExpression( |
- buildIsNull(receiverAccess()), new NullLiteral(), body)); |
+ Expression body, KernelComplexAssignment complexAssignment) { |
+ var nullAwareGuard = new KernelConditionalExpression( |
+ buildIsNull(receiverAccess()), new NullLiteral(), body) |
+ ..fileOffset = offsetForToken(token); |
+ body = makeLet(receiver, nullAwareGuard); |
+ if (complexAssignment != null) { |
+ KernelPropertyAssign kernelPropertyAssign = complexAssignment; |
+ kernelPropertyAssign.nullAwareGuard = nullAwareGuard; |
+ kernelPropertyAssign.desugared = body; |
+ return kernelPropertyAssign; |
+ } else { |
+ return body; |
+ } |
+ } |
} |
class SuperPropertyAccessor extends Accessor { |
@@ -336,16 +373,20 @@ class SuperPropertyAccessor extends Accessor { |
Expression _makeRead(KernelComplexAssignment complexAssignment) { |
if (getter == null) return makeInvalidRead(); |
// TODO(ahe): Use [DirectPropertyGet] when possible. |
- return new SuperPropertyGet(name, getter) |
+ var read = new SuperPropertyGet(name, getter) |
..fileOffset = offsetForToken(token); |
+ complexAssignment?.read = read; |
+ return read; |
} |
Expression _makeWrite(Expression value, bool voidContext, |
KernelComplexAssignment complexAssignment) { |
if (setter == null) return makeInvalidWrite(value); |
// TODO(ahe): Use [DirectPropertySet] when possible. |
- return new SuperPropertySet(name, value, setter) |
+ var write = new SuperPropertySet(name, value, setter) |
..fileOffset = offsetForToken(token); |
+ complexAssignment?.write = write; |
+ return write; |
} |
} |