Version 2.13.0-138.0.dev

Merge commit 'd6b79dab6c6401c08ec6bddf5f2beb84198e17dc' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index 097e4fa..a1749b6 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -1044,10 +1044,43 @@
   }
 
   /// ```
-  /// annotation:
-  ///   '@' qualified ('.' identifier)? arguments?
-  /// ;
+  /// <metadata> ::= (‘@’ <metadatum>)*
+  /// <metadatum> ::= <identifier>
+  ///   | <qualifiedName>
+  ///   | <constructorDesignation> <arguments>
+  /// <qualifiedName> ::= <typeIdentifier> ‘.’ <identifier>
+  ///   | <typeIdentifier> ‘.’ <typeIdentifier> ‘.’ <identifier>
+  /// <constructorDesignation> ::= <typeIdentifier>
+  ///   | <qualifiedName>
+  ///   | <typeName> <typeArguments> (‘.’ <identifier>)?
+  /// <typeName> ::= <typeIdentifier> (‘.’ <typeIdentifier>)?
   /// ```
+  /// (where typeIdentifier is an identifier that's not on the list of
+  /// built in identifiers)
+  /// So these are legal:
+  /// * identifier
+  /// qualifiedName:
+  /// * typeIdentifier.identifier
+  /// * typeIdentifier.typeIdentifier.identifier
+  /// via constructorDesignation part 1
+  /// * typeIdentifier(arguments)
+  /// via constructorDesignation part 2
+  /// * typeIdentifier.identifier(arguments)
+  /// * typeIdentifier.typeIdentifier.identifier(arguments)
+  /// via constructorDesignation part 3
+  /// * typeIdentifier<typeArguments>(arguments)
+  /// * typeIdentifier<typeArguments>.identifier(arguments)
+  /// * typeIdentifier.typeIdentifier<typeArguments>(arguments)
+  /// * typeIdentifier.typeIdentifier<typeArguments>.identifier(arguments)
+  ///
+  /// So in another way (ignoring the difference between typeIdentifier and
+  /// identifier):
+  /// * 1, 2 or 3 identifiers with or without arguments.
+  /// * 1 or 2 identifiers, then type arguments, then possibly followed by a
+  ///   single identifier, and then (required!) arguments.
+  ///
+  /// Note that if this is updated [skipMetadata] (in util.dart) should be
+  /// updated as well.
   Token parseMetadata(Token token) {
     Token atToken = token.next!;
     assert(optional('@', atToken));
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/util.dart b/pkg/_fe_analyzer_shared/lib/src/parser/util.dart
index f6f1939..6891278 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/util.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/util.dart
@@ -105,10 +105,12 @@
   token = token.next!;
   assert(optional('@', token));
   Token next = token.next!;
+  // Corresponds to 'ensureIdentifier' in [parseMetadata].
   if (next.isIdentifier) {
     token = next;
     next = token.next!;
-    while (optional('.', next)) {
+    // Corresponds to 'parseQualifiedRestOpt' in [parseMetadata].
+    if (optional('.', next)) {
       token = next;
       next = token.next!;
       if (next.isIdentifier) {
@@ -116,6 +118,23 @@
         next = token.next!;
       }
     }
+    // Corresponds to 'computeTypeParamOrArg' in [parseMetadata].
+    if (optional('<', next) && !next.endGroup!.isSynthetic) {
+      token = next.endGroup!;
+      next = token.next!;
+    }
+
+    // The extra .identifier after arguments in in [parseMetadata].
+    if (optional('.', next)) {
+      token = next;
+      next = token.next!;
+      if (next.isIdentifier) {
+        token = next;
+        next = token.next!;
+      }
+    }
+
+    // Corresponds to 'parseArgumentsOpt' in [parseMetadata].
     if (optional('(', next) && !next.endGroup!.isSynthetic) {
       token = next.endGroup!;
       next = token.next!;
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 4c6b895..93add07 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -4253,7 +4253,8 @@
       {bool isTearOff}) {
     List<TypeParameter> typeParameters = target.function.typeParameters;
     LocatedMessage argMessage = checkArgumentsForFunction(
-        target.function, arguments, fileOffset, typeParameters);
+        target.function, arguments, fileOffset, typeParameters,
+        isExtensionMemberInvocation: true);
     if (argMessage != null) {
       return throwNoSuchMethodError(forest.createNullLiteral(fileOffset),
           target.name.text, arguments, fileOffset,
@@ -4272,19 +4273,32 @@
 
   @override
   LocatedMessage checkArgumentsForFunction(FunctionNode function,
-      Arguments arguments, int offset, List<TypeParameter> typeParameters) {
+      Arguments arguments, int offset, List<TypeParameter> typeParameters,
+      {bool isExtensionMemberInvocation = false}) {
+    int requiredPositionalParameterCountToReport =
+        function.requiredParameterCount;
+    int positionalParameterCountToReport = function.positionalParameters.length;
+    int positionalArgumentCountToReport =
+        forest.argumentsPositional(arguments).length;
+    if (isExtensionMemberInvocation) {
+      // Extension member invocations have additional synthetic parameter for
+      // `this`.
+      --requiredPositionalParameterCountToReport;
+      --positionalParameterCountToReport;
+      --positionalArgumentCountToReport;
+    }
     if (forest.argumentsPositional(arguments).length <
         function.requiredParameterCount) {
       return fasta.templateTooFewArguments
-          .withArguments(function.requiredParameterCount,
-              forest.argumentsPositional(arguments).length)
+          .withArguments(requiredPositionalParameterCountToReport,
+              positionalArgumentCountToReport)
           .withLocation(uri, arguments.fileOffset, noLength);
     }
     if (forest.argumentsPositional(arguments).length >
         function.positionalParameters.length) {
       return fasta.templateTooManyArguments
-          .withArguments(function.positionalParameters.length,
-              forest.argumentsPositional(arguments).length)
+          .withArguments(
+              positionalParameterCountToReport, positionalArgumentCountToReport)
           .withLocation(uri, arguments.fileOffset, noLength);
     }
     List<NamedExpression> named = forest.argumentsNamed(arguments);
@@ -4331,19 +4345,32 @@
 
   @override
   LocatedMessage checkArgumentsForType(
-      FunctionType function, Arguments arguments, int offset) {
+      FunctionType function, Arguments arguments, int offset,
+      {bool isExtensionMemberInvocation = false}) {
+    int requiredPositionalParameterCountToReport =
+        function.requiredParameterCount;
+    int positionalParameterCountToReport = function.positionalParameters.length;
+    int positionalArgumentCountToReport =
+        forest.argumentsPositional(arguments).length;
+    if (isExtensionMemberInvocation) {
+      // Extension member invocations have additional synthetic parameter for
+      // `this`.
+      --requiredPositionalParameterCountToReport;
+      --positionalParameterCountToReport;
+      --positionalArgumentCountToReport;
+    }
     if (forest.argumentsPositional(arguments).length <
         function.requiredParameterCount) {
       return fasta.templateTooFewArguments
-          .withArguments(function.requiredParameterCount,
-              forest.argumentsPositional(arguments).length)
+          .withArguments(requiredPositionalParameterCountToReport,
+              positionalArgumentCountToReport)
           .withLocation(uri, arguments.fileOffset, noLength);
     }
     if (forest.argumentsPositional(arguments).length >
         function.positionalParameters.length) {
       return fasta.templateTooManyArguments
-          .withArguments(function.positionalParameters.length,
-              forest.argumentsPositional(arguments).length)
+          .withArguments(
+              positionalParameterCountToReport, positionalArgumentCountToReport)
           .withLocation(uri, arguments.fileOffset, noLength);
     }
     List<NamedExpression> named = forest.argumentsNamed(arguments);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart b/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
index 24f2850..572feea 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
@@ -21,7 +21,8 @@
       {List<LocatedMessage> context, bool suppressMessage});
 
   LocatedMessage checkArgumentsForType(
-      FunctionType function, Arguments arguments, int offset);
+      FunctionType function, Arguments arguments, int offset,
+      {bool isExtensionMemberInvocation = false});
 
   void addProblem(Message message, int charOffset, int length,
       {List<LocatedMessage> context, bool wasHandled});
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 0c4eca9..78e4c89 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -2058,7 +2058,8 @@
       bool isConst: false,
       bool isImplicitExtensionMember: false,
       bool isImplicitCall: false,
-      Member staticTarget}) {
+      Member staticTarget,
+      bool isExtensionMemberInvocation = false}) {
     int extensionTypeParameterCount = getExtensionTypeParameterCount(arguments);
     if (extensionTypeParameterCount != 0) {
       return _inferGenericExtensionMethodInvocation(extensionTypeParameterCount,
@@ -2079,7 +2080,8 @@
         isConst: isConst,
         isImplicitExtensionMember: isImplicitExtensionMember,
         isImplicitCall: isImplicitCall,
-        staticTarget: staticTarget);
+        staticTarget: staticTarget,
+        isExtensionMemberInvocation: isExtensionMemberInvocation);
   }
 
   InvocationInferenceResult _inferGenericExtensionMethodInvocation(
@@ -2114,7 +2116,8 @@
         receiverType: receiverType,
         isImplicitExtensionMember: isImplicitExtensionMember,
         isImplicitCall: isImplicitCall,
-        staticTarget: staticTarget);
+        staticTarget: staticTarget,
+        isExtensionMemberInvocation: true);
     Substitution extensionSubstitution = Substitution.fromPairs(
         extensionFunctionType.typeParameters, extensionArguments.types);
 
@@ -2171,7 +2174,8 @@
       bool isConst: false,
       bool isImplicitExtensionMember: false,
       bool isImplicitCall,
-      Member staticTarget}) {
+      Member staticTarget,
+      bool isExtensionMemberInvocation: false}) {
     List<TypeParameter> calleeTypeParameters = calleeType.typeParameters;
     if (calleeTypeParameters.isNotEmpty) {
       // It's possible that one of the callee type parameters might match a type
@@ -2391,8 +2395,9 @@
     List<DartType> positionalArgumentTypes = [];
     List<NamedType> namedArgumentTypes = [];
     if (typeChecksNeeded && !identical(calleeType, unknownFunction)) {
-      LocatedMessage argMessage =
-          helper.checkArgumentsForType(calleeType, arguments, offset);
+      LocatedMessage argMessage = helper.checkArgumentsForType(
+          calleeType, arguments, offset,
+          isExtensionMemberInvocation: isExtensionMemberInvocation);
       if (argMessage != null) {
         return new WrapInProblemInferenceResult(
             const InvalidType(),
@@ -2860,7 +2865,8 @@
           hoistedExpressions: hoistedExpressions,
           receiverType: receiverType,
           isImplicitExtensionMember: true,
-          isImplicitCall: isImplicitCall);
+          isImplicitCall: isImplicitCall,
+          isExtensionMemberInvocation: true);
       if (!isTopLevel) {
         library.checkBoundsInStaticInvocation(staticInvocation,
             typeSchemaEnvironment, helper.uri, getTypeArgumentsInfo(arguments));
diff --git a/pkg/front_end/parser_testcases/general/issue_45120.dart b/pkg/front_end/parser_testcases/general/issue_45120.dart
new file mode 100644
index 0000000..bd3974e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45120.dart
@@ -0,0 +1,7 @@
+@A<int>(0)
+typedef F<@A<int>(0) T> = int Function<@A<int>(0) X>(@A<int>(0) int);
+
+void main() {
+  @A<int>(0)
+  void Function<@A<int>(0) X>(@A<int>(0) int y)? f = null;
+}
diff --git a/pkg/front_end/parser_testcases/general/issue_45120.dart.expect b/pkg/front_end/parser_testcases/general/issue_45120.dart.expect
new file mode 100644
index 0000000..1effedc
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45120.dart.expect
@@ -0,0 +1,167 @@
+beginCompilationUnit(@)
+  beginMetadataStar(@)
+    beginMetadata(@)
+      handleIdentifier(A, metadataReference)
+      beginTypeArguments(<)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(>)
+        handleType(int, null)
+      endTypeArguments(1, <, >)
+      beginArguments(()
+        handleLiteralInt(0)
+      endArguments(1, (, ))
+    endMetadata(@, null, typedef)
+  endMetadataStar(1)
+  beginUncategorizedTopLevelDeclaration(typedef)
+    beginFunctionTypeAlias(typedef)
+      handleIdentifier(F, typedefDeclaration)
+      beginTypeVariables(<)
+        beginMetadataStar(@)
+          beginMetadata(@)
+            handleIdentifier(A, metadataReference)
+            beginTypeArguments(<)
+              handleIdentifier(int, typeReference)
+              handleNoTypeArguments(>)
+              handleType(int, null)
+            endTypeArguments(1, <, >)
+            beginArguments(()
+              handleLiteralInt(0)
+            endArguments(1, (, ))
+          endMetadata(@, null, T)
+        endMetadataStar(1)
+        handleIdentifier(T, typeVariableDeclaration)
+        beginTypeVariable(T)
+          handleTypeVariablesDefined(T, 1)
+          handleNoType(T)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      beginFunctionType(int)
+        beginTypeVariables(<)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(A, metadataReference)
+              beginTypeArguments(<)
+                handleIdentifier(int, typeReference)
+                handleNoTypeArguments(>)
+                handleType(int, null)
+              endTypeArguments(1, <, >)
+              beginArguments(()
+                handleLiteralInt(0)
+              endArguments(1, (, ))
+            endMetadata(@, null, X)
+          endMetadataStar(1)
+          handleIdentifier(X, typeVariableDeclaration)
+          beginTypeVariable(X)
+            handleTypeVariablesDefined(X, 1)
+            handleNoType(X)
+          endTypeVariable(>, 0, null, null)
+        endTypeVariables(<, >)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(Function)
+        handleType(int, null)
+        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(A, metadataReference)
+              beginTypeArguments(<)
+                handleIdentifier(int, typeReference)
+                handleNoTypeArguments(>)
+                handleType(int, null)
+              endTypeArguments(1, <, >)
+              beginArguments(()
+                handleLiteralInt(0)
+              endArguments(1, (, ))
+            endMetadata(@, null, int)
+          endMetadataStar(1)
+          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+            handleIdentifier(int, typeReference)
+            handleNoTypeArguments())
+            handleType(int, null)
+            handleNoName())
+            handleFormalParameterWithoutValue())
+          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+      endFunctionType(Function, null)
+    endFunctionTypeAlias(typedef, =, ;)
+  endTopLevelDeclaration(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(;, null)
+      handleVoidKeyword(void)
+      handleIdentifier(main, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginMetadataStar(@)
+          beginMetadata(@)
+            handleIdentifier(A, metadataReference)
+            beginTypeArguments(<)
+              handleIdentifier(int, typeReference)
+              handleNoTypeArguments(>)
+              handleType(int, null)
+            endTypeArguments(1, <, >)
+            beginArguments(()
+              handleLiteralInt(0)
+            endArguments(1, (, ))
+          endMetadata(@, null, void)
+        endMetadataStar(1)
+        beginFunctionType(void)
+          beginTypeVariables(<)
+            beginMetadataStar(@)
+              beginMetadata(@)
+                handleIdentifier(A, metadataReference)
+                beginTypeArguments(<)
+                  handleIdentifier(int, typeReference)
+                  handleNoTypeArguments(>)
+                  handleType(int, null)
+                endTypeArguments(1, <, >)
+                beginArguments(()
+                  handleLiteralInt(0)
+                endArguments(1, (, ))
+              endMetadata(@, null, X)
+            endMetadataStar(1)
+            handleIdentifier(X, typeVariableDeclaration)
+            beginTypeVariable(X)
+              handleTypeVariablesDefined(X, 1)
+              handleNoType(X)
+            endTypeVariable(>, 0, null, null)
+          endTypeVariables(<, >)
+          handleVoidKeyword(void)
+          beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            beginMetadataStar(@)
+              beginMetadata(@)
+                handleIdentifier(A, metadataReference)
+                beginTypeArguments(<)
+                  handleIdentifier(int, typeReference)
+                  handleNoTypeArguments(>)
+                  handleType(int, null)
+                endTypeArguments(1, <, >)
+                beginArguments(()
+                  handleLiteralInt(0)
+                endArguments(1, (, ))
+              endMetadata(@, null, int)
+            endMetadataStar(1)
+            beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+              handleIdentifier(int, typeReference)
+              handleNoTypeArguments(y)
+              handleType(int, null)
+              handleIdentifier(y, formalParameterDeclaration)
+              handleFormalParameterWithoutValue())
+            endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+        endFunctionType(Function, ?)
+        beginVariablesDeclaration(f, null, null)
+          handleIdentifier(f, localVariableDeclaration)
+          beginInitializedIdentifier(f)
+            beginVariableInitializer(=)
+              handleLiteralNull(null)
+            endVariableInitializer(=)
+          endInitializedIdentifier(f)
+        endVariablesDeclaration(1, ;)
+      endBlockFunctionBody(1, {, })
+    endTopLevelMethod(void, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/general/issue_45120.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45120.dart.intertwined.expect
new file mode 100644
index 0000000..63f2c9a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45120.dart.intertwined.expect
@@ -0,0 +1,301 @@
+parseUnit(@)
+  skipErrorTokens(@)
+  listener: beginCompilationUnit(@)
+  syntheticPreviousToken(@)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(@)
+      parseMetadata()
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          listener: handleIdentifier(A, metadataReference)
+        parseQualifiedRestOpt(A, metadataContinuation)
+        listener: beginTypeArguments(<)
+        listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(int, null)
+        listener: endTypeArguments(1, <, >)
+        parseArgumentsOpt(>)
+          parseArguments(>)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              parseExpression(()
+                parsePrecedenceExpression((, 1, true)
+                  parseUnaryExpression((, true)
+                    parsePrimary((, expression)
+                      parseLiteralInt(()
+                        listener: handleLiteralInt(0)
+              listener: endArguments(1, (, ))
+        listener: endMetadata(@, null, typedef)
+      listener: endMetadataStar(1)
+    parseTopLevelKeywordDeclaration(), typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(), typedef)
+      parseTypedef(typedef)
+        listener: beginUncategorizedTopLevelDeclaration(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(F, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(A, metadataReference)
+            parseQualifiedRestOpt(A, metadataContinuation)
+            listener: beginTypeArguments(<)
+            listener: handleIdentifier(int, typeReference)
+            listener: handleNoTypeArguments(>)
+            listener: handleType(int, null)
+            listener: endTypeArguments(1, <, >)
+            parseArgumentsOpt(>)
+              parseArguments(>)
+                parseArgumentsRest(()
+                  listener: beginArguments(()
+                  parseExpression(()
+                    parsePrecedenceExpression((, 1, true)
+                      parseUnaryExpression((, true)
+                        parsePrimary((, expression)
+                          parseLiteralInt(()
+                            listener: handleLiteralInt(0)
+                  listener: endArguments(1, (, ))
+            listener: endMetadata(@, null, T)
+          listener: endMetadataStar(1)
+        ensureIdentifier(), typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(T, 1)
+        listener: handleNoType(T)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(int)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(A, metadataReference)
+            parseQualifiedRestOpt(A, metadataContinuation)
+            listener: beginTypeArguments(<)
+            listener: handleIdentifier(int, typeReference)
+            listener: handleNoTypeArguments(>)
+            listener: handleType(int, null)
+            listener: endTypeArguments(1, <, >)
+            parseArgumentsOpt(>)
+              parseArguments(>)
+                parseArgumentsRest(()
+                  listener: beginArguments(()
+                  parseExpression(()
+                    parsePrecedenceExpression((, 1, true)
+                      parseUnaryExpression((, true)
+                        parsePrimary((, expression)
+                          parseLiteralInt(()
+                            listener: handleLiteralInt(0)
+                  listener: endArguments(1, (, ))
+            listener: endMetadata(@, null, X)
+          listener: endMetadataStar(1)
+        ensureIdentifier(), typeVariableDeclaration)
+          listener: handleIdentifier(X, typeVariableDeclaration)
+        listener: beginTypeVariable(X)
+        listener: handleTypeVariablesDefined(X, 1)
+        listener: handleNoType(X)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        ensureIdentifier(=, typeReference)
+          listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(Function)
+        listener: handleType(int, null)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              parseMetadataStar(()
+                listener: beginMetadataStar(@)
+                parseMetadata(()
+                  listener: beginMetadata(@)
+                  ensureIdentifier(@, metadataReference)
+                    listener: handleIdentifier(A, metadataReference)
+                  parseQualifiedRestOpt(A, metadataContinuation)
+                  listener: beginTypeArguments(<)
+                  listener: handleIdentifier(int, typeReference)
+                  listener: handleNoTypeArguments(>)
+                  listener: handleType(int, null)
+                  listener: endTypeArguments(1, <, >)
+                  parseArgumentsOpt(>)
+                    parseArguments(>)
+                      parseArgumentsRest(()
+                        listener: beginArguments(()
+                        parseExpression(()
+                          parsePrecedenceExpression((, 1, true)
+                            parseUnaryExpression((, true)
+                              parsePrimary((, expression)
+                                parseLiteralInt(()
+                                  listener: handleLiteralInt(0)
+                        listener: endArguments(1, (, ))
+                  listener: endMetadata(@, null, int)
+                listener: endMetadataStar(1)
+              listener: beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+              listener: handleIdentifier(int, typeReference)
+              listener: handleNoTypeArguments())
+              listener: handleType(int, null)
+              listener: handleNoName())
+              listener: handleFormalParameterWithoutValue())
+              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(void)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(;, null, ;, Instance of 'VoidType', null, main, false)
+        listener: beginTopLevelMethod(;, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(main, topLevelFunctionDeclaration)
+        parseMethodTypeVar(main)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(main, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, @)
+          parseStatement({)
+            parseStatementX({)
+              parseExpressionStatementOrDeclaration({, false)
+                parseMetadataStar({)
+                  listener: beginMetadataStar(@)
+                  parseMetadata({)
+                    listener: beginMetadata(@)
+                    ensureIdentifier(@, metadataReference)
+                      listener: handleIdentifier(A, metadataReference)
+                    parseQualifiedRestOpt(A, metadataContinuation)
+                    listener: beginTypeArguments(<)
+                    listener: handleIdentifier(int, typeReference)
+                    listener: handleNoTypeArguments(>)
+                    listener: handleType(int, null)
+                    listener: endTypeArguments(1, <, >)
+                    parseArgumentsOpt(>)
+                      parseArguments(>)
+                        parseArgumentsRest(()
+                          listener: beginArguments(()
+                          parseExpression(()
+                            parsePrecedenceExpression((, 1, true)
+                              parseUnaryExpression((, true)
+                                parsePrimary((, expression)
+                                  parseLiteralInt(()
+                                    listener: handleLiteralInt(0)
+                          listener: endArguments(1, (, ))
+                    listener: endMetadata(@, null, void)
+                  listener: endMetadataStar(1)
+                parseExpressionStatementOrDeclarationAfterModifiers(), {, null, null, null, false)
+                  looksLikeLocalFunction(f)
+                  listener: beginFunctionType(void)
+                  listener: beginTypeVariables(<)
+                  parseMetadataStar(<)
+                    listener: beginMetadataStar(@)
+                    parseMetadata(<)
+                      listener: beginMetadata(@)
+                      ensureIdentifier(@, metadataReference)
+                        listener: handleIdentifier(A, metadataReference)
+                      parseQualifiedRestOpt(A, metadataContinuation)
+                      listener: beginTypeArguments(<)
+                      listener: handleIdentifier(int, typeReference)
+                      listener: handleNoTypeArguments(>)
+                      listener: handleType(int, null)
+                      listener: endTypeArguments(1, <, >)
+                      parseArgumentsOpt(>)
+                        parseArguments(>)
+                          parseArgumentsRest(()
+                            listener: beginArguments(()
+                            parseExpression(()
+                              parsePrecedenceExpression((, 1, true)
+                                parseUnaryExpression((, true)
+                                  parsePrimary((, expression)
+                                    parseLiteralInt(()
+                                      listener: handleLiteralInt(0)
+                            listener: endArguments(1, (, ))
+                      listener: endMetadata(@, null, X)
+                    listener: endMetadataStar(1)
+                  ensureIdentifier(), typeVariableDeclaration)
+                    listener: handleIdentifier(X, typeVariableDeclaration)
+                  listener: beginTypeVariable(X)
+                  listener: handleTypeVariablesDefined(X, 1)
+                  listener: handleNoType(X)
+                  listener: endTypeVariable(>, 0, null, null)
+                  listener: endTypeVariables(<, >)
+                  listener: handleVoidKeyword(void)
+                  parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+                    parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+                      listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+                      parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+                        parseMetadataStar(()
+                          listener: beginMetadataStar(@)
+                          parseMetadata(()
+                            listener: beginMetadata(@)
+                            ensureIdentifier(@, metadataReference)
+                              listener: handleIdentifier(A, metadataReference)
+                            parseQualifiedRestOpt(A, metadataContinuation)
+                            listener: beginTypeArguments(<)
+                            listener: handleIdentifier(int, typeReference)
+                            listener: handleNoTypeArguments(>)
+                            listener: handleType(int, null)
+                            listener: endTypeArguments(1, <, >)
+                            parseArgumentsOpt(>)
+                              parseArguments(>)
+                                parseArgumentsRest(()
+                                  listener: beginArguments(()
+                                  parseExpression(()
+                                    parsePrecedenceExpression((, 1, true)
+                                      parseUnaryExpression((, true)
+                                        parsePrimary((, expression)
+                                          parseLiteralInt(()
+                                            listener: handleLiteralInt(0)
+                                  listener: endArguments(1, (, ))
+                            listener: endMetadata(@, null, int)
+                          listener: endMetadataStar(1)
+                        listener: beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+                        listener: handleIdentifier(int, typeReference)
+                        listener: handleNoTypeArguments(y)
+                        listener: handleType(int, null)
+                        ensureIdentifier(int, formalParameterDeclaration)
+                          listener: handleIdentifier(y, formalParameterDeclaration)
+                        listener: handleFormalParameterWithoutValue())
+                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+                      listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+                  listener: endFunctionType(Function, ?)
+                  listener: beginVariablesDeclaration(f, null, null)
+                  parseVariablesDeclarationRest(?, true)
+                    parseOptionallyInitializedIdentifier(?)
+                      ensureIdentifier(?, localVariableDeclaration)
+                        listener: handleIdentifier(f, localVariableDeclaration)
+                      listener: beginInitializedIdentifier(f)
+                      parseVariableInitializerOpt(f)
+                        listener: beginVariableInitializer(=)
+                        parseExpression(=)
+                          parsePrecedenceExpression(=, 1, true)
+                            parseUnaryExpression(=, true)
+                              parsePrimary(=, expression)
+                                parseLiteralNull(=)
+                                  listener: handleLiteralNull(null)
+                        listener: endVariableInitializer(=)
+                      listener: endInitializedIdentifier(f)
+                    ensureSemicolon(null)
+                    listener: endVariablesDeclaration(1, ;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(1, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(@)
+  listener: endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/general/issue_45120.dart.parser.expect b/pkg/front_end/parser_testcases/general/issue_45120.dart.parser.expect
new file mode 100644
index 0000000..954f749
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45120.dart.parser.expect
@@ -0,0 +1,17 @@
+@A<int>(0)
+typedef F<@A<int>(0) T> = int Function<@A<int>(0) X>(@A<int>(0) int);
+
+void main() {
+@A<int>(0)
+void Function<@A<int>(0) X>(@A<int>(0) int y)? f = null;
+}
+
+
+@[SimpleToken]A[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]0[StringToken])[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]A[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]0[StringToken])[SimpleToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]A[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]0[StringToken])[SimpleToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]A[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]0[StringToken])[SimpleToken] int[StringToken])[SimpleToken];[SimpleToken]
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+@[SimpleToken]A[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]0[StringToken])[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]A[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]0[StringToken])[SimpleToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]A[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]0[StringToken])[SimpleToken] int[StringToken] y[StringToken])[SimpleToken]?[SimpleToken] f[StringToken] =[SimpleToken] null[KeywordToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/issue_45120.dart.scanner.expect b/pkg/front_end/parser_testcases/general/issue_45120.dart.scanner.expect
new file mode 100644
index 0000000..954f749
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45120.dart.scanner.expect
@@ -0,0 +1,17 @@
+@A<int>(0)
+typedef F<@A<int>(0) T> = int Function<@A<int>(0) X>(@A<int>(0) int);
+
+void main() {
+@A<int>(0)
+void Function<@A<int>(0) X>(@A<int>(0) int y)? f = null;
+}
+
+
+@[SimpleToken]A[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]0[StringToken])[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]A[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]0[StringToken])[SimpleToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]A[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]0[StringToken])[SimpleToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]A[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]0[StringToken])[SimpleToken] int[StringToken])[SimpleToken];[SimpleToken]
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+@[SimpleToken]A[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]0[StringToken])[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]A[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]0[StringToken])[SimpleToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]A[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]0[StringToken])[SimpleToken] int[StringToken] y[StringToken])[SimpleToken]?[SimpleToken] f[StringToken] =[SimpleToken] null[KeywordToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/metadata.dart b/pkg/front_end/parser_testcases/general/metadata.dart
new file mode 100644
index 0000000..53003ad
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/metadata.dart
@@ -0,0 +1,40 @@
+// These 10 should be OK.
+@abstract
+@foo.abstract
+@foo.bar.abstract
+@foo("hello")
+@foo.abstract("hello")
+@foo.bar.abstract("hello")
+@foo<int>("hello")
+@foo<int>.abstract("hello")
+@foo.bar<int>("hello")
+@foo.bar<int>.abstract("hello")
+class X {}
+
+// They should also be OK in various places for instance:
+typedef F<@abstract T> = int Function<@abstract X>(@abstract int);
+typedef F<@foo.abstract T> = int Function<@foo.abstract X>(@foo.abstract int);
+typedef F<@foo.bar.abstract T> = int Function<@foo.bar.abstract X>(@foo.bar.abstract int);
+typedef F<@foo("hello") T> = int Function<@foo("hello") X>(@foo("hello") int);
+typedef F<@foo.abstract("hello") T> = int Function<@foo.abstract("hello") X>(@foo.abstract("hello") int);
+typedef F<@foo.bar.abstract("hello") T> = int Function<@foo.bar.abstract("hello") X>(@foo.bar.abstract("hello") int);
+typedef F<@foo<int>("hello") T> = int Function<@foo<int>("hello") X>(@foo<int>("hello") int);
+typedef F<@foo<int>.abstract("hello") T> = int Function<@foo<int>.abstract("hello") X>(@foo<int>.abstract("hello") int);
+typedef F<@foo.bar<int>("hello") T> = int Function<@foo.bar<int>("hello") X>(@foo.bar<int>("hello") int);
+typedef F<@foo.bar<int>.abstract("hello") T> = int Function<@foo.bar<int>.abstract("hello") X>(@foo.bar<int>.abstract("hello") int);
+
+// These 9 should fail because they start with a built in which is an
+// identifier but not a typeIdentifier.
+// We don't necessarily expect that parser to give the error though, the further
+// pipeline will give an error because there's no class, variable etc with that
+// name.
+@abstract.abstract
+@abstract.bar.abstract
+@abstract("hello")
+@abstract.abstract("hello")
+@abstract.bar.abstract("hello")
+@abstract<int>("hello")
+@abstract<int>.abstract("hello")
+@abstract.bar<int>("hello")
+@abstract.bar<int>.abstract("hello")
+class Y {}
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/general/metadata.dart.expect b/pkg/front_end/parser_testcases/general/metadata.dart.expect
new file mode 100644
index 0000000..d342b49
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/metadata.dart.expect
@@ -0,0 +1,952 @@
+beginCompilationUnit(@)
+  beginMetadataStar(@)
+    beginMetadata(@)
+      handleIdentifier(abstract, metadataReference)
+      handleNoTypeArguments(@)
+      handleNoArguments(@)
+    endMetadata(@, null, @)
+    beginMetadata(@)
+      handleIdentifier(foo, metadataReference)
+      handleIdentifier(abstract, metadataContinuation)
+      handleQualified(.)
+      handleNoTypeArguments(@)
+      handleNoArguments(@)
+    endMetadata(@, null, @)
+    beginMetadata(@)
+      handleIdentifier(foo, metadataReference)
+      handleIdentifier(bar, metadataContinuation)
+      handleQualified(.)
+      handleNoTypeArguments(.)
+      handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+      handleNoArguments(@)
+    endMetadata(@, ., @)
+    beginMetadata(@)
+      handleIdentifier(foo, metadataReference)
+      handleNoTypeArguments(()
+      beginArguments(()
+        beginLiteralString("hello")
+        endLiteralString(0, ))
+      endArguments(1, (, ))
+    endMetadata(@, null, @)
+    beginMetadata(@)
+      handleIdentifier(foo, metadataReference)
+      handleIdentifier(abstract, metadataContinuation)
+      handleQualified(.)
+      handleNoTypeArguments(()
+      beginArguments(()
+        beginLiteralString("hello")
+        endLiteralString(0, ))
+      endArguments(1, (, ))
+    endMetadata(@, null, @)
+    beginMetadata(@)
+      handleIdentifier(foo, metadataReference)
+      handleIdentifier(bar, metadataContinuation)
+      handleQualified(.)
+      handleNoTypeArguments(.)
+      handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+      beginArguments(()
+        beginLiteralString("hello")
+        endLiteralString(0, ))
+      endArguments(1, (, ))
+    endMetadata(@, ., @)
+    beginMetadata(@)
+      handleIdentifier(foo, metadataReference)
+      beginTypeArguments(<)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(>)
+        handleType(int, null)
+      endTypeArguments(1, <, >)
+      beginArguments(()
+        beginLiteralString("hello")
+        endLiteralString(0, ))
+      endArguments(1, (, ))
+    endMetadata(@, null, @)
+    beginMetadata(@)
+      handleIdentifier(foo, metadataReference)
+      beginTypeArguments(<)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(>)
+        handleType(int, null)
+      endTypeArguments(1, <, >)
+      handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+      beginArguments(()
+        beginLiteralString("hello")
+        endLiteralString(0, ))
+      endArguments(1, (, ))
+    endMetadata(@, ., @)
+    beginMetadata(@)
+      handleIdentifier(foo, metadataReference)
+      handleIdentifier(bar, metadataContinuation)
+      handleQualified(.)
+      beginTypeArguments(<)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(>)
+        handleType(int, null)
+      endTypeArguments(1, <, >)
+      beginArguments(()
+        beginLiteralString("hello")
+        endLiteralString(0, ))
+      endArguments(1, (, ))
+    endMetadata(@, null, @)
+    beginMetadata(@)
+      handleIdentifier(foo, metadataReference)
+      handleIdentifier(bar, metadataContinuation)
+      handleQualified(.)
+      beginTypeArguments(<)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(>)
+        handleType(int, null)
+      endTypeArguments(1, <, >)
+      handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+      beginArguments(()
+        beginLiteralString("hello")
+        endLiteralString(0, ))
+      endArguments(1, (, ))
+    endMetadata(@, ., class)
+  endMetadataStar(10)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(X, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, X)
+      handleNoType(X)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(typedef)
+  beginMetadataStar(typedef)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(typedef)
+    beginFunctionTypeAlias(typedef)
+      handleIdentifier(F, typedefDeclaration)
+      beginTypeVariables(<)
+        beginMetadataStar(@)
+          beginMetadata(@)
+            handleIdentifier(abstract, metadataReference)
+            handleNoTypeArguments(T)
+            handleNoArguments(T)
+          endMetadata(@, null, T)
+        endMetadataStar(1)
+        handleIdentifier(T, typeVariableDeclaration)
+        beginTypeVariable(T)
+          handleTypeVariablesDefined(T, 1)
+          handleNoType(T)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      beginFunctionType(int)
+        beginTypeVariables(<)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(abstract, metadataReference)
+              handleNoTypeArguments(X)
+              handleNoArguments(X)
+            endMetadata(@, null, X)
+          endMetadataStar(1)
+          handleIdentifier(X, typeVariableDeclaration)
+          beginTypeVariable(X)
+            handleTypeVariablesDefined(X, 1)
+            handleNoType(X)
+          endTypeVariable(>, 0, null, null)
+        endTypeVariables(<, >)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(Function)
+        handleType(int, null)
+        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(abstract, metadataReference)
+              handleNoTypeArguments(int)
+              handleNoArguments(int)
+            endMetadata(@, null, int)
+          endMetadataStar(1)
+          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+            handleIdentifier(int, typeReference)
+            handleNoTypeArguments())
+            handleType(int, null)
+            handleNoName())
+            handleFormalParameterWithoutValue())
+          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+      endFunctionType(Function, null)
+    endFunctionTypeAlias(typedef, =, ;)
+  endTopLevelDeclaration(typedef)
+  beginMetadataStar(typedef)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(typedef)
+    beginFunctionTypeAlias(typedef)
+      handleIdentifier(F, typedefDeclaration)
+      beginTypeVariables(<)
+        beginMetadataStar(@)
+          beginMetadata(@)
+            handleIdentifier(foo, metadataReference)
+            handleIdentifier(abstract, metadataContinuation)
+            handleQualified(.)
+            handleNoTypeArguments(T)
+            handleNoArguments(T)
+          endMetadata(@, null, T)
+        endMetadataStar(1)
+        handleIdentifier(T, typeVariableDeclaration)
+        beginTypeVariable(T)
+          handleTypeVariablesDefined(T, 1)
+          handleNoType(T)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      beginFunctionType(int)
+        beginTypeVariables(<)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(foo, metadataReference)
+              handleIdentifier(abstract, metadataContinuation)
+              handleQualified(.)
+              handleNoTypeArguments(X)
+              handleNoArguments(X)
+            endMetadata(@, null, X)
+          endMetadataStar(1)
+          handleIdentifier(X, typeVariableDeclaration)
+          beginTypeVariable(X)
+            handleTypeVariablesDefined(X, 1)
+            handleNoType(X)
+          endTypeVariable(>, 0, null, null)
+        endTypeVariables(<, >)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(Function)
+        handleType(int, null)
+        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(foo, metadataReference)
+              handleIdentifier(abstract, metadataContinuation)
+              handleQualified(.)
+              handleNoTypeArguments(int)
+              handleNoArguments(int)
+            endMetadata(@, null, int)
+          endMetadataStar(1)
+          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+            handleIdentifier(int, typeReference)
+            handleNoTypeArguments())
+            handleType(int, null)
+            handleNoName())
+            handleFormalParameterWithoutValue())
+          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+      endFunctionType(Function, null)
+    endFunctionTypeAlias(typedef, =, ;)
+  endTopLevelDeclaration(typedef)
+  beginMetadataStar(typedef)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(typedef)
+    beginFunctionTypeAlias(typedef)
+      handleIdentifier(F, typedefDeclaration)
+      beginTypeVariables(<)
+        beginMetadataStar(@)
+          beginMetadata(@)
+            handleIdentifier(foo, metadataReference)
+            handleIdentifier(bar, metadataContinuation)
+            handleQualified(.)
+            handleNoTypeArguments(.)
+            handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+            handleNoArguments(T)
+          endMetadata(@, ., T)
+        endMetadataStar(1)
+        handleIdentifier(T, typeVariableDeclaration)
+        beginTypeVariable(T)
+          handleTypeVariablesDefined(T, 1)
+          handleNoType(T)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      beginFunctionType(int)
+        beginTypeVariables(<)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(foo, metadataReference)
+              handleIdentifier(bar, metadataContinuation)
+              handleQualified(.)
+              handleNoTypeArguments(.)
+              handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+              handleNoArguments(X)
+            endMetadata(@, ., X)
+          endMetadataStar(1)
+          handleIdentifier(X, typeVariableDeclaration)
+          beginTypeVariable(X)
+            handleTypeVariablesDefined(X, 1)
+            handleNoType(X)
+          endTypeVariable(>, 0, null, null)
+        endTypeVariables(<, >)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(Function)
+        handleType(int, null)
+        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(foo, metadataReference)
+              handleIdentifier(bar, metadataContinuation)
+              handleQualified(.)
+              handleNoTypeArguments(.)
+              handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+              handleNoArguments(int)
+            endMetadata(@, ., int)
+          endMetadataStar(1)
+          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+            handleIdentifier(int, typeReference)
+            handleNoTypeArguments())
+            handleType(int, null)
+            handleNoName())
+            handleFormalParameterWithoutValue())
+          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+      endFunctionType(Function, null)
+    endFunctionTypeAlias(typedef, =, ;)
+  endTopLevelDeclaration(typedef)
+  beginMetadataStar(typedef)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(typedef)
+    beginFunctionTypeAlias(typedef)
+      handleIdentifier(F, typedefDeclaration)
+      beginTypeVariables(<)
+        beginMetadataStar(@)
+          beginMetadata(@)
+            handleIdentifier(foo, metadataReference)
+            handleNoTypeArguments(()
+            beginArguments(()
+              beginLiteralString("hello")
+              endLiteralString(0, ))
+            endArguments(1, (, ))
+          endMetadata(@, null, T)
+        endMetadataStar(1)
+        handleIdentifier(T, typeVariableDeclaration)
+        beginTypeVariable(T)
+          handleTypeVariablesDefined(T, 1)
+          handleNoType(T)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      beginFunctionType(int)
+        beginTypeVariables(<)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(foo, metadataReference)
+              handleNoTypeArguments(()
+              beginArguments(()
+                beginLiteralString("hello")
+                endLiteralString(0, ))
+              endArguments(1, (, ))
+            endMetadata(@, null, X)
+          endMetadataStar(1)
+          handleIdentifier(X, typeVariableDeclaration)
+          beginTypeVariable(X)
+            handleTypeVariablesDefined(X, 1)
+            handleNoType(X)
+          endTypeVariable(>, 0, null, null)
+        endTypeVariables(<, >)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(Function)
+        handleType(int, null)
+        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(foo, metadataReference)
+              handleNoTypeArguments(()
+              beginArguments(()
+                beginLiteralString("hello")
+                endLiteralString(0, ))
+              endArguments(1, (, ))
+            endMetadata(@, null, int)
+          endMetadataStar(1)
+          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+            handleIdentifier(int, typeReference)
+            handleNoTypeArguments())
+            handleType(int, null)
+            handleNoName())
+            handleFormalParameterWithoutValue())
+          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+      endFunctionType(Function, null)
+    endFunctionTypeAlias(typedef, =, ;)
+  endTopLevelDeclaration(typedef)
+  beginMetadataStar(typedef)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(typedef)
+    beginFunctionTypeAlias(typedef)
+      handleIdentifier(F, typedefDeclaration)
+      beginTypeVariables(<)
+        beginMetadataStar(@)
+          beginMetadata(@)
+            handleIdentifier(foo, metadataReference)
+            handleIdentifier(abstract, metadataContinuation)
+            handleQualified(.)
+            handleNoTypeArguments(()
+            beginArguments(()
+              beginLiteralString("hello")
+              endLiteralString(0, ))
+            endArguments(1, (, ))
+          endMetadata(@, null, T)
+        endMetadataStar(1)
+        handleIdentifier(T, typeVariableDeclaration)
+        beginTypeVariable(T)
+          handleTypeVariablesDefined(T, 1)
+          handleNoType(T)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      beginFunctionType(int)
+        beginTypeVariables(<)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(foo, metadataReference)
+              handleIdentifier(abstract, metadataContinuation)
+              handleQualified(.)
+              handleNoTypeArguments(()
+              beginArguments(()
+                beginLiteralString("hello")
+                endLiteralString(0, ))
+              endArguments(1, (, ))
+            endMetadata(@, null, X)
+          endMetadataStar(1)
+          handleIdentifier(X, typeVariableDeclaration)
+          beginTypeVariable(X)
+            handleTypeVariablesDefined(X, 1)
+            handleNoType(X)
+          endTypeVariable(>, 0, null, null)
+        endTypeVariables(<, >)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(Function)
+        handleType(int, null)
+        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(foo, metadataReference)
+              handleIdentifier(abstract, metadataContinuation)
+              handleQualified(.)
+              handleNoTypeArguments(()
+              beginArguments(()
+                beginLiteralString("hello")
+                endLiteralString(0, ))
+              endArguments(1, (, ))
+            endMetadata(@, null, int)
+          endMetadataStar(1)
+          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+            handleIdentifier(int, typeReference)
+            handleNoTypeArguments())
+            handleType(int, null)
+            handleNoName())
+            handleFormalParameterWithoutValue())
+          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+      endFunctionType(Function, null)
+    endFunctionTypeAlias(typedef, =, ;)
+  endTopLevelDeclaration(typedef)
+  beginMetadataStar(typedef)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(typedef)
+    beginFunctionTypeAlias(typedef)
+      handleIdentifier(F, typedefDeclaration)
+      beginTypeVariables(<)
+        beginMetadataStar(@)
+          beginMetadata(@)
+            handleIdentifier(foo, metadataReference)
+            handleIdentifier(bar, metadataContinuation)
+            handleQualified(.)
+            handleNoTypeArguments(.)
+            handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+            beginArguments(()
+              beginLiteralString("hello")
+              endLiteralString(0, ))
+            endArguments(1, (, ))
+          endMetadata(@, ., T)
+        endMetadataStar(1)
+        handleIdentifier(T, typeVariableDeclaration)
+        beginTypeVariable(T)
+          handleTypeVariablesDefined(T, 1)
+          handleNoType(T)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      beginFunctionType(int)
+        beginTypeVariables(<)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(foo, metadataReference)
+              handleIdentifier(bar, metadataContinuation)
+              handleQualified(.)
+              handleNoTypeArguments(.)
+              handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+              beginArguments(()
+                beginLiteralString("hello")
+                endLiteralString(0, ))
+              endArguments(1, (, ))
+            endMetadata(@, ., X)
+          endMetadataStar(1)
+          handleIdentifier(X, typeVariableDeclaration)
+          beginTypeVariable(X)
+            handleTypeVariablesDefined(X, 1)
+            handleNoType(X)
+          endTypeVariable(>, 0, null, null)
+        endTypeVariables(<, >)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(Function)
+        handleType(int, null)
+        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(foo, metadataReference)
+              handleIdentifier(bar, metadataContinuation)
+              handleQualified(.)
+              handleNoTypeArguments(.)
+              handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+              beginArguments(()
+                beginLiteralString("hello")
+                endLiteralString(0, ))
+              endArguments(1, (, ))
+            endMetadata(@, ., int)
+          endMetadataStar(1)
+          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+            handleIdentifier(int, typeReference)
+            handleNoTypeArguments())
+            handleType(int, null)
+            handleNoName())
+            handleFormalParameterWithoutValue())
+          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+      endFunctionType(Function, null)
+    endFunctionTypeAlias(typedef, =, ;)
+  endTopLevelDeclaration(typedef)
+  beginMetadataStar(typedef)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(typedef)
+    beginFunctionTypeAlias(typedef)
+      handleIdentifier(F, typedefDeclaration)
+      beginTypeVariables(<)
+        beginMetadataStar(@)
+          beginMetadata(@)
+            handleIdentifier(foo, metadataReference)
+            beginTypeArguments(<)
+              handleIdentifier(int, typeReference)
+              handleNoTypeArguments(>)
+              handleType(int, null)
+            endTypeArguments(1, <, >)
+            beginArguments(()
+              beginLiteralString("hello")
+              endLiteralString(0, ))
+            endArguments(1, (, ))
+          endMetadata(@, null, T)
+        endMetadataStar(1)
+        handleIdentifier(T, typeVariableDeclaration)
+        beginTypeVariable(T)
+          handleTypeVariablesDefined(T, 1)
+          handleNoType(T)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      beginFunctionType(int)
+        beginTypeVariables(<)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(foo, metadataReference)
+              beginTypeArguments(<)
+                handleIdentifier(int, typeReference)
+                handleNoTypeArguments(>)
+                handleType(int, null)
+              endTypeArguments(1, <, >)
+              beginArguments(()
+                beginLiteralString("hello")
+                endLiteralString(0, ))
+              endArguments(1, (, ))
+            endMetadata(@, null, X)
+          endMetadataStar(1)
+          handleIdentifier(X, typeVariableDeclaration)
+          beginTypeVariable(X)
+            handleTypeVariablesDefined(X, 1)
+            handleNoType(X)
+          endTypeVariable(>, 0, null, null)
+        endTypeVariables(<, >)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(Function)
+        handleType(int, null)
+        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(foo, metadataReference)
+              beginTypeArguments(<)
+                handleIdentifier(int, typeReference)
+                handleNoTypeArguments(>)
+                handleType(int, null)
+              endTypeArguments(1, <, >)
+              beginArguments(()
+                beginLiteralString("hello")
+                endLiteralString(0, ))
+              endArguments(1, (, ))
+            endMetadata(@, null, int)
+          endMetadataStar(1)
+          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+            handleIdentifier(int, typeReference)
+            handleNoTypeArguments())
+            handleType(int, null)
+            handleNoName())
+            handleFormalParameterWithoutValue())
+          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+      endFunctionType(Function, null)
+    endFunctionTypeAlias(typedef, =, ;)
+  endTopLevelDeclaration(typedef)
+  beginMetadataStar(typedef)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(typedef)
+    beginFunctionTypeAlias(typedef)
+      handleIdentifier(F, typedefDeclaration)
+      beginTypeVariables(<)
+        beginMetadataStar(@)
+          beginMetadata(@)
+            handleIdentifier(foo, metadataReference)
+            beginTypeArguments(<)
+              handleIdentifier(int, typeReference)
+              handleNoTypeArguments(>)
+              handleType(int, null)
+            endTypeArguments(1, <, >)
+            handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+            beginArguments(()
+              beginLiteralString("hello")
+              endLiteralString(0, ))
+            endArguments(1, (, ))
+          endMetadata(@, ., T)
+        endMetadataStar(1)
+        handleIdentifier(T, typeVariableDeclaration)
+        beginTypeVariable(T)
+          handleTypeVariablesDefined(T, 1)
+          handleNoType(T)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      beginFunctionType(int)
+        beginTypeVariables(<)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(foo, metadataReference)
+              beginTypeArguments(<)
+                handleIdentifier(int, typeReference)
+                handleNoTypeArguments(>)
+                handleType(int, null)
+              endTypeArguments(1, <, >)
+              handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+              beginArguments(()
+                beginLiteralString("hello")
+                endLiteralString(0, ))
+              endArguments(1, (, ))
+            endMetadata(@, ., X)
+          endMetadataStar(1)
+          handleIdentifier(X, typeVariableDeclaration)
+          beginTypeVariable(X)
+            handleTypeVariablesDefined(X, 1)
+            handleNoType(X)
+          endTypeVariable(>, 0, null, null)
+        endTypeVariables(<, >)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(Function)
+        handleType(int, null)
+        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(foo, metadataReference)
+              beginTypeArguments(<)
+                handleIdentifier(int, typeReference)
+                handleNoTypeArguments(>)
+                handleType(int, null)
+              endTypeArguments(1, <, >)
+              handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+              beginArguments(()
+                beginLiteralString("hello")
+                endLiteralString(0, ))
+              endArguments(1, (, ))
+            endMetadata(@, ., int)
+          endMetadataStar(1)
+          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+            handleIdentifier(int, typeReference)
+            handleNoTypeArguments())
+            handleType(int, null)
+            handleNoName())
+            handleFormalParameterWithoutValue())
+          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+      endFunctionType(Function, null)
+    endFunctionTypeAlias(typedef, =, ;)
+  endTopLevelDeclaration(typedef)
+  beginMetadataStar(typedef)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(typedef)
+    beginFunctionTypeAlias(typedef)
+      handleIdentifier(F, typedefDeclaration)
+      beginTypeVariables(<)
+        beginMetadataStar(@)
+          beginMetadata(@)
+            handleIdentifier(foo, metadataReference)
+            handleIdentifier(bar, metadataContinuation)
+            handleQualified(.)
+            beginTypeArguments(<)
+              handleIdentifier(int, typeReference)
+              handleNoTypeArguments(>)
+              handleType(int, null)
+            endTypeArguments(1, <, >)
+            beginArguments(()
+              beginLiteralString("hello")
+              endLiteralString(0, ))
+            endArguments(1, (, ))
+          endMetadata(@, null, T)
+        endMetadataStar(1)
+        handleIdentifier(T, typeVariableDeclaration)
+        beginTypeVariable(T)
+          handleTypeVariablesDefined(T, 1)
+          handleNoType(T)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      beginFunctionType(int)
+        beginTypeVariables(<)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(foo, metadataReference)
+              handleIdentifier(bar, metadataContinuation)
+              handleQualified(.)
+              beginTypeArguments(<)
+                handleIdentifier(int, typeReference)
+                handleNoTypeArguments(>)
+                handleType(int, null)
+              endTypeArguments(1, <, >)
+              beginArguments(()
+                beginLiteralString("hello")
+                endLiteralString(0, ))
+              endArguments(1, (, ))
+            endMetadata(@, null, X)
+          endMetadataStar(1)
+          handleIdentifier(X, typeVariableDeclaration)
+          beginTypeVariable(X)
+            handleTypeVariablesDefined(X, 1)
+            handleNoType(X)
+          endTypeVariable(>, 0, null, null)
+        endTypeVariables(<, >)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(Function)
+        handleType(int, null)
+        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(foo, metadataReference)
+              handleIdentifier(bar, metadataContinuation)
+              handleQualified(.)
+              beginTypeArguments(<)
+                handleIdentifier(int, typeReference)
+                handleNoTypeArguments(>)
+                handleType(int, null)
+              endTypeArguments(1, <, >)
+              beginArguments(()
+                beginLiteralString("hello")
+                endLiteralString(0, ))
+              endArguments(1, (, ))
+            endMetadata(@, null, int)
+          endMetadataStar(1)
+          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+            handleIdentifier(int, typeReference)
+            handleNoTypeArguments())
+            handleType(int, null)
+            handleNoName())
+            handleFormalParameterWithoutValue())
+          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+      endFunctionType(Function, null)
+    endFunctionTypeAlias(typedef, =, ;)
+  endTopLevelDeclaration(typedef)
+  beginMetadataStar(typedef)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(typedef)
+    beginFunctionTypeAlias(typedef)
+      handleIdentifier(F, typedefDeclaration)
+      beginTypeVariables(<)
+        beginMetadataStar(@)
+          beginMetadata(@)
+            handleIdentifier(foo, metadataReference)
+            handleIdentifier(bar, metadataContinuation)
+            handleQualified(.)
+            beginTypeArguments(<)
+              handleIdentifier(int, typeReference)
+              handleNoTypeArguments(>)
+              handleType(int, null)
+            endTypeArguments(1, <, >)
+            handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+            beginArguments(()
+              beginLiteralString("hello")
+              endLiteralString(0, ))
+            endArguments(1, (, ))
+          endMetadata(@, ., T)
+        endMetadataStar(1)
+        handleIdentifier(T, typeVariableDeclaration)
+        beginTypeVariable(T)
+          handleTypeVariablesDefined(T, 1)
+          handleNoType(T)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      beginFunctionType(int)
+        beginTypeVariables(<)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(foo, metadataReference)
+              handleIdentifier(bar, metadataContinuation)
+              handleQualified(.)
+              beginTypeArguments(<)
+                handleIdentifier(int, typeReference)
+                handleNoTypeArguments(>)
+                handleType(int, null)
+              endTypeArguments(1, <, >)
+              handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+              beginArguments(()
+                beginLiteralString("hello")
+                endLiteralString(0, ))
+              endArguments(1, (, ))
+            endMetadata(@, ., X)
+          endMetadataStar(1)
+          handleIdentifier(X, typeVariableDeclaration)
+          beginTypeVariable(X)
+            handleTypeVariablesDefined(X, 1)
+            handleNoType(X)
+          endTypeVariable(>, 0, null, null)
+        endTypeVariables(<, >)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(Function)
+        handleType(int, null)
+        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+          beginMetadataStar(@)
+            beginMetadata(@)
+              handleIdentifier(foo, metadataReference)
+              handleIdentifier(bar, metadataContinuation)
+              handleQualified(.)
+              beginTypeArguments(<)
+                handleIdentifier(int, typeReference)
+                handleNoTypeArguments(>)
+                handleType(int, null)
+              endTypeArguments(1, <, >)
+              handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+              beginArguments(()
+                beginLiteralString("hello")
+                endLiteralString(0, ))
+              endArguments(1, (, ))
+            endMetadata(@, ., int)
+          endMetadataStar(1)
+          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+            handleIdentifier(int, typeReference)
+            handleNoTypeArguments())
+            handleType(int, null)
+            handleNoName())
+            handleFormalParameterWithoutValue())
+          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+      endFunctionType(Function, null)
+    endFunctionTypeAlias(typedef, =, ;)
+  endTopLevelDeclaration(@)
+  beginMetadataStar(@)
+    beginMetadata(@)
+      handleIdentifier(abstract, metadataReference)
+      handleIdentifier(abstract, metadataContinuation)
+      handleQualified(.)
+      handleNoTypeArguments(@)
+      handleNoArguments(@)
+    endMetadata(@, null, @)
+    beginMetadata(@)
+      handleIdentifier(abstract, metadataReference)
+      handleIdentifier(bar, metadataContinuation)
+      handleQualified(.)
+      handleNoTypeArguments(.)
+      handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+      handleNoArguments(@)
+    endMetadata(@, ., @)
+    beginMetadata(@)
+      handleIdentifier(abstract, metadataReference)
+      handleNoTypeArguments(()
+      beginArguments(()
+        beginLiteralString("hello")
+        endLiteralString(0, ))
+      endArguments(1, (, ))
+    endMetadata(@, null, @)
+    beginMetadata(@)
+      handleIdentifier(abstract, metadataReference)
+      handleIdentifier(abstract, metadataContinuation)
+      handleQualified(.)
+      handleNoTypeArguments(()
+      beginArguments(()
+        beginLiteralString("hello")
+        endLiteralString(0, ))
+      endArguments(1, (, ))
+    endMetadata(@, null, @)
+    beginMetadata(@)
+      handleIdentifier(abstract, metadataReference)
+      handleIdentifier(bar, metadataContinuation)
+      handleQualified(.)
+      handleNoTypeArguments(.)
+      handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+      beginArguments(()
+        beginLiteralString("hello")
+        endLiteralString(0, ))
+      endArguments(1, (, ))
+    endMetadata(@, ., @)
+    beginMetadata(@)
+      handleIdentifier(abstract, metadataReference)
+      beginTypeArguments(<)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(>)
+        handleType(int, null)
+      endTypeArguments(1, <, >)
+      beginArguments(()
+        beginLiteralString("hello")
+        endLiteralString(0, ))
+      endArguments(1, (, ))
+    endMetadata(@, null, @)
+    beginMetadata(@)
+      handleIdentifier(abstract, metadataReference)
+      beginTypeArguments(<)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(>)
+        handleType(int, null)
+      endTypeArguments(1, <, >)
+      handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+      beginArguments(()
+        beginLiteralString("hello")
+        endLiteralString(0, ))
+      endArguments(1, (, ))
+    endMetadata(@, ., @)
+    beginMetadata(@)
+      handleIdentifier(abstract, metadataReference)
+      handleIdentifier(bar, metadataContinuation)
+      handleQualified(.)
+      beginTypeArguments(<)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(>)
+        handleType(int, null)
+      endTypeArguments(1, <, >)
+      beginArguments(()
+        beginLiteralString("hello")
+        endLiteralString(0, ))
+      endArguments(1, (, ))
+    endMetadata(@, null, @)
+    beginMetadata(@)
+      handleIdentifier(abstract, metadataReference)
+      handleIdentifier(bar, metadataContinuation)
+      handleQualified(.)
+      beginTypeArguments(<)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(>)
+        handleType(int, null)
+      endTypeArguments(1, <, >)
+      handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+      beginArguments(()
+        beginLiteralString("hello")
+        endLiteralString(0, ))
+      endArguments(1, (, ))
+    endMetadata(@, ., class)
+  endMetadataStar(9)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(Y, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, Y)
+      handleNoType(Y)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration()
+endCompilationUnit(12, )
diff --git a/pkg/front_end/parser_testcases/general/metadata.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/metadata.dart.intertwined.expect
new file mode 100644
index 0000000..9a0530c
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/metadata.dart.intertwined.expect
@@ -0,0 +1,1741 @@
+parseUnit(@)
+  skipErrorTokens(@)
+  listener: beginCompilationUnit(@)
+  syntheticPreviousToken(@)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(@)
+      parseMetadata()
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          inPlainSync()
+          listener: handleIdentifier(abstract, metadataReference)
+        parseQualifiedRestOpt(abstract, metadataContinuation)
+        listener: handleNoTypeArguments(@)
+        parseArgumentsOpt(abstract)
+          listener: handleNoArguments(@)
+        listener: endMetadata(@, null, @)
+      parseMetadata(abstract)
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          listener: handleIdentifier(foo, metadataReference)
+        parseQualifiedRestOpt(foo, metadataContinuation)
+          parseQualifiedRest(foo, metadataContinuation)
+            ensureIdentifier(., metadataContinuation)
+              inPlainSync()
+              listener: handleIdentifier(abstract, metadataContinuation)
+            listener: handleQualified(.)
+        listener: handleNoTypeArguments(@)
+        parseArgumentsOpt(abstract)
+          listener: handleNoArguments(@)
+        listener: endMetadata(@, null, @)
+      parseMetadata(abstract)
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          listener: handleIdentifier(foo, metadataReference)
+        parseQualifiedRestOpt(foo, metadataContinuation)
+          parseQualifiedRest(foo, metadataContinuation)
+            ensureIdentifier(., metadataContinuation)
+              listener: handleIdentifier(bar, metadataContinuation)
+            listener: handleQualified(.)
+        listener: handleNoTypeArguments(.)
+        ensureIdentifier(., metadataContinuationAfterTypeArguments)
+          inPlainSync()
+          listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+        parseArgumentsOpt(abstract)
+          listener: handleNoArguments(@)
+        listener: endMetadata(@, ., @)
+      parseMetadata(abstract)
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          listener: handleIdentifier(foo, metadataReference)
+        parseQualifiedRestOpt(foo, metadataContinuation)
+        listener: handleNoTypeArguments(()
+        parseArgumentsOpt(foo)
+          parseArguments(foo)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              parseExpression(()
+                parsePrecedenceExpression((, 1, true)
+                  parseUnaryExpression((, true)
+                    parsePrimary((, expression)
+                      parseLiteralString(()
+                        parseSingleLiteralString(()
+                          listener: beginLiteralString("hello")
+                          listener: endLiteralString(0, ))
+              listener: endArguments(1, (, ))
+        listener: endMetadata(@, null, @)
+      parseMetadata())
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          listener: handleIdentifier(foo, metadataReference)
+        parseQualifiedRestOpt(foo, metadataContinuation)
+          parseQualifiedRest(foo, metadataContinuation)
+            ensureIdentifier(., metadataContinuation)
+              inPlainSync()
+              listener: handleIdentifier(abstract, metadataContinuation)
+            listener: handleQualified(.)
+        listener: handleNoTypeArguments(()
+        parseArgumentsOpt(abstract)
+          parseArguments(abstract)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              parseExpression(()
+                parsePrecedenceExpression((, 1, true)
+                  parseUnaryExpression((, true)
+                    parsePrimary((, expression)
+                      parseLiteralString(()
+                        parseSingleLiteralString(()
+                          listener: beginLiteralString("hello")
+                          listener: endLiteralString(0, ))
+              listener: endArguments(1, (, ))
+        listener: endMetadata(@, null, @)
+      parseMetadata())
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          listener: handleIdentifier(foo, metadataReference)
+        parseQualifiedRestOpt(foo, metadataContinuation)
+          parseQualifiedRest(foo, metadataContinuation)
+            ensureIdentifier(., metadataContinuation)
+              listener: handleIdentifier(bar, metadataContinuation)
+            listener: handleQualified(.)
+        listener: handleNoTypeArguments(.)
+        ensureIdentifier(., metadataContinuationAfterTypeArguments)
+          inPlainSync()
+          listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+        parseArgumentsOpt(abstract)
+          parseArguments(abstract)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              parseExpression(()
+                parsePrecedenceExpression((, 1, true)
+                  parseUnaryExpression((, true)
+                    parsePrimary((, expression)
+                      parseLiteralString(()
+                        parseSingleLiteralString(()
+                          listener: beginLiteralString("hello")
+                          listener: endLiteralString(0, ))
+              listener: endArguments(1, (, ))
+        listener: endMetadata(@, ., @)
+      parseMetadata())
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          listener: handleIdentifier(foo, metadataReference)
+        parseQualifiedRestOpt(foo, metadataContinuation)
+        listener: beginTypeArguments(<)
+        listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(int, null)
+        listener: endTypeArguments(1, <, >)
+        parseArgumentsOpt(>)
+          parseArguments(>)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              parseExpression(()
+                parsePrecedenceExpression((, 1, true)
+                  parseUnaryExpression((, true)
+                    parsePrimary((, expression)
+                      parseLiteralString(()
+                        parseSingleLiteralString(()
+                          listener: beginLiteralString("hello")
+                          listener: endLiteralString(0, ))
+              listener: endArguments(1, (, ))
+        listener: endMetadata(@, null, @)
+      parseMetadata())
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          listener: handleIdentifier(foo, metadataReference)
+        parseQualifiedRestOpt(foo, metadataContinuation)
+        listener: beginTypeArguments(<)
+        listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(int, null)
+        listener: endTypeArguments(1, <, >)
+        ensureIdentifier(., metadataContinuationAfterTypeArguments)
+          inPlainSync()
+          listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+        parseArgumentsOpt(abstract)
+          parseArguments(abstract)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              parseExpression(()
+                parsePrecedenceExpression((, 1, true)
+                  parseUnaryExpression((, true)
+                    parsePrimary((, expression)
+                      parseLiteralString(()
+                        parseSingleLiteralString(()
+                          listener: beginLiteralString("hello")
+                          listener: endLiteralString(0, ))
+              listener: endArguments(1, (, ))
+        listener: endMetadata(@, ., @)
+      parseMetadata())
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          listener: handleIdentifier(foo, metadataReference)
+        parseQualifiedRestOpt(foo, metadataContinuation)
+          parseQualifiedRest(foo, metadataContinuation)
+            ensureIdentifier(., metadataContinuation)
+              listener: handleIdentifier(bar, metadataContinuation)
+            listener: handleQualified(.)
+        listener: beginTypeArguments(<)
+        listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(int, null)
+        listener: endTypeArguments(1, <, >)
+        parseArgumentsOpt(>)
+          parseArguments(>)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              parseExpression(()
+                parsePrecedenceExpression((, 1, true)
+                  parseUnaryExpression((, true)
+                    parsePrimary((, expression)
+                      parseLiteralString(()
+                        parseSingleLiteralString(()
+                          listener: beginLiteralString("hello")
+                          listener: endLiteralString(0, ))
+              listener: endArguments(1, (, ))
+        listener: endMetadata(@, null, @)
+      parseMetadata())
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          listener: handleIdentifier(foo, metadataReference)
+        parseQualifiedRestOpt(foo, metadataContinuation)
+          parseQualifiedRest(foo, metadataContinuation)
+            ensureIdentifier(., metadataContinuation)
+              listener: handleIdentifier(bar, metadataContinuation)
+            listener: handleQualified(.)
+        listener: beginTypeArguments(<)
+        listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(int, null)
+        listener: endTypeArguments(1, <, >)
+        ensureIdentifier(., metadataContinuationAfterTypeArguments)
+          inPlainSync()
+          listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+        parseArgumentsOpt(abstract)
+          parseArguments(abstract)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              parseExpression(()
+                parsePrecedenceExpression((, 1, true)
+                  parseUnaryExpression((, true)
+                    parsePrimary((, expression)
+                      parseLiteralString(()
+                        parseSingleLiteralString(()
+                          listener: beginLiteralString("hello")
+                          listener: endLiteralString(0, ))
+              listener: endArguments(1, (, ))
+        listener: endMetadata(@, ., class)
+      listener: endMetadataStar(10)
+    parseTopLevelKeywordDeclaration(), class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(), class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(X, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, X)
+        parseClass(X, class, class, X)
+          parseClassHeaderOpt(X, class, class)
+            parseClassExtendsOpt(X)
+              listener: handleNoType(X)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(X)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(X)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(}, typedef)
+      parseTypedef(typedef)
+        listener: beginUncategorizedTopLevelDeclaration(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(F, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              inPlainSync()
+              listener: handleIdentifier(abstract, metadataReference)
+            parseQualifiedRestOpt(abstract, metadataContinuation)
+            listener: handleNoTypeArguments(T)
+            parseArgumentsOpt(abstract)
+              listener: handleNoArguments(T)
+            listener: endMetadata(@, null, T)
+          listener: endMetadataStar(1)
+        ensureIdentifier(abstract, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(T, 1)
+        listener: handleNoType(T)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(int)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              inPlainSync()
+              listener: handleIdentifier(abstract, metadataReference)
+            parseQualifiedRestOpt(abstract, metadataContinuation)
+            listener: handleNoTypeArguments(X)
+            parseArgumentsOpt(abstract)
+              listener: handleNoArguments(X)
+            listener: endMetadata(@, null, X)
+          listener: endMetadataStar(1)
+        ensureIdentifier(abstract, typeVariableDeclaration)
+          listener: handleIdentifier(X, typeVariableDeclaration)
+        listener: beginTypeVariable(X)
+        listener: handleTypeVariablesDefined(X, 1)
+        listener: handleNoType(X)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        ensureIdentifier(=, typeReference)
+          listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(Function)
+        listener: handleType(int, null)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              parseMetadataStar(()
+                listener: beginMetadataStar(@)
+                parseMetadata(()
+                  listener: beginMetadata(@)
+                  ensureIdentifier(@, metadataReference)
+                    inPlainSync()
+                    listener: handleIdentifier(abstract, metadataReference)
+                  parseQualifiedRestOpt(abstract, metadataContinuation)
+                  listener: handleNoTypeArguments(int)
+                  parseArgumentsOpt(abstract)
+                    listener: handleNoArguments(int)
+                  listener: endMetadata(@, null, int)
+                listener: endMetadataStar(1)
+              listener: beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+              listener: handleIdentifier(int, typeReference)
+              listener: handleNoTypeArguments())
+              listener: handleType(int, null)
+              listener: handleNoName())
+              listener: handleFormalParameterWithoutValue())
+              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginUncategorizedTopLevelDeclaration(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(F, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(foo, metadataReference)
+            parseQualifiedRestOpt(foo, metadataContinuation)
+              parseQualifiedRest(foo, metadataContinuation)
+                ensureIdentifier(., metadataContinuation)
+                  inPlainSync()
+                  listener: handleIdentifier(abstract, metadataContinuation)
+                listener: handleQualified(.)
+            listener: handleNoTypeArguments(T)
+            parseArgumentsOpt(abstract)
+              listener: handleNoArguments(T)
+            listener: endMetadata(@, null, T)
+          listener: endMetadataStar(1)
+        ensureIdentifier(abstract, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(T, 1)
+        listener: handleNoType(T)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(int)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(foo, metadataReference)
+            parseQualifiedRestOpt(foo, metadataContinuation)
+              parseQualifiedRest(foo, metadataContinuation)
+                ensureIdentifier(., metadataContinuation)
+                  inPlainSync()
+                  listener: handleIdentifier(abstract, metadataContinuation)
+                listener: handleQualified(.)
+            listener: handleNoTypeArguments(X)
+            parseArgumentsOpt(abstract)
+              listener: handleNoArguments(X)
+            listener: endMetadata(@, null, X)
+          listener: endMetadataStar(1)
+        ensureIdentifier(abstract, typeVariableDeclaration)
+          listener: handleIdentifier(X, typeVariableDeclaration)
+        listener: beginTypeVariable(X)
+        listener: handleTypeVariablesDefined(X, 1)
+        listener: handleNoType(X)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        ensureIdentifier(=, typeReference)
+          listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(Function)
+        listener: handleType(int, null)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              parseMetadataStar(()
+                listener: beginMetadataStar(@)
+                parseMetadata(()
+                  listener: beginMetadata(@)
+                  ensureIdentifier(@, metadataReference)
+                    listener: handleIdentifier(foo, metadataReference)
+                  parseQualifiedRestOpt(foo, metadataContinuation)
+                    parseQualifiedRest(foo, metadataContinuation)
+                      ensureIdentifier(., metadataContinuation)
+                        inPlainSync()
+                        listener: handleIdentifier(abstract, metadataContinuation)
+                      listener: handleQualified(.)
+                  listener: handleNoTypeArguments(int)
+                  parseArgumentsOpt(abstract)
+                    listener: handleNoArguments(int)
+                  listener: endMetadata(@, null, int)
+                listener: endMetadataStar(1)
+              listener: beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+              listener: handleIdentifier(int, typeReference)
+              listener: handleNoTypeArguments())
+              listener: handleType(int, null)
+              listener: handleNoName())
+              listener: handleFormalParameterWithoutValue())
+              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginUncategorizedTopLevelDeclaration(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(F, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(foo, metadataReference)
+            parseQualifiedRestOpt(foo, metadataContinuation)
+              parseQualifiedRest(foo, metadataContinuation)
+                ensureIdentifier(., metadataContinuation)
+                  listener: handleIdentifier(bar, metadataContinuation)
+                listener: handleQualified(.)
+            listener: handleNoTypeArguments(.)
+            ensureIdentifier(., metadataContinuationAfterTypeArguments)
+              inPlainSync()
+              listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+            parseArgumentsOpt(abstract)
+              listener: handleNoArguments(T)
+            listener: endMetadata(@, ., T)
+          listener: endMetadataStar(1)
+        ensureIdentifier(abstract, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(T, 1)
+        listener: handleNoType(T)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(int)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(foo, metadataReference)
+            parseQualifiedRestOpt(foo, metadataContinuation)
+              parseQualifiedRest(foo, metadataContinuation)
+                ensureIdentifier(., metadataContinuation)
+                  listener: handleIdentifier(bar, metadataContinuation)
+                listener: handleQualified(.)
+            listener: handleNoTypeArguments(.)
+            ensureIdentifier(., metadataContinuationAfterTypeArguments)
+              inPlainSync()
+              listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+            parseArgumentsOpt(abstract)
+              listener: handleNoArguments(X)
+            listener: endMetadata(@, ., X)
+          listener: endMetadataStar(1)
+        ensureIdentifier(abstract, typeVariableDeclaration)
+          listener: handleIdentifier(X, typeVariableDeclaration)
+        listener: beginTypeVariable(X)
+        listener: handleTypeVariablesDefined(X, 1)
+        listener: handleNoType(X)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        ensureIdentifier(=, typeReference)
+          listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(Function)
+        listener: handleType(int, null)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              parseMetadataStar(()
+                listener: beginMetadataStar(@)
+                parseMetadata(()
+                  listener: beginMetadata(@)
+                  ensureIdentifier(@, metadataReference)
+                    listener: handleIdentifier(foo, metadataReference)
+                  parseQualifiedRestOpt(foo, metadataContinuation)
+                    parseQualifiedRest(foo, metadataContinuation)
+                      ensureIdentifier(., metadataContinuation)
+                        listener: handleIdentifier(bar, metadataContinuation)
+                      listener: handleQualified(.)
+                  listener: handleNoTypeArguments(.)
+                  ensureIdentifier(., metadataContinuationAfterTypeArguments)
+                    inPlainSync()
+                    listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+                  parseArgumentsOpt(abstract)
+                    listener: handleNoArguments(int)
+                  listener: endMetadata(@, ., int)
+                listener: endMetadataStar(1)
+              listener: beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+              listener: handleIdentifier(int, typeReference)
+              listener: handleNoTypeArguments())
+              listener: handleType(int, null)
+              listener: handleNoName())
+              listener: handleFormalParameterWithoutValue())
+              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginUncategorizedTopLevelDeclaration(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(F, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(foo, metadataReference)
+            parseQualifiedRestOpt(foo, metadataContinuation)
+            listener: handleNoTypeArguments(()
+            parseArgumentsOpt(foo)
+              parseArguments(foo)
+                parseArgumentsRest(()
+                  listener: beginArguments(()
+                  parseExpression(()
+                    parsePrecedenceExpression((, 1, true)
+                      parseUnaryExpression((, true)
+                        parsePrimary((, expression)
+                          parseLiteralString(()
+                            parseSingleLiteralString(()
+                              listener: beginLiteralString("hello")
+                              listener: endLiteralString(0, ))
+                  listener: endArguments(1, (, ))
+            listener: endMetadata(@, null, T)
+          listener: endMetadataStar(1)
+        ensureIdentifier(), typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(T, 1)
+        listener: handleNoType(T)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(int)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(foo, metadataReference)
+            parseQualifiedRestOpt(foo, metadataContinuation)
+            listener: handleNoTypeArguments(()
+            parseArgumentsOpt(foo)
+              parseArguments(foo)
+                parseArgumentsRest(()
+                  listener: beginArguments(()
+                  parseExpression(()
+                    parsePrecedenceExpression((, 1, true)
+                      parseUnaryExpression((, true)
+                        parsePrimary((, expression)
+                          parseLiteralString(()
+                            parseSingleLiteralString(()
+                              listener: beginLiteralString("hello")
+                              listener: endLiteralString(0, ))
+                  listener: endArguments(1, (, ))
+            listener: endMetadata(@, null, X)
+          listener: endMetadataStar(1)
+        ensureIdentifier(), typeVariableDeclaration)
+          listener: handleIdentifier(X, typeVariableDeclaration)
+        listener: beginTypeVariable(X)
+        listener: handleTypeVariablesDefined(X, 1)
+        listener: handleNoType(X)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        ensureIdentifier(=, typeReference)
+          listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(Function)
+        listener: handleType(int, null)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              parseMetadataStar(()
+                listener: beginMetadataStar(@)
+                parseMetadata(()
+                  listener: beginMetadata(@)
+                  ensureIdentifier(@, metadataReference)
+                    listener: handleIdentifier(foo, metadataReference)
+                  parseQualifiedRestOpt(foo, metadataContinuation)
+                  listener: handleNoTypeArguments(()
+                  parseArgumentsOpt(foo)
+                    parseArguments(foo)
+                      parseArgumentsRest(()
+                        listener: beginArguments(()
+                        parseExpression(()
+                          parsePrecedenceExpression((, 1, true)
+                            parseUnaryExpression((, true)
+                              parsePrimary((, expression)
+                                parseLiteralString(()
+                                  parseSingleLiteralString(()
+                                    listener: beginLiteralString("hello")
+                                    listener: endLiteralString(0, ))
+                        listener: endArguments(1, (, ))
+                  listener: endMetadata(@, null, int)
+                listener: endMetadataStar(1)
+              listener: beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+              listener: handleIdentifier(int, typeReference)
+              listener: handleNoTypeArguments())
+              listener: handleType(int, null)
+              listener: handleNoName())
+              listener: handleFormalParameterWithoutValue())
+              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginUncategorizedTopLevelDeclaration(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(F, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(foo, metadataReference)
+            parseQualifiedRestOpt(foo, metadataContinuation)
+              parseQualifiedRest(foo, metadataContinuation)
+                ensureIdentifier(., metadataContinuation)
+                  inPlainSync()
+                  listener: handleIdentifier(abstract, metadataContinuation)
+                listener: handleQualified(.)
+            listener: handleNoTypeArguments(()
+            parseArgumentsOpt(abstract)
+              parseArguments(abstract)
+                parseArgumentsRest(()
+                  listener: beginArguments(()
+                  parseExpression(()
+                    parsePrecedenceExpression((, 1, true)
+                      parseUnaryExpression((, true)
+                        parsePrimary((, expression)
+                          parseLiteralString(()
+                            parseSingleLiteralString(()
+                              listener: beginLiteralString("hello")
+                              listener: endLiteralString(0, ))
+                  listener: endArguments(1, (, ))
+            listener: endMetadata(@, null, T)
+          listener: endMetadataStar(1)
+        ensureIdentifier(), typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(T, 1)
+        listener: handleNoType(T)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(int)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(foo, metadataReference)
+            parseQualifiedRestOpt(foo, metadataContinuation)
+              parseQualifiedRest(foo, metadataContinuation)
+                ensureIdentifier(., metadataContinuation)
+                  inPlainSync()
+                  listener: handleIdentifier(abstract, metadataContinuation)
+                listener: handleQualified(.)
+            listener: handleNoTypeArguments(()
+            parseArgumentsOpt(abstract)
+              parseArguments(abstract)
+                parseArgumentsRest(()
+                  listener: beginArguments(()
+                  parseExpression(()
+                    parsePrecedenceExpression((, 1, true)
+                      parseUnaryExpression((, true)
+                        parsePrimary((, expression)
+                          parseLiteralString(()
+                            parseSingleLiteralString(()
+                              listener: beginLiteralString("hello")
+                              listener: endLiteralString(0, ))
+                  listener: endArguments(1, (, ))
+            listener: endMetadata(@, null, X)
+          listener: endMetadataStar(1)
+        ensureIdentifier(), typeVariableDeclaration)
+          listener: handleIdentifier(X, typeVariableDeclaration)
+        listener: beginTypeVariable(X)
+        listener: handleTypeVariablesDefined(X, 1)
+        listener: handleNoType(X)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        ensureIdentifier(=, typeReference)
+          listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(Function)
+        listener: handleType(int, null)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              parseMetadataStar(()
+                listener: beginMetadataStar(@)
+                parseMetadata(()
+                  listener: beginMetadata(@)
+                  ensureIdentifier(@, metadataReference)
+                    listener: handleIdentifier(foo, metadataReference)
+                  parseQualifiedRestOpt(foo, metadataContinuation)
+                    parseQualifiedRest(foo, metadataContinuation)
+                      ensureIdentifier(., metadataContinuation)
+                        inPlainSync()
+                        listener: handleIdentifier(abstract, metadataContinuation)
+                      listener: handleQualified(.)
+                  listener: handleNoTypeArguments(()
+                  parseArgumentsOpt(abstract)
+                    parseArguments(abstract)
+                      parseArgumentsRest(()
+                        listener: beginArguments(()
+                        parseExpression(()
+                          parsePrecedenceExpression((, 1, true)
+                            parseUnaryExpression((, true)
+                              parsePrimary((, expression)
+                                parseLiteralString(()
+                                  parseSingleLiteralString(()
+                                    listener: beginLiteralString("hello")
+                                    listener: endLiteralString(0, ))
+                        listener: endArguments(1, (, ))
+                  listener: endMetadata(@, null, int)
+                listener: endMetadataStar(1)
+              listener: beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+              listener: handleIdentifier(int, typeReference)
+              listener: handleNoTypeArguments())
+              listener: handleType(int, null)
+              listener: handleNoName())
+              listener: handleFormalParameterWithoutValue())
+              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginUncategorizedTopLevelDeclaration(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(F, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(foo, metadataReference)
+            parseQualifiedRestOpt(foo, metadataContinuation)
+              parseQualifiedRest(foo, metadataContinuation)
+                ensureIdentifier(., metadataContinuation)
+                  listener: handleIdentifier(bar, metadataContinuation)
+                listener: handleQualified(.)
+            listener: handleNoTypeArguments(.)
+            ensureIdentifier(., metadataContinuationAfterTypeArguments)
+              inPlainSync()
+              listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+            parseArgumentsOpt(abstract)
+              parseArguments(abstract)
+                parseArgumentsRest(()
+                  listener: beginArguments(()
+                  parseExpression(()
+                    parsePrecedenceExpression((, 1, true)
+                      parseUnaryExpression((, true)
+                        parsePrimary((, expression)
+                          parseLiteralString(()
+                            parseSingleLiteralString(()
+                              listener: beginLiteralString("hello")
+                              listener: endLiteralString(0, ))
+                  listener: endArguments(1, (, ))
+            listener: endMetadata(@, ., T)
+          listener: endMetadataStar(1)
+        ensureIdentifier(), typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(T, 1)
+        listener: handleNoType(T)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(int)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(foo, metadataReference)
+            parseQualifiedRestOpt(foo, metadataContinuation)
+              parseQualifiedRest(foo, metadataContinuation)
+                ensureIdentifier(., metadataContinuation)
+                  listener: handleIdentifier(bar, metadataContinuation)
+                listener: handleQualified(.)
+            listener: handleNoTypeArguments(.)
+            ensureIdentifier(., metadataContinuationAfterTypeArguments)
+              inPlainSync()
+              listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+            parseArgumentsOpt(abstract)
+              parseArguments(abstract)
+                parseArgumentsRest(()
+                  listener: beginArguments(()
+                  parseExpression(()
+                    parsePrecedenceExpression((, 1, true)
+                      parseUnaryExpression((, true)
+                        parsePrimary((, expression)
+                          parseLiteralString(()
+                            parseSingleLiteralString(()
+                              listener: beginLiteralString("hello")
+                              listener: endLiteralString(0, ))
+                  listener: endArguments(1, (, ))
+            listener: endMetadata(@, ., X)
+          listener: endMetadataStar(1)
+        ensureIdentifier(), typeVariableDeclaration)
+          listener: handleIdentifier(X, typeVariableDeclaration)
+        listener: beginTypeVariable(X)
+        listener: handleTypeVariablesDefined(X, 1)
+        listener: handleNoType(X)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        ensureIdentifier(=, typeReference)
+          listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(Function)
+        listener: handleType(int, null)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              parseMetadataStar(()
+                listener: beginMetadataStar(@)
+                parseMetadata(()
+                  listener: beginMetadata(@)
+                  ensureIdentifier(@, metadataReference)
+                    listener: handleIdentifier(foo, metadataReference)
+                  parseQualifiedRestOpt(foo, metadataContinuation)
+                    parseQualifiedRest(foo, metadataContinuation)
+                      ensureIdentifier(., metadataContinuation)
+                        listener: handleIdentifier(bar, metadataContinuation)
+                      listener: handleQualified(.)
+                  listener: handleNoTypeArguments(.)
+                  ensureIdentifier(., metadataContinuationAfterTypeArguments)
+                    inPlainSync()
+                    listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+                  parseArgumentsOpt(abstract)
+                    parseArguments(abstract)
+                      parseArgumentsRest(()
+                        listener: beginArguments(()
+                        parseExpression(()
+                          parsePrecedenceExpression((, 1, true)
+                            parseUnaryExpression((, true)
+                              parsePrimary((, expression)
+                                parseLiteralString(()
+                                  parseSingleLiteralString(()
+                                    listener: beginLiteralString("hello")
+                                    listener: endLiteralString(0, ))
+                        listener: endArguments(1, (, ))
+                  listener: endMetadata(@, ., int)
+                listener: endMetadataStar(1)
+              listener: beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+              listener: handleIdentifier(int, typeReference)
+              listener: handleNoTypeArguments())
+              listener: handleType(int, null)
+              listener: handleNoName())
+              listener: handleFormalParameterWithoutValue())
+              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginUncategorizedTopLevelDeclaration(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(F, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(foo, metadataReference)
+            parseQualifiedRestOpt(foo, metadataContinuation)
+            listener: beginTypeArguments(<)
+            listener: handleIdentifier(int, typeReference)
+            listener: handleNoTypeArguments(>)
+            listener: handleType(int, null)
+            listener: endTypeArguments(1, <, >)
+            parseArgumentsOpt(>)
+              parseArguments(>)
+                parseArgumentsRest(()
+                  listener: beginArguments(()
+                  parseExpression(()
+                    parsePrecedenceExpression((, 1, true)
+                      parseUnaryExpression((, true)
+                        parsePrimary((, expression)
+                          parseLiteralString(()
+                            parseSingleLiteralString(()
+                              listener: beginLiteralString("hello")
+                              listener: endLiteralString(0, ))
+                  listener: endArguments(1, (, ))
+            listener: endMetadata(@, null, T)
+          listener: endMetadataStar(1)
+        ensureIdentifier(), typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(T, 1)
+        listener: handleNoType(T)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(int)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(foo, metadataReference)
+            parseQualifiedRestOpt(foo, metadataContinuation)
+            listener: beginTypeArguments(<)
+            listener: handleIdentifier(int, typeReference)
+            listener: handleNoTypeArguments(>)
+            listener: handleType(int, null)
+            listener: endTypeArguments(1, <, >)
+            parseArgumentsOpt(>)
+              parseArguments(>)
+                parseArgumentsRest(()
+                  listener: beginArguments(()
+                  parseExpression(()
+                    parsePrecedenceExpression((, 1, true)
+                      parseUnaryExpression((, true)
+                        parsePrimary((, expression)
+                          parseLiteralString(()
+                            parseSingleLiteralString(()
+                              listener: beginLiteralString("hello")
+                              listener: endLiteralString(0, ))
+                  listener: endArguments(1, (, ))
+            listener: endMetadata(@, null, X)
+          listener: endMetadataStar(1)
+        ensureIdentifier(), typeVariableDeclaration)
+          listener: handleIdentifier(X, typeVariableDeclaration)
+        listener: beginTypeVariable(X)
+        listener: handleTypeVariablesDefined(X, 1)
+        listener: handleNoType(X)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        ensureIdentifier(=, typeReference)
+          listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(Function)
+        listener: handleType(int, null)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              parseMetadataStar(()
+                listener: beginMetadataStar(@)
+                parseMetadata(()
+                  listener: beginMetadata(@)
+                  ensureIdentifier(@, metadataReference)
+                    listener: handleIdentifier(foo, metadataReference)
+                  parseQualifiedRestOpt(foo, metadataContinuation)
+                  listener: beginTypeArguments(<)
+                  listener: handleIdentifier(int, typeReference)
+                  listener: handleNoTypeArguments(>)
+                  listener: handleType(int, null)
+                  listener: endTypeArguments(1, <, >)
+                  parseArgumentsOpt(>)
+                    parseArguments(>)
+                      parseArgumentsRest(()
+                        listener: beginArguments(()
+                        parseExpression(()
+                          parsePrecedenceExpression((, 1, true)
+                            parseUnaryExpression((, true)
+                              parsePrimary((, expression)
+                                parseLiteralString(()
+                                  parseSingleLiteralString(()
+                                    listener: beginLiteralString("hello")
+                                    listener: endLiteralString(0, ))
+                        listener: endArguments(1, (, ))
+                  listener: endMetadata(@, null, int)
+                listener: endMetadataStar(1)
+              listener: beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+              listener: handleIdentifier(int, typeReference)
+              listener: handleNoTypeArguments())
+              listener: handleType(int, null)
+              listener: handleNoName())
+              listener: handleFormalParameterWithoutValue())
+              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginUncategorizedTopLevelDeclaration(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(F, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(foo, metadataReference)
+            parseQualifiedRestOpt(foo, metadataContinuation)
+            listener: beginTypeArguments(<)
+            listener: handleIdentifier(int, typeReference)
+            listener: handleNoTypeArguments(>)
+            listener: handleType(int, null)
+            listener: endTypeArguments(1, <, >)
+            ensureIdentifier(., metadataContinuationAfterTypeArguments)
+              inPlainSync()
+              listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+            parseArgumentsOpt(abstract)
+              parseArguments(abstract)
+                parseArgumentsRest(()
+                  listener: beginArguments(()
+                  parseExpression(()
+                    parsePrecedenceExpression((, 1, true)
+                      parseUnaryExpression((, true)
+                        parsePrimary((, expression)
+                          parseLiteralString(()
+                            parseSingleLiteralString(()
+                              listener: beginLiteralString("hello")
+                              listener: endLiteralString(0, ))
+                  listener: endArguments(1, (, ))
+            listener: endMetadata(@, ., T)
+          listener: endMetadataStar(1)
+        ensureIdentifier(), typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(T, 1)
+        listener: handleNoType(T)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(int)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(foo, metadataReference)
+            parseQualifiedRestOpt(foo, metadataContinuation)
+            listener: beginTypeArguments(<)
+            listener: handleIdentifier(int, typeReference)
+            listener: handleNoTypeArguments(>)
+            listener: handleType(int, null)
+            listener: endTypeArguments(1, <, >)
+            ensureIdentifier(., metadataContinuationAfterTypeArguments)
+              inPlainSync()
+              listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+            parseArgumentsOpt(abstract)
+              parseArguments(abstract)
+                parseArgumentsRest(()
+                  listener: beginArguments(()
+                  parseExpression(()
+                    parsePrecedenceExpression((, 1, true)
+                      parseUnaryExpression((, true)
+                        parsePrimary((, expression)
+                          parseLiteralString(()
+                            parseSingleLiteralString(()
+                              listener: beginLiteralString("hello")
+                              listener: endLiteralString(0, ))
+                  listener: endArguments(1, (, ))
+            listener: endMetadata(@, ., X)
+          listener: endMetadataStar(1)
+        ensureIdentifier(), typeVariableDeclaration)
+          listener: handleIdentifier(X, typeVariableDeclaration)
+        listener: beginTypeVariable(X)
+        listener: handleTypeVariablesDefined(X, 1)
+        listener: handleNoType(X)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        ensureIdentifier(=, typeReference)
+          listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(Function)
+        listener: handleType(int, null)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              parseMetadataStar(()
+                listener: beginMetadataStar(@)
+                parseMetadata(()
+                  listener: beginMetadata(@)
+                  ensureIdentifier(@, metadataReference)
+                    listener: handleIdentifier(foo, metadataReference)
+                  parseQualifiedRestOpt(foo, metadataContinuation)
+                  listener: beginTypeArguments(<)
+                  listener: handleIdentifier(int, typeReference)
+                  listener: handleNoTypeArguments(>)
+                  listener: handleType(int, null)
+                  listener: endTypeArguments(1, <, >)
+                  ensureIdentifier(., metadataContinuationAfterTypeArguments)
+                    inPlainSync()
+                    listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+                  parseArgumentsOpt(abstract)
+                    parseArguments(abstract)
+                      parseArgumentsRest(()
+                        listener: beginArguments(()
+                        parseExpression(()
+                          parsePrecedenceExpression((, 1, true)
+                            parseUnaryExpression((, true)
+                              parsePrimary((, expression)
+                                parseLiteralString(()
+                                  parseSingleLiteralString(()
+                                    listener: beginLiteralString("hello")
+                                    listener: endLiteralString(0, ))
+                        listener: endArguments(1, (, ))
+                  listener: endMetadata(@, ., int)
+                listener: endMetadataStar(1)
+              listener: beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+              listener: handleIdentifier(int, typeReference)
+              listener: handleNoTypeArguments())
+              listener: handleType(int, null)
+              listener: handleNoName())
+              listener: handleFormalParameterWithoutValue())
+              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginUncategorizedTopLevelDeclaration(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(F, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(foo, metadataReference)
+            parseQualifiedRestOpt(foo, metadataContinuation)
+              parseQualifiedRest(foo, metadataContinuation)
+                ensureIdentifier(., metadataContinuation)
+                  listener: handleIdentifier(bar, metadataContinuation)
+                listener: handleQualified(.)
+            listener: beginTypeArguments(<)
+            listener: handleIdentifier(int, typeReference)
+            listener: handleNoTypeArguments(>)
+            listener: handleType(int, null)
+            listener: endTypeArguments(1, <, >)
+            parseArgumentsOpt(>)
+              parseArguments(>)
+                parseArgumentsRest(()
+                  listener: beginArguments(()
+                  parseExpression(()
+                    parsePrecedenceExpression((, 1, true)
+                      parseUnaryExpression((, true)
+                        parsePrimary((, expression)
+                          parseLiteralString(()
+                            parseSingleLiteralString(()
+                              listener: beginLiteralString("hello")
+                              listener: endLiteralString(0, ))
+                  listener: endArguments(1, (, ))
+            listener: endMetadata(@, null, T)
+          listener: endMetadataStar(1)
+        ensureIdentifier(), typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(T, 1)
+        listener: handleNoType(T)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(int)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(foo, metadataReference)
+            parseQualifiedRestOpt(foo, metadataContinuation)
+              parseQualifiedRest(foo, metadataContinuation)
+                ensureIdentifier(., metadataContinuation)
+                  listener: handleIdentifier(bar, metadataContinuation)
+                listener: handleQualified(.)
+            listener: beginTypeArguments(<)
+            listener: handleIdentifier(int, typeReference)
+            listener: handleNoTypeArguments(>)
+            listener: handleType(int, null)
+            listener: endTypeArguments(1, <, >)
+            parseArgumentsOpt(>)
+              parseArguments(>)
+                parseArgumentsRest(()
+                  listener: beginArguments(()
+                  parseExpression(()
+                    parsePrecedenceExpression((, 1, true)
+                      parseUnaryExpression((, true)
+                        parsePrimary((, expression)
+                          parseLiteralString(()
+                            parseSingleLiteralString(()
+                              listener: beginLiteralString("hello")
+                              listener: endLiteralString(0, ))
+                  listener: endArguments(1, (, ))
+            listener: endMetadata(@, null, X)
+          listener: endMetadataStar(1)
+        ensureIdentifier(), typeVariableDeclaration)
+          listener: handleIdentifier(X, typeVariableDeclaration)
+        listener: beginTypeVariable(X)
+        listener: handleTypeVariablesDefined(X, 1)
+        listener: handleNoType(X)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        ensureIdentifier(=, typeReference)
+          listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(Function)
+        listener: handleType(int, null)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              parseMetadataStar(()
+                listener: beginMetadataStar(@)
+                parseMetadata(()
+                  listener: beginMetadata(@)
+                  ensureIdentifier(@, metadataReference)
+                    listener: handleIdentifier(foo, metadataReference)
+                  parseQualifiedRestOpt(foo, metadataContinuation)
+                    parseQualifiedRest(foo, metadataContinuation)
+                      ensureIdentifier(., metadataContinuation)
+                        listener: handleIdentifier(bar, metadataContinuation)
+                      listener: handleQualified(.)
+                  listener: beginTypeArguments(<)
+                  listener: handleIdentifier(int, typeReference)
+                  listener: handleNoTypeArguments(>)
+                  listener: handleType(int, null)
+                  listener: endTypeArguments(1, <, >)
+                  parseArgumentsOpt(>)
+                    parseArguments(>)
+                      parseArgumentsRest(()
+                        listener: beginArguments(()
+                        parseExpression(()
+                          parsePrecedenceExpression((, 1, true)
+                            parseUnaryExpression((, true)
+                              parsePrimary((, expression)
+                                parseLiteralString(()
+                                  parseSingleLiteralString(()
+                                    listener: beginLiteralString("hello")
+                                    listener: endLiteralString(0, ))
+                        listener: endArguments(1, (, ))
+                  listener: endMetadata(@, null, int)
+                listener: endMetadataStar(1)
+              listener: beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+              listener: handleIdentifier(int, typeReference)
+              listener: handleNoTypeArguments())
+              listener: handleType(int, null)
+              listener: handleNoName())
+              listener: handleFormalParameterWithoutValue())
+              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginUncategorizedTopLevelDeclaration(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(F, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(foo, metadataReference)
+            parseQualifiedRestOpt(foo, metadataContinuation)
+              parseQualifiedRest(foo, metadataContinuation)
+                ensureIdentifier(., metadataContinuation)
+                  listener: handleIdentifier(bar, metadataContinuation)
+                listener: handleQualified(.)
+            listener: beginTypeArguments(<)
+            listener: handleIdentifier(int, typeReference)
+            listener: handleNoTypeArguments(>)
+            listener: handleType(int, null)
+            listener: endTypeArguments(1, <, >)
+            ensureIdentifier(., metadataContinuationAfterTypeArguments)
+              inPlainSync()
+              listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+            parseArgumentsOpt(abstract)
+              parseArguments(abstract)
+                parseArgumentsRest(()
+                  listener: beginArguments(()
+                  parseExpression(()
+                    parsePrecedenceExpression((, 1, true)
+                      parseUnaryExpression((, true)
+                        parsePrimary((, expression)
+                          parseLiteralString(()
+                            parseSingleLiteralString(()
+                              listener: beginLiteralString("hello")
+                              listener: endLiteralString(0, ))
+                  listener: endArguments(1, (, ))
+            listener: endMetadata(@, ., T)
+          listener: endMetadataStar(1)
+        ensureIdentifier(), typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(T, 1)
+        listener: handleNoType(T)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(int)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(@)
+          parseMetadata(<)
+            listener: beginMetadata(@)
+            ensureIdentifier(@, metadataReference)
+              listener: handleIdentifier(foo, metadataReference)
+            parseQualifiedRestOpt(foo, metadataContinuation)
+              parseQualifiedRest(foo, metadataContinuation)
+                ensureIdentifier(., metadataContinuation)
+                  listener: handleIdentifier(bar, metadataContinuation)
+                listener: handleQualified(.)
+            listener: beginTypeArguments(<)
+            listener: handleIdentifier(int, typeReference)
+            listener: handleNoTypeArguments(>)
+            listener: handleType(int, null)
+            listener: endTypeArguments(1, <, >)
+            ensureIdentifier(., metadataContinuationAfterTypeArguments)
+              inPlainSync()
+              listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+            parseArgumentsOpt(abstract)
+              parseArguments(abstract)
+                parseArgumentsRest(()
+                  listener: beginArguments(()
+                  parseExpression(()
+                    parsePrecedenceExpression((, 1, true)
+                      parseUnaryExpression((, true)
+                        parsePrimary((, expression)
+                          parseLiteralString(()
+                            parseSingleLiteralString(()
+                              listener: beginLiteralString("hello")
+                              listener: endLiteralString(0, ))
+                  listener: endArguments(1, (, ))
+            listener: endMetadata(@, ., X)
+          listener: endMetadataStar(1)
+        ensureIdentifier(), typeVariableDeclaration)
+          listener: handleIdentifier(X, typeVariableDeclaration)
+        listener: beginTypeVariable(X)
+        listener: handleTypeVariablesDefined(X, 1)
+        listener: handleNoType(X)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        ensureIdentifier(=, typeReference)
+          listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(Function)
+        listener: handleType(int, null)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              parseMetadataStar(()
+                listener: beginMetadataStar(@)
+                parseMetadata(()
+                  listener: beginMetadata(@)
+                  ensureIdentifier(@, metadataReference)
+                    listener: handleIdentifier(foo, metadataReference)
+                  parseQualifiedRestOpt(foo, metadataContinuation)
+                    parseQualifiedRest(foo, metadataContinuation)
+                      ensureIdentifier(., metadataContinuation)
+                        listener: handleIdentifier(bar, metadataContinuation)
+                      listener: handleQualified(.)
+                  listener: beginTypeArguments(<)
+                  listener: handleIdentifier(int, typeReference)
+                  listener: handleNoTypeArguments(>)
+                  listener: handleType(int, null)
+                  listener: endTypeArguments(1, <, >)
+                  ensureIdentifier(., metadataContinuationAfterTypeArguments)
+                    inPlainSync()
+                    listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+                  parseArgumentsOpt(abstract)
+                    parseArguments(abstract)
+                      parseArgumentsRest(()
+                        listener: beginArguments(()
+                        parseExpression(()
+                          parsePrecedenceExpression((, 1, true)
+                            parseUnaryExpression((, true)
+                              parsePrimary((, expression)
+                                parseLiteralString(()
+                                  parseSingleLiteralString(()
+                                    listener: beginLiteralString("hello")
+                                    listener: endLiteralString(0, ))
+                        listener: endArguments(1, (, ))
+                  listener: endMetadata(@, ., int)
+                listener: endMetadataStar(1)
+              listener: beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
+              listener: handleIdentifier(int, typeReference)
+              listener: handleNoTypeArguments())
+              listener: handleType(int, null)
+              listener: handleNoName())
+              listener: handleFormalParameterWithoutValue())
+              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(@)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(@)
+      parseMetadata(;)
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          inPlainSync()
+          listener: handleIdentifier(abstract, metadataReference)
+        parseQualifiedRestOpt(abstract, metadataContinuation)
+          parseQualifiedRest(abstract, metadataContinuation)
+            ensureIdentifier(., metadataContinuation)
+              inPlainSync()
+              listener: handleIdentifier(abstract, metadataContinuation)
+            listener: handleQualified(.)
+        listener: handleNoTypeArguments(@)
+        parseArgumentsOpt(abstract)
+          listener: handleNoArguments(@)
+        listener: endMetadata(@, null, @)
+      parseMetadata(abstract)
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          inPlainSync()
+          listener: handleIdentifier(abstract, metadataReference)
+        parseQualifiedRestOpt(abstract, metadataContinuation)
+          parseQualifiedRest(abstract, metadataContinuation)
+            ensureIdentifier(., metadataContinuation)
+              listener: handleIdentifier(bar, metadataContinuation)
+            listener: handleQualified(.)
+        listener: handleNoTypeArguments(.)
+        ensureIdentifier(., metadataContinuationAfterTypeArguments)
+          inPlainSync()
+          listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+        parseArgumentsOpt(abstract)
+          listener: handleNoArguments(@)
+        listener: endMetadata(@, ., @)
+      parseMetadata(abstract)
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          inPlainSync()
+          listener: handleIdentifier(abstract, metadataReference)
+        parseQualifiedRestOpt(abstract, metadataContinuation)
+        listener: handleNoTypeArguments(()
+        parseArgumentsOpt(abstract)
+          parseArguments(abstract)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              parseExpression(()
+                parsePrecedenceExpression((, 1, true)
+                  parseUnaryExpression((, true)
+                    parsePrimary((, expression)
+                      parseLiteralString(()
+                        parseSingleLiteralString(()
+                          listener: beginLiteralString("hello")
+                          listener: endLiteralString(0, ))
+              listener: endArguments(1, (, ))
+        listener: endMetadata(@, null, @)
+      parseMetadata())
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          inPlainSync()
+          listener: handleIdentifier(abstract, metadataReference)
+        parseQualifiedRestOpt(abstract, metadataContinuation)
+          parseQualifiedRest(abstract, metadataContinuation)
+            ensureIdentifier(., metadataContinuation)
+              inPlainSync()
+              listener: handleIdentifier(abstract, metadataContinuation)
+            listener: handleQualified(.)
+        listener: handleNoTypeArguments(()
+        parseArgumentsOpt(abstract)
+          parseArguments(abstract)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              parseExpression(()
+                parsePrecedenceExpression((, 1, true)
+                  parseUnaryExpression((, true)
+                    parsePrimary((, expression)
+                      parseLiteralString(()
+                        parseSingleLiteralString(()
+                          listener: beginLiteralString("hello")
+                          listener: endLiteralString(0, ))
+              listener: endArguments(1, (, ))
+        listener: endMetadata(@, null, @)
+      parseMetadata())
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          inPlainSync()
+          listener: handleIdentifier(abstract, metadataReference)
+        parseQualifiedRestOpt(abstract, metadataContinuation)
+          parseQualifiedRest(abstract, metadataContinuation)
+            ensureIdentifier(., metadataContinuation)
+              listener: handleIdentifier(bar, metadataContinuation)
+            listener: handleQualified(.)
+        listener: handleNoTypeArguments(.)
+        ensureIdentifier(., metadataContinuationAfterTypeArguments)
+          inPlainSync()
+          listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+        parseArgumentsOpt(abstract)
+          parseArguments(abstract)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              parseExpression(()
+                parsePrecedenceExpression((, 1, true)
+                  parseUnaryExpression((, true)
+                    parsePrimary((, expression)
+                      parseLiteralString(()
+                        parseSingleLiteralString(()
+                          listener: beginLiteralString("hello")
+                          listener: endLiteralString(0, ))
+              listener: endArguments(1, (, ))
+        listener: endMetadata(@, ., @)
+      parseMetadata())
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          inPlainSync()
+          listener: handleIdentifier(abstract, metadataReference)
+        parseQualifiedRestOpt(abstract, metadataContinuation)
+        listener: beginTypeArguments(<)
+        listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(int, null)
+        listener: endTypeArguments(1, <, >)
+        parseArgumentsOpt(>)
+          parseArguments(>)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              parseExpression(()
+                parsePrecedenceExpression((, 1, true)
+                  parseUnaryExpression((, true)
+                    parsePrimary((, expression)
+                      parseLiteralString(()
+                        parseSingleLiteralString(()
+                          listener: beginLiteralString("hello")
+                          listener: endLiteralString(0, ))
+              listener: endArguments(1, (, ))
+        listener: endMetadata(@, null, @)
+      parseMetadata())
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          inPlainSync()
+          listener: handleIdentifier(abstract, metadataReference)
+        parseQualifiedRestOpt(abstract, metadataContinuation)
+        listener: beginTypeArguments(<)
+        listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(int, null)
+        listener: endTypeArguments(1, <, >)
+        ensureIdentifier(., metadataContinuationAfterTypeArguments)
+          inPlainSync()
+          listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+        parseArgumentsOpt(abstract)
+          parseArguments(abstract)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              parseExpression(()
+                parsePrecedenceExpression((, 1, true)
+                  parseUnaryExpression((, true)
+                    parsePrimary((, expression)
+                      parseLiteralString(()
+                        parseSingleLiteralString(()
+                          listener: beginLiteralString("hello")
+                          listener: endLiteralString(0, ))
+              listener: endArguments(1, (, ))
+        listener: endMetadata(@, ., @)
+      parseMetadata())
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          inPlainSync()
+          listener: handleIdentifier(abstract, metadataReference)
+        parseQualifiedRestOpt(abstract, metadataContinuation)
+          parseQualifiedRest(abstract, metadataContinuation)
+            ensureIdentifier(., metadataContinuation)
+              listener: handleIdentifier(bar, metadataContinuation)
+            listener: handleQualified(.)
+        listener: beginTypeArguments(<)
+        listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(int, null)
+        listener: endTypeArguments(1, <, >)
+        parseArgumentsOpt(>)
+          parseArguments(>)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              parseExpression(()
+                parsePrecedenceExpression((, 1, true)
+                  parseUnaryExpression((, true)
+                    parsePrimary((, expression)
+                      parseLiteralString(()
+                        parseSingleLiteralString(()
+                          listener: beginLiteralString("hello")
+                          listener: endLiteralString(0, ))
+              listener: endArguments(1, (, ))
+        listener: endMetadata(@, null, @)
+      parseMetadata())
+        listener: beginMetadata(@)
+        ensureIdentifier(@, metadataReference)
+          inPlainSync()
+          listener: handleIdentifier(abstract, metadataReference)
+        parseQualifiedRestOpt(abstract, metadataContinuation)
+          parseQualifiedRest(abstract, metadataContinuation)
+            ensureIdentifier(., metadataContinuation)
+              listener: handleIdentifier(bar, metadataContinuation)
+            listener: handleQualified(.)
+        listener: beginTypeArguments(<)
+        listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(int, null)
+        listener: endTypeArguments(1, <, >)
+        ensureIdentifier(., metadataContinuationAfterTypeArguments)
+          inPlainSync()
+          listener: handleIdentifier(abstract, metadataContinuationAfterTypeArguments)
+        parseArgumentsOpt(abstract)
+          parseArguments(abstract)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              parseExpression(()
+                parsePrecedenceExpression((, 1, true)
+                  parseUnaryExpression((, true)
+                    parsePrimary((, expression)
+                      parseLiteralString(()
+                        parseSingleLiteralString(()
+                          listener: beginLiteralString("hello")
+                          listener: endLiteralString(0, ))
+              listener: endArguments(1, (, ))
+        listener: endMetadata(@, ., class)
+      listener: endMetadataStar(9)
+    parseTopLevelKeywordDeclaration(), class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(), class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(Y, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, Y)
+        parseClass(Y, class, class, Y)
+          parseClassHeaderOpt(Y, class, class)
+            parseClassExtendsOpt(Y)
+              listener: handleNoType(Y)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(Y)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(Y)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(Y, DeclarationKind.Class, Y)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(@)
+  listener: endCompilationUnit(12, )
diff --git a/pkg/front_end/parser_testcases/general/metadata.dart.parser.expect b/pkg/front_end/parser_testcases/general/metadata.dart.parser.expect
new file mode 100644
index 0000000..fb0a8af
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/metadata.dart.parser.expect
@@ -0,0 +1,79 @@
+@abstract
+@foo.abstract
+@foo.bar.abstract
+@foo("hello")
+@foo.abstract("hello")
+@foo.bar.abstract("hello")
+@foo<int>("hello")
+@foo<int>.abstract("hello")
+@foo.bar<int>("hello")
+@foo.bar<int>.abstract("hello")
+class X {}
+
+
+typedef F<@abstract T> = int Function<@abstract X>(@abstract int);
+typedef F<@foo.abstract T> = int Function<@foo.abstract X>(@foo.abstract int);
+typedef F<@foo.bar.abstract T> = int Function<@foo.bar.abstract X>(@foo.bar.abstract int);
+typedef F<@foo("hello") T> = int Function<@foo("hello") X>(@foo("hello") int);
+typedef F<@foo.abstract("hello") T> = int Function<@foo.abstract("hello") X>(@foo.abstract("hello") int);
+typedef F<@foo.bar.abstract("hello") T> = int Function<@foo.bar.abstract("hello") X>(@foo.bar.abstract("hello") int);
+typedef F<@foo<int>("hello") T> = int Function<@foo<int>("hello") X>(@foo<int>("hello") int);
+typedef F<@foo<int>.abstract("hello") T> = int Function<@foo<int>.abstract("hello") X>(@foo<int>.abstract("hello") int);
+typedef F<@foo.bar<int>("hello") T> = int Function<@foo.bar<int>("hello") X>(@foo.bar<int>("hello") int);
+typedef F<@foo.bar<int>.abstract("hello") T> = int Function<@foo.bar<int>.abstract("hello") X>(@foo.bar<int>.abstract("hello") int);
+
+
+
+
+
+
+@abstract.abstract
+@abstract.bar.abstract
+@abstract("hello")
+@abstract.abstract("hello")
+@abstract.bar.abstract("hello")
+@abstract<int>("hello")
+@abstract<int>.abstract("hello")
+@abstract.bar<int>("hello")
+@abstract.bar<int>.abstract("hello")
+class Y {}
+
+@[SimpleToken]abstract[KeywordToken]
+@[SimpleToken]foo[StringToken].[SimpleToken]abstract[KeywordToken]
+@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken]
+@[SimpleToken]foo[StringToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]foo[StringToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]foo[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]foo[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+class[KeywordToken] X[StringToken] {[BeginToken]}[SimpleToken]
+
+
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]abstract[KeywordToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]abstract[KeywordToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]abstract[KeywordToken] int[StringToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]abstract[KeywordToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]abstract[KeywordToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]abstract[KeywordToken] int[StringToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken] int[StringToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]foo[StringToken]([BeginToken]"hello"[StringToken])[SimpleToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]foo[StringToken]([BeginToken]"hello"[StringToken])[SimpleToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]foo[StringToken]([BeginToken]"hello"[StringToken])[SimpleToken] int[StringToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] int[StringToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] int[StringToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]foo[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]foo[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]foo[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken] int[StringToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]foo[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]foo[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]foo[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] int[StringToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken] int[StringToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] int[StringToken])[SimpleToken];[SimpleToken]
+
+
+
+
+
+
+@[SimpleToken]abstract[KeywordToken].[SimpleToken]abstract[KeywordToken]
+@[SimpleToken]abstract[KeywordToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken]
+@[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]abstract[KeywordToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]abstract[KeywordToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]abstract[KeywordToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]abstract[KeywordToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]abstract[KeywordToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]abstract[KeywordToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+class[KeywordToken] Y[StringToken] {[BeginToken]}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/metadata.dart.scanner.expect b/pkg/front_end/parser_testcases/general/metadata.dart.scanner.expect
new file mode 100644
index 0000000..fb0a8af
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/metadata.dart.scanner.expect
@@ -0,0 +1,79 @@
+@abstract
+@foo.abstract
+@foo.bar.abstract
+@foo("hello")
+@foo.abstract("hello")
+@foo.bar.abstract("hello")
+@foo<int>("hello")
+@foo<int>.abstract("hello")
+@foo.bar<int>("hello")
+@foo.bar<int>.abstract("hello")
+class X {}
+
+
+typedef F<@abstract T> = int Function<@abstract X>(@abstract int);
+typedef F<@foo.abstract T> = int Function<@foo.abstract X>(@foo.abstract int);
+typedef F<@foo.bar.abstract T> = int Function<@foo.bar.abstract X>(@foo.bar.abstract int);
+typedef F<@foo("hello") T> = int Function<@foo("hello") X>(@foo("hello") int);
+typedef F<@foo.abstract("hello") T> = int Function<@foo.abstract("hello") X>(@foo.abstract("hello") int);
+typedef F<@foo.bar.abstract("hello") T> = int Function<@foo.bar.abstract("hello") X>(@foo.bar.abstract("hello") int);
+typedef F<@foo<int>("hello") T> = int Function<@foo<int>("hello") X>(@foo<int>("hello") int);
+typedef F<@foo<int>.abstract("hello") T> = int Function<@foo<int>.abstract("hello") X>(@foo<int>.abstract("hello") int);
+typedef F<@foo.bar<int>("hello") T> = int Function<@foo.bar<int>("hello") X>(@foo.bar<int>("hello") int);
+typedef F<@foo.bar<int>.abstract("hello") T> = int Function<@foo.bar<int>.abstract("hello") X>(@foo.bar<int>.abstract("hello") int);
+
+
+
+
+
+
+@abstract.abstract
+@abstract.bar.abstract
+@abstract("hello")
+@abstract.abstract("hello")
+@abstract.bar.abstract("hello")
+@abstract<int>("hello")
+@abstract<int>.abstract("hello")
+@abstract.bar<int>("hello")
+@abstract.bar<int>.abstract("hello")
+class Y {}
+
+@[SimpleToken]abstract[KeywordToken]
+@[SimpleToken]foo[StringToken].[SimpleToken]abstract[KeywordToken]
+@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken]
+@[SimpleToken]foo[StringToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]foo[StringToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]foo[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]foo[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+class[KeywordToken] X[StringToken] {[BeginToken]}[SimpleToken]
+
+
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]abstract[KeywordToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]abstract[KeywordToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]abstract[KeywordToken] int[StringToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]abstract[KeywordToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]abstract[KeywordToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]abstract[KeywordToken] int[StringToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken] int[StringToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]foo[StringToken]([BeginToken]"hello"[StringToken])[SimpleToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]foo[StringToken]([BeginToken]"hello"[StringToken])[SimpleToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]foo[StringToken]([BeginToken]"hello"[StringToken])[SimpleToken] int[StringToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] int[StringToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] int[StringToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]foo[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]foo[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]foo[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken] int[StringToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]foo[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]foo[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]foo[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] int[StringToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken] int[StringToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F[StringToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] T[StringToken]>[SimpleToken] =[SimpleToken] int[StringToken] Function[KeywordToken]<[BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] X[StringToken]>[SimpleToken]([BeginToken]@[SimpleToken]foo[StringToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken] int[StringToken])[SimpleToken];[SimpleToken]
+
+
+
+
+
+
+@[SimpleToken]abstract[KeywordToken].[SimpleToken]abstract[KeywordToken]
+@[SimpleToken]abstract[KeywordToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken]
+@[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]abstract[KeywordToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]abstract[KeywordToken].[SimpleToken]bar[StringToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]abstract[KeywordToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]abstract[KeywordToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]abstract[KeywordToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+@[SimpleToken]abstract[KeywordToken].[SimpleToken]bar[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]abstract[KeywordToken]([BeginToken]"hello"[StringToken])[SimpleToken]
+class[KeywordToken] Y[StringToken] {[BeginToken]}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 517d068..342696f 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -312,6 +312,7 @@
 deserializes
 deserializing
 design
+designation
 despite
 destination
 destinations
@@ -693,6 +694,7 @@
 merely
 meta
 metadata's
+metadatum
 method10a
 method10b
 method1a
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.expect b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.expect
index 8c0ab7a..3dfc9a6 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.expect
@@ -34,14 +34,14 @@
 //   Extension(c1).foo();
 //                 ^^^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 2 required, 1 given.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 1 required, 0 given.
 //   Extension(c1).method();
 //                 ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
 //   method(a) {}
 //   ^^^^^^^^^^^^^...
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 2 allowed, but 3 found.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //   Extension(c1).method(1, 2);
 //                 ^
@@ -49,7 +49,7 @@
 //   method(a) {}
 //   ^^^^^^^^^^^^^...
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 2 required, 1 given.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 1 required, 0 given.
 //   Extension(c1).method(a: 1);
 //                 ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
@@ -199,14 +199,14 @@
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:31:17: Error: Method not found: 'foo'.
   Extension(c1).foo();
                 ^^^";
-  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 2 required, 1 given.
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 1 required, 0 given.
   Extension(c1).method();
                 ^";
-  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 2 allowed, but 3 found.
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
   Extension(c1).method(1, 2);
                 ^";
-  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 2 required, 1 given.
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 1 required, 0 given.
   Extension(c1).method(a: 1);
                 ^";
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:38:27: Error: No named parameter with the name 'a'.
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.transformed.expect
index 8c0ab7a..3dfc9a6 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.transformed.expect
@@ -34,14 +34,14 @@
 //   Extension(c1).foo();
 //                 ^^^
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 2 required, 1 given.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 1 required, 0 given.
 //   Extension(c1).method();
 //                 ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
 //   method(a) {}
 //   ^^^^^^^^^^^^^...
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 2 allowed, but 3 found.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 1 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //   Extension(c1).method(1, 2);
 //                 ^
@@ -49,7 +49,7 @@
 //   method(a) {}
 //   ^^^^^^^^^^^^^...
 //
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 2 required, 1 given.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 1 required, 0 given.
 //   Extension(c1).method(a: 1);
 //                 ^
 // pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
@@ -199,14 +199,14 @@
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:31:17: Error: Method not found: 'foo'.
   Extension(c1).foo();
                 ^^^";
-  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 2 required, 1 given.
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 1 required, 0 given.
   Extension(c1).method();
                 ^";
-  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 2 allowed, but 3 found.
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 1 allowed, but 2 found.
 Try removing the extra positional arguments.
   Extension(c1).method(1, 2);
                 ^";
-  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 2 required, 1 given.
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 1 required, 0 given.
   Extension(c1).method(a: 1);
                 ^";
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:38:27: Error: No named parameter with the name 'a'.
diff --git a/pkg/front_end/testcases/general/issue45204.dart b/pkg/front_end/testcases/general/issue45204.dart
new file mode 100644
index 0000000..ee754db
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue45204.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+extension S on int {
+  void test(int x) {}
+}
+
+extension S2<X> on int {
+  void test2(int x) {}
+  void test3<Y>(Y y) {}
+}
+
+foo() {
+  3.test();
+  4.test(5, 6);
+  5.test<int>(6);
+
+  3.test2();
+  4.test2(5, 6);
+  5.test2<int>(6);
+
+  3.test3();
+  4.test3(5, 6);
+  5.test3<int>(6);
+  6.test3<int, int>(7);
+  7.test3<int, int, int>(8);
+
+  S(3).test();
+  S(4).test(5, 6);
+  S(5).test<int>(6);
+
+  S2(3).test2();
+  S2(4).test2(5, 6);
+  S2(5).test2<int>(6);
+
+  S2(3).test3();
+  S2(4).test3(5, 6);
+  S2(5).test3<int>(6);
+  S2(6).test3<int, int>(7);
+  S2(7).test3<int, int, int>(8);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue45204.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue45204.dart.textual_outline.expect
new file mode 100644
index 0000000..1eac4b0
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue45204.dart.textual_outline.expect
@@ -0,0 +1,11 @@
+extension S on int {
+  void test(int x) {}
+}
+
+extension S2<X> on int {
+  void test2(int x) {}
+  void test3<Y>(Y y) {}
+}
+
+foo() {}
+main() {}
diff --git a/pkg/front_end/testcases/general/issue45204.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue45204.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..1eac4b0
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue45204.dart.textual_outline_modelled.expect
@@ -0,0 +1,11 @@
+extension S on int {
+  void test(int x) {}
+}
+
+extension S2<X> on int {
+  void test2(int x) {}
+  void test3<Y>(Y y) {}
+}
+
+foo() {}
+main() {}
diff --git a/pkg/front_end/testcases/general/issue45204.dart.weak.expect b/pkg/front_end/testcases/general/issue45204.dart.weak.expect
new file mode 100644
index 0000000..6488985
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue45204.dart.weak.expect
@@ -0,0 +1,213 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue45204.dart:29:8: Error: Too few positional arguments: 1 required, 0 given.
+//   S(3).test();
+//        ^
+// pkg/front_end/testcases/general/issue45204.dart:6:8: Context: Found this candidate, but the arguments don't match.
+//   void test(int x) {}
+//        ^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:30:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   S(4).test(5, 6);
+//        ^
+// pkg/front_end/testcases/general/issue45204.dart:6:8: Context: Found this candidate, but the arguments don't match.
+//   void test(int x) {}
+//        ^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:31:8: Error: Expected 0 type arguments.
+//   S(5).test<int>(6);
+//        ^
+// pkg/front_end/testcases/general/issue45204.dart:6:8: Context: Found this candidate, but the arguments don't match.
+//   void test(int x) {}
+//        ^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:33:9: Error: Too few positional arguments: 1 required, 0 given.
+//   S2(3).test2();
+//         ^
+// pkg/front_end/testcases/general/issue45204.dart:10:8: Context: Found this candidate, but the arguments don't match.
+//   void test2(int x) {}
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:34:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   S2(4).test2(5, 6);
+//         ^
+// pkg/front_end/testcases/general/issue45204.dart:10:8: Context: Found this candidate, but the arguments don't match.
+//   void test2(int x) {}
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:35:9: Error: Expected 1 type arguments.
+//   S2(5).test2<int>(6);
+//         ^
+// pkg/front_end/testcases/general/issue45204.dart:10:8: Context: Found this candidate, but the arguments don't match.
+//   void test2(int x) {}
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:37:9: Error: Too few positional arguments: 1 required, 0 given.
+//   S2(3).test3();
+//         ^
+// pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
+//   void test3<Y>(Y y) {}
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:38:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   S2(4).test3(5, 6);
+//         ^
+// pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
+//   void test3<Y>(Y y) {}
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:40:9: Error: Expected 2 type arguments.
+//   S2(6).test3<int, int>(7);
+//         ^
+// pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
+//   void test3<Y>(Y y) {}
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:41:9: Error: Expected 2 type arguments.
+//   S2(7).test3<int, int, int>(8);
+//         ^
+// pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
+//   void test3<Y>(Y y) {}
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:15:9: Error: Too few positional arguments: 1 required, 0 given.
+//   3.test();
+//         ^
+//
+// pkg/front_end/testcases/general/issue45204.dart:16:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   4.test(5, 6);
+//         ^
+//
+// pkg/front_end/testcases/general/issue45204.dart:17:5: Error: Expected 0 type arguments.
+//   5.test<int>(6);
+//     ^
+//
+// pkg/front_end/testcases/general/issue45204.dart:19:10: Error: Too few positional arguments: 1 required, 0 given.
+//   3.test2();
+//          ^
+//
+// pkg/front_end/testcases/general/issue45204.dart:20:10: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   4.test2(5, 6);
+//          ^
+//
+// pkg/front_end/testcases/general/issue45204.dart:21:5: Error: Expected 0 type arguments.
+//   5.test2<int>(6);
+//     ^
+//
+// pkg/front_end/testcases/general/issue45204.dart:23:10: Error: Too few positional arguments: 1 required, 0 given.
+//   3.test3();
+//          ^
+//
+// pkg/front_end/testcases/general/issue45204.dart:24:10: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   4.test3(5, 6);
+//          ^
+//
+// pkg/front_end/testcases/general/issue45204.dart:26:5: Error: Expected 1 type arguments.
+//   6.test3<int, int>(7);
+//     ^
+//
+// pkg/front_end/testcases/general/issue45204.dart:27:5: Error: Expected 1 type arguments.
+//   7.test3<int, int, int>(8);
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension S on core::int {
+  method test = self::S|test;
+  tearoff test = self::S|get#test;
+}
+extension S2<X extends core::Object? = dynamic> on core::int {
+  method test2 = self::S2|test2;
+  tearoff test2 = self::S2|get#test2;
+  method test3 = self::S2|test3;
+  tearoff test3 = self::S2|get#test3;
+}
+static method S|test(lowered final core::int #this, core::int x) → void {}
+static method S|get#test(lowered final core::int #this) → (core::int) → void
+  return (core::int x) → void => self::S|test(#this, x);
+static method S2|test2<X extends core::Object? = dynamic>(lowered final core::int #this, core::int x) → void {}
+static method S2|get#test2<X extends core::Object? = dynamic>(lowered final core::int #this) → (core::int) → void
+  return (core::int x) → void => self::S2|test2<self::S2|get#test2::X%>(#this, x);
+static method S2|test3<X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(lowered final core::int #this, self::S2|test3::Y% y) → void {}
+static method S2|get#test3<X extends core::Object? = dynamic>(lowered final core::int #this) → <Y extends core::Object? = dynamic>(Y%) → void
+  return <Y extends core::Object? = dynamic>(Y% y) → void => self::S2|test3<self::S2|get#test3::X%, Y%>(#this, y);
+static method foo() → dynamic {
+  let final Never #t1 = invalid-expression "pkg/front_end/testcases/general/issue45204.dart:15:9: Error: Too few positional arguments: 1 required, 0 given.
+  3.test();
+        ^" in self::S|test(3);
+  let final Never #t2 = invalid-expression "pkg/front_end/testcases/general/issue45204.dart:16:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+  4.test(5, 6);
+        ^" in self::S|test(4, 5, 6);
+  let final Never #t3 = invalid-expression "pkg/front_end/testcases/general/issue45204.dart:17:5: Error: Expected 0 type arguments.
+  5.test<int>(6);
+    ^" in self::S|test<core::int>(5, 6);
+  let final Never #t4 = invalid-expression "pkg/front_end/testcases/general/issue45204.dart:19:10: Error: Too few positional arguments: 1 required, 0 given.
+  3.test2();
+         ^" in self::S2|test2<dynamic>(3);
+  let final Never #t5 = invalid-expression "pkg/front_end/testcases/general/issue45204.dart:20:10: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+  4.test2(5, 6);
+         ^" in self::S2|test2<dynamic>(4, 5, 6);
+  let final Never #t6 = invalid-expression "pkg/front_end/testcases/general/issue45204.dart:21:5: Error: Expected 0 type arguments.
+  5.test2<int>(6);
+    ^" in self::S2|test2<dynamic, core::int>(5, 6);
+  let final Never #t7 = invalid-expression "pkg/front_end/testcases/general/issue45204.dart:23:10: Error: Too few positional arguments: 1 required, 0 given.
+  3.test3();
+         ^" in self::S2|test3<dynamic, dynamic>(3);
+  let final Never #t8 = invalid-expression "pkg/front_end/testcases/general/issue45204.dart:24:10: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+  4.test3(5, 6);
+         ^" in self::S2|test3<dynamic, core::int>(4, 5, 6);
+  self::S2|test3<dynamic, core::int>(5, 6);
+  let final Never #t9 = invalid-expression "pkg/front_end/testcases/general/issue45204.dart:26:5: Error: Expected 1 type arguments.
+  6.test3<int, int>(7);
+    ^" in self::S2|test3<dynamic, core::int, core::int>(6, 7);
+  let final Never #t10 = invalid-expression "pkg/front_end/testcases/general/issue45204.dart:27:5: Error: Expected 1 type arguments.
+  7.test3<int, int, int>(8);
+    ^" in self::S2|test3<dynamic, core::int, core::int, core::int>(7, 8);
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:29:8: Error: Too few positional arguments: 1 required, 0 given.
+  S(3).test();
+       ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:30:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+  S(4).test(5, 6);
+       ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:31:8: Error: Expected 0 type arguments.
+  S(5).test<int>(6);
+       ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:33:9: Error: Too few positional arguments: 1 required, 0 given.
+  S2(3).test2();
+        ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:34:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+  S2(4).test2(5, 6);
+        ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:35:9: Error: Expected 1 type arguments.
+  S2(5).test2<int>(6);
+        ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:37:9: Error: Too few positional arguments: 1 required, 0 given.
+  S2(3).test3();
+        ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:38:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+  S2(4).test3(5, 6);
+        ^";
+  self::S2|test3<dynamic, core::int>(5, 6);
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:40:9: Error: Expected 2 type arguments.
+  S2(6).test3<int, int>(7);
+        ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:41:9: Error: Expected 2 type arguments.
+  S2(7).test3<int, int, int>(8);
+        ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue45204.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue45204.dart.weak.outline.expect
new file mode 100644
index 0000000..2c95328
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue45204.dart.weak.outline.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension S on core::int {
+  method test = self::S|test;
+  tearoff test = self::S|get#test;
+}
+extension S2<X extends core::Object? = dynamic> on core::int {
+  method test2 = self::S2|test2;
+  tearoff test2 = self::S2|get#test2;
+  method test3 = self::S2|test3;
+  tearoff test3 = self::S2|get#test3;
+}
+static method S|test(lowered final core::int #this, core::int x) → void
+  ;
+static method S|get#test(lowered final core::int #this) → (core::int) → void
+  return (core::int x) → void => self::S|test(#this, x);
+static method S2|test2<X extends core::Object? = dynamic>(lowered final core::int #this, core::int x) → void
+  ;
+static method S2|get#test2<X extends core::Object? = dynamic>(lowered final core::int #this) → (core::int) → void
+  return (core::int x) → void => self::S2|test2<self::S2|get#test2::X%>(#this, x);
+static method S2|test3<X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(lowered final core::int #this, self::S2|test3::Y% y) → void
+  ;
+static method S2|get#test3<X extends core::Object? = dynamic>(lowered final core::int #this) → <Y extends core::Object? = dynamic>(Y%) → void
+  return <Y extends core::Object? = dynamic>(Y% y) → void => self::S2|test3<self::S2|get#test3::X%, Y%>(#this, y);
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 2538568..0bc79fa 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -77,6 +77,7 @@
 general/issue41210a: TypeCheckError
 general/issue41210b/issue41210.no_link: TypeCheckError
 general/issue41210b/issue41210: TypeCheckError
+general/issue45204: TypeCheckError
 general/micro: RuntimeError
 general/mixin_application_override: TypeCheckError
 general/mixin_constructors_with_default_values: RuntimeError
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 31f6de1..58f937f 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -81,6 +81,7 @@
 general/issue41210a: TypeCheckError
 general/issue41210b/issue41210.no_link: TypeCheckError
 general/issue41210b/issue41210: TypeCheckError
+general/issue45204: TypeCheckError
 general/micro: RuntimeError
 general/mixin_application_override: ExpectationFileMismatch # Too many errors.
 general/mixin_application_override: TypeCheckError
diff --git a/pkg/kernel/lib/verifier.dart b/pkg/kernel/lib/verifier.dart
index 8cbf77b..4ecf6ce 100644
--- a/pkg/kernel/lib/verifier.dart
+++ b/pkg/kernel/lib/verifier.dart
@@ -459,6 +459,7 @@
   }
 
   visitLet(Let node) {
+    if (_isCompileTimeErrorEncoding(node)) return;
     visitWithLocalScope(node);
   }
 
@@ -921,6 +922,12 @@
   }
 
   @override
+  void visitLet(Let node) {
+    if (_isCompileTimeErrorEncoding(node)) return;
+    super.visitLet(node);
+  }
+
+  @override
   void defaultExpression(Expression node) {
     try {
       node.getStaticType(_staticTypeContext);
@@ -961,3 +968,7 @@
 void checkInitializers(Constructor constructor) {
   // TODO(ahe): I'll add more here in other CLs.
 }
+
+bool _isCompileTimeErrorEncoding(TreeNode? node) {
+  return node is Let && node.variable.initializer is InvalidExpression;
+}
diff --git a/tools/VERSION b/tools/VERSION
index f036980..08ea31a 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 137
+PRERELEASE 138
 PRERELEASE_PATCH 0
\ No newline at end of file