Problems reported:

parser/patterns/patternVariableDeclarationStatement_disallowsLate:2:3: A pattern variable declaration may not use the `late` keyword.
  late var (_) = x;
  ^^^^

beginCompilationUnit(f)
  beginMetadataStar(f)
  endMetadataStar(0)
  beginTopLevelMember(f)
    beginTopLevelMethod(, null, null)
      handleNoType()
      handleIdentifier(f, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
        beginMetadataStar(x)
        endMetadataStar(0)
        beginFormalParameter(x, MemberKind.TopLevelMethod, null, null, null)
          handleNoType(()
          handleIdentifier(x, formalParameterDeclaration)
          handleFormalParameterWithoutValue())
        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        handleRecoverableError(LatePatternVariableDeclaration, late, late)
        beginMetadataStar(late)
        endMetadataStar(0)
        beginPattern(var)
          beginPattern(()
            handleNoType(_)
            handleWildcardPattern(null, _)
          endPattern(_)
          handleParenthesizedPattern(()
        endPattern())
        handleIdentifier(x, expression)
        handleNoTypeArguments(;)
        handleNoArguments(;)
        handleSend(x, x)
        handlePatternVariableDeclarationStatement(var, =, ;)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(f, null, })
  endTopLevelDeclaration(})
endCompilationUnit(1, )
