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