Cleanup endMethod and endFactoryMethod parameter recovery

This CL moves missing parameter recovery code out of the AstBuilder into
the parser, and adds guard code in the AstBuilder to assert that param is not null.

Change-Id: I8e68194ad3de4b8a4be755f8fa2943344393267a
Reviewed-on: https://dart-review.googlesource.com/c/78000
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Dan Rubel <danrubel@google.com>
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 64a8683..476d0a3 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -25,7 +25,7 @@
 import 'package:front_end/src/fasta/scanner.dart' hide StringToken;
 import 'package:front_end/src/scanner/errors.dart' show translateErrorToken;
 import 'package:front_end/src/scanner/token.dart'
-    show BeginToken, SyntheticBeginToken, SyntheticStringToken, SyntheticToken;
+    show SyntheticStringToken, SyntheticToken;
 
 import 'package:front_end/src/fasta/problems.dart' show unhandled;
 import 'package:front_end/src/fasta/messages.dart'
@@ -2162,6 +2162,8 @@
     List<Annotation> metadata = pop();
     Comment comment = _findComment(metadata, beginToken);
 
+    assert(parameters != null);
+
     if (typeParameters != null) {
       // TODO(danrubel): Update OutlineBuilder to report this error message.
       handleRecoverableError(messageConstructorWithTypeParameters,
@@ -2366,6 +2368,8 @@
     List<Annotation> metadata = pop();
     Comment comment = _findComment(metadata, beginToken);
 
+    assert(parameters != null || optional('get', getOrSet));
+
     ConstructorName redirectedConstructor;
     FunctionBody body;
     if (bodyObject is FunctionBody) {
@@ -2379,30 +2383,6 @@
           beginToken.charOffset, uri);
     }
 
-    if (parameters == null && (getOrSet == null || optional('set', getOrSet))) {
-      Token token = typeParameters?.endToken;
-      if (token == null) {
-        if (name is AstNode) {
-          token = name.endToken;
-        } else if (name is _OperatorName) {
-          token = name.name.endToken;
-        } else {
-          throw new UnimplementedError();
-        }
-      }
-      Token next = token.next;
-      int offset = next.charOffset;
-      BeginToken leftParen =
-          new SyntheticBeginToken(TokenType.OPEN_PAREN, offset);
-      token.setNext(leftParen);
-      Token rightParen =
-          leftParen.setNext(new SyntheticToken(TokenType.CLOSE_PAREN, offset));
-      leftParen.endGroup = rightParen;
-      rightParen.setNext(next);
-      parameters = ast.formalParameterList(
-          leftParen, <FormalParameter>[], null, null, rightParen);
-    }
-
     ClassOrMixinDeclarationImpl declaration =
         classDeclaration ?? mixinDeclaration;
 
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index af01b99..fd10332 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -2993,7 +2993,9 @@
         : MemberKind.NonStaticMethod;
     checkFormals(token, name, isGetter, kind);
     Token beforeParam = token;
-    token = parseFormalParametersOpt(token, kind);
+    token = isGetter
+        ? parseFormalParametersOpt(token, kind)
+        : parseFormalParametersRequiredOpt(token, kind);
     token = parseInitializersOpt(token);
 
     AsyncModifier savedAsyncModifier = asyncState;