Fix analyzer/CFE integration of some more obscure invalid assignment cases.
This CL fixes handling of the following erroneous assignments:
- Compound assignment to postfix increment (e.g. "x++ += y;")
- Null-aware assignment to postfix increment (e.g. "x++ ??= y;")
There is some code duplication in ContextAwareGenerator now; I will
clean that up in a follow-up CL.
Change-Id: If68bc267b67904562bf8c2e705123d04fdf0b69a
Reviewed-on: https://dart-review.googlesource.com/71321
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index 11ab373..ac3b708 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -972,6 +972,38 @@
assertElement(yRef, findElement.parameter('y'));
}
+ test_assign_to_postfix_increment_compound() async {
+ addTestFile('''
+void f(num x, int y) {
+ x++ += y;
+}
+''');
+ await resolveTestFile();
+
+ var xRef = findNode.simple('x++');
+ assertType(xRef, 'num');
+ assertElement(xRef, findElement.parameter('x'));
+ var yRef = findNode.simple('y;');
+ assertType(yRef, 'int');
+ assertElement(yRef, findElement.parameter('y'));
+ }
+
+ test_assign_to_postfix_increment_null_aware() async {
+ addTestFile('''
+void f(num x, int y) {
+ x++ ??= y;
+}
+''');
+ await resolveTestFile();
+
+ var xRef = findNode.simple('x++');
+ assertType(xRef, 'num');
+ assertElement(xRef, findElement.parameter('x'));
+ var yRef = findNode.simple('y;');
+ assertType(yRef, 'int');
+ assertElement(yRef, findElement.parameter('y'));
+ }
+
test_assign_to_prefix_increment() async {
addTestFile('''
void f(num x, int y) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 477d2eb..2d5b160 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -958,7 +958,16 @@
Expression buildNullAwareAssignment(
Expression value, DartType type, int offset,
{bool voidContext: false}) {
- return makeInvalidWrite(value);
+ var lhs = buildSimpleRead();
+ // The lhs expression needs to have a parent so that type inference can be
+ // applied to it, but it doesn't matter what the parent is because the
+ // lhs expression won't appear in the tree. So just give it a quick and
+ // dirty parent.
+ new VariableDeclaration.forValue(lhs);
+
+ return new IllegalAssignmentJudgment(value,
+ assignmentOffset: offset, desugared: makeInvalidWrite(value))
+ ..write = lhs;
}
@override
@@ -968,7 +977,16 @@
Procedure interfaceTarget,
bool isPreIncDec: false,
bool isPostIncDec: false}) {
- return makeInvalidWrite(value);
+ var lhs = buildSimpleRead();
+ // The lhs expression needs to have a parent so that type inference can be
+ // applied to it, but it doesn't matter what the parent is because the
+ // lhs expression won't appear in the tree. So just give it a quick and
+ // dirty parent.
+ new VariableDeclaration.forValue(lhs);
+
+ return new IllegalAssignmentJudgment(value,
+ assignmentOffset: offset, desugared: makeInvalidWrite(value))
+ ..write = lhs;
}
@override