beginCompilationUnit(void)
  beginMetadataStar(void)
  endMetadataStar(0)
  beginTopLevelMember(void)
    beginTopLevelMethod(, null, null)
      handleVoidKeyword(void)
      handleIdentifier(main, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginTryStatement(try)
          beginBlock({, BlockKind(try statement))
            handleEmptyStatement(;)
          endBlock(1, {, }, BlockKind(try statement))
          beginCatchClause(catch)
            beginFormalParameters((, MemberKind.Catch)
              beginMetadataStar(e)
              endMetadataStar(0)
              beginFormalParameter(e, MemberKind.Catch, null, null, null)
                handleNoType(()
                handleIdentifier(e, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, null, e, null, null, FormalParameterKind.requiredPositional, MemberKind.Catch)
            endFormalParameters(1, (, ), MemberKind.Catch)
          endCatchClause({)
          beginBlock({, BlockKind(catch clause))
            handleEmptyStatement(;)
          endBlock(1, {, }, BlockKind(catch clause))
          handleCatchBlock(null, catch, null)
          beginCatchClause(on)
            handleIdentifier(Foo, typeReference)
            handleNoTypeArguments({)
            handleType(Foo, null)
          endCatchClause({)
          beginBlock({, BlockKind(catch clause))
            handleEmptyStatement(;)
          endBlock(1, {, }, BlockKind(catch clause))
          handleCatchBlock(on, null, null)
        endTryStatement(2, try, null)
        beginMetadataStar(onX)
        endMetadataStar(0)
        handleNoTypeVariables(()
        beginLocalFunctionDeclaration(onX)
          handleNoType(})
          beginFunctionName(onX)
            handleIdentifier(onX, localFunctionDeclaration)
          endFunctionName(onX, ()
          beginFormalParameters((, MemberKind.Local)
            beginMetadataStar(e)
            endMetadataStar(0)
            beginFormalParameter(e, MemberKind.Local, null, null, null)
              handleNoType(()
              handleIdentifier(e, formalParameterDeclaration)
              handleFormalParameterWithoutValue())
            endFormalParameter(null, null, null, e, null, null, FormalParameterKind.requiredPositional, MemberKind.Local)
          endFormalParameters(1, (, ), MemberKind.Local)
          handleNoInitializers()
          handleAsyncModifier(null, null)
          beginBlockFunctionBody({)
            handleEmptyStatement(;)
          endBlockFunctionBody(1, {, })
        endLocalFunctionDeclaration(})
        handleIdentifier(onX, expression)
        handleNoTypeArguments(()
        beginArguments(()
          beginLiteralString("")
          endLiteralString(0, ))
        endArguments(1, (, ))
        handleSend(onX, ;)
        handleExpressionStatement(;)
      endBlockFunctionBody(3, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration()
endCompilationUnit(1, )
