Improve misplaced factory/modifier recovery
Change-Id: I59be8448d1269d58ae15bb4f4d01009101346021
Reviewed-on: https://dart-review.googlesource.com/61060
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Dan Rubel <danrubel@google.com>
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
index ab82e9a..1a930e5 100644
--- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
@@ -18,6 +18,7 @@
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer/src/generated/constant.dart';
import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/parser.dart';
import 'package:analyzer/src/generated/resolver.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/generated/source_io.dart';
@@ -449,12 +450,16 @@
test_dependencyOnFactoryRedirect() async {
// a depends on A.foo() depends on A.bar()
- await _assertProperDependencies(r'''
+ await _assertProperDependencies(
+ r'''
const A a = const A.foo();
class A {
factory const A.foo() = A.bar;
const A.bar();
-}''');
+}''',
+ Parser.useFasta
+ ? const <ErrorCode>[ParserErrorCode.CONST_AFTER_FACTORY]
+ : const <ErrorCode>[]);
}
test_dependencyOnFactoryRedirectWithTypeParams() async {
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 3181e2d..f70d408 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -2967,7 +2967,8 @@
}
// Fall through to continue parsing `get` or `set` as an identifier.
} else if (identical(value, 'factory')) {
- if (next.next.isIdentifier) {
+ Token next2 = next.next;
+ if (next2.isIdentifier || next2.isModifier) {
token = parseFactoryMethod(token, beforeStart, externalToken,
staticToken ?? covariantToken, varFinalOrConst);
listener.endMember();