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(')'));