Fix analyzer/FE integration of prefix/postfix increment of non-l-values.
Fixes 2 language tests with [ $compiler == dart2analyzer && $fasta ].
Change-Id: I74f98f328c203fb68d8ebf819230dbe9405cfc7d
Reviewed-on: https://dart-review.googlesource.com/71225
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@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 c1a2cb7..232a626 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -7164,6 +7164,19 @@
expectedPrefix: myImport.prefix);
}
+ test_postfix_increment_of_non_generator() async {
+ addTestFile('''
+void f(int g()) {
+ g()++;
+}
+''');
+ await resolveTestFile();
+
+ var gRef = findNode.simple('g()++');
+ assertType(gRef, '() → int');
+ assertElement(gRef, findElement.parameter('g'));
+ }
+
test_postfixExpression_local() async {
String content = r'''
main() {
@@ -7238,6 +7251,19 @@
}
}
+ test_prefix_increment_of_non_generator() async {
+ addTestFile('''
+void f(bool x) {
+ ++!x;
+}
+''');
+ await resolveTestFile();
+
+ var xRef = findNode.simple('x;');
+ assertType(xRef, 'bool');
+ assertElement(xRef, findElement.parameter('x'));
+ }
+
test_prefixedIdentifier_classInstance_instanceField() async {
String content = r'''
main() {
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 81eb16d..74f4be3 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -2776,27 +2776,29 @@
@override
void handleUnaryPrefixAssignmentExpression(Token token) {
debugEvent("UnaryPrefixAssignmentExpression");
- Object generator = pop();
- if (generator is Generator) {
- push(generator.buildPrefixIncrement(incrementOperator(token),
- offset: token.charOffset));
+ Object target = pop();
+ Generator generator;
+ if (target is Generator) {
+ generator = target;
} else {
- push(
- wrapInCompileTimeError(toValue(generator), fasta.messageNotAnLvalue));
+ generator = new KernelNonLValueGenerator(this, token, toValue(target));
}
+ push(generator.buildPrefixIncrement(incrementOperator(token),
+ offset: token.charOffset));
}
@override
void handleUnaryPostfixAssignmentExpression(Token token) {
debugEvent("UnaryPostfixAssignmentExpression");
- Object generator = pop();
- if (generator is Generator) {
- push(new DelayedPostfixIncrement(
- this, token, generator, incrementOperator(token), null));
+ Object target = pop();
+ Generator generator;
+ if (target is Generator) {
+ generator = target;
} else {
- push(
- wrapInCompileTimeError(toValue(generator), fasta.messageNotAnLvalue));
+ generator = new KernelNonLValueGenerator(this, token, toValue(target));
}
+ push(new DelayedPostfixIncrement(
+ this, token, generator, incrementOperator(token), null));
}
@override
diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
index ebd3eb6..42e8892 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -183,10 +183,11 @@
}
@override
- IntJudgment literalInt(int value, Token token, {Expression desugaredError}) {
+ IntJudgment literalInt(int value, Token token,
+ {Expression desugaredError, bool isSynthetic: false}) {
return new IntJudgment(
typeInferenceTokensSaver?.intLiteralTokens(token), value,
- desugaredError: desugaredError)
+ desugaredError: desugaredError, isSynthetic: isSynthetic)
..fileOffset = offsetForToken(token);
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index db980e4..2e029e5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -76,7 +76,8 @@
/// Return a representation of an integer literal at the given [location]. The
/// literal has the given [value].
- Expression literalInt(int value, Token location, {Expression desugaredError});
+ Expression literalInt(int value, Token location,
+ {Expression desugaredError, bool isSynthetic: false});
/// Return a representation of a list literal. The [constKeyword] is the
/// location of the `const` keyword, or `null` if there is no keyword. The
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
index 3887581..fe7cb08 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
@@ -199,8 +199,8 @@
{int offset: TreeNode.noOffset,
bool voidContext: false,
Procedure interfaceTarget}) {
- return buildCompoundAssignment(
- binaryOperator, forest.literalInt(1, null)..fileOffset = offset,
+ return buildCompoundAssignment(binaryOperator,
+ forest.literalInt(1, null, isSynthetic: true)..fileOffset = offset,
offset: offset,
voidContext: voidContext,
interfaceTarget: interfaceTarget,
@@ -213,8 +213,8 @@
bool voidContext: false,
Procedure interfaceTarget}) {
if (voidContext) {
- return buildCompoundAssignment(
- binaryOperator, forest.literalInt(1, null)..fileOffset = offset,
+ return buildCompoundAssignment(binaryOperator,
+ forest.literalInt(1, null, isSynthetic: true)..fileOffset = offset,
offset: offset,
voidContext: voidContext,
interfaceTarget: interfaceTarget,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index 18c733c..3d1637b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -1625,16 +1625,22 @@
class IntJudgment extends IntLiteral implements ExpressionJudgment {
IntLiteralTokens tokens;
final kernel.Expression desugaredError;
+ final bool isSynthetic;
DartType inferredType;
- IntJudgment(this.tokens, int value, {this.desugaredError}) : super(value);
+ IntJudgment(this.tokens, int value,
+ {this.desugaredError, this.isSynthetic: false})
+ : super(value);
@override
Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer, DartType typeContext) {
inferredType = inferrer.coreTypes.intClass.rawType;
- inferrer.listener.intLiteral(this, fileOffset, tokens, value, inferredType);
+ if (!isSynthetic) {
+ inferrer.listener
+ .intLiteral(this, fileOffset, tokens, value, inferredType);
+ }
if (desugaredError != null) {
parent.replaceChild(this, desugaredError);
parent = null;
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 196cd1a..2730535 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -277,8 +277,6 @@
string_supertype_checked_test: CompileTimeError # Issue 34047
super_bound_closure_test/none: CompileTimeError # Issue 34047
super_conditional_operator_test/01: Crash # Error recovery in method body (error in constructor redirect)
-super_conditional_operator_test/17: Crash # Error recovery in method body (nonsensical use of super)
-super_conditional_operator_test/18: Crash # Error recovery in method body (nonsensical use of super)
super_no_such_method1_test: CompileTimeError # Issue 34047
super_no_such_method2_test: CompileTimeError # Issue 34047
super_no_such_method3_test: CompileTimeError # Issue 34047