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