Problems reported:

parser/patterns/assignedVariable_namedAs:3:4: A variable assigned by a pattern assignment can't be named 'as'.
  (as) = x;
   ^^

beginCompilationUnit(void)
  beginMetadataStar(void)
  endMetadataStar(0)
  beginTopLevelMember(void)
    beginTopLevelMethod(, null, null)
      handleVoidKeyword(void)
      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({)
        beginMetadataStar(dynamic)
        endMetadataStar(0)
        handleIdentifier(dynamic, typeReference)
        handleNoTypeArguments(as)
        handleType(dynamic, null)
        beginVariablesDeclaration(as, null, null)
          handleIdentifier(as, localVariableDeclaration)
          beginInitializedIdentifier(as)
            handleNoVariableInitializer(as)
          endInitializedIdentifier(as)
        endVariablesDeclaration(1, ;)
        beginPattern(;)
          beginPattern(()
            handleRecoverableError(Message[IllegalPatternAssignmentVariableName, A variable assigned by a pattern assignment can't be named 'as'., Choose a different name., {lexeme: as}], as, as)
            handleAssignedVariablePattern(as)
          endPattern(as)
          handleParenthesizedPattern(()
        endPattern())
        handleIdentifier(x, expression)
        handleNoTypeArguments(;)
        handleNoArguments(;)
        handleSend(x, x)
        handlePatternAssignment(=)
        handleExpressionStatement((, ;)
      endBlockFunctionBody(2, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration(})
endCompilationUnit(1, )
