Improve fasta parser parameter list recovery

... and update more Analyzer fasta tests.

Change-Id: Ia6e9e08cca1a1c81528767e5c0b2f18435cd8ea9
Reviewed-on: https://dart-review.googlesource.com/61000
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Dan Rubel <danrubel@google.com>
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 3117165..3c85986 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -25,6 +25,9 @@
 import 'test_support.dart';
 
 main() {
+  // The fasta parser has a parallel set of tests in parser_fasta_test.dart
+  if (Parser.useFasta) return;
+
   defineReflectiveSuite(() {
     defineReflectiveTests(ClassMemberParserTest);
     defineReflectiveTests(ComplexParserTest);
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index 0f78b0f..952ede8 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -8760,10 +8760,15 @@
     serializeLibraryText('@a(-b=""c');
     expect(unlinkedUnits, hasLength(1));
     List<UnlinkedVariable> variables = unlinkedUnits[0].variables;
-    expect(variables, hasLength(1));
-    List<UnlinkedExpr> annotations = variables[0].annotations;
-    expect(annotations, hasLength(1));
-    expect(annotations[0].isValidConst, isFalse);
+    if (Parser.useFasta) {
+      // Fasta recovers by appending `)` after `c`
+      expect(variables, isEmpty);
+    } else {
+      expect(variables, hasLength(1));
+      List<UnlinkedExpr> annotations = variables[0].annotations;
+      expect(annotations, hasLength(1));
+      expect(annotations[0].isValidConst, isFalse);
+    }
   }
 
   test_metadata_invalid_instanceCreation_argument_super() {
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index dd332861..3181e2d 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -1189,6 +1189,12 @@
             // Scanner has already reported a missing `)` error,
             // but placed the `)` in the wrong location, so move it.
             token = rewriter.moveSynthetic(token, begin.endGroup);
+          } else if (next.kind == IDENTIFIER_TOKEN &&
+              next.next.kind == IDENTIFIER_TOKEN) {
+            // Looks like a missing comma
+            Token comma = new SyntheticToken(TokenType.COMMA, next.charOffset);
+            token = rewriter.insertTokenAfter(token, comma).next;
+            continue;
           } else {
             reportRecoverableError(
                 next, fasta.templateExpectedButGot.withArguments(')'));