beginCompilationUnit(main)
  beginMetadataStar(main)
  endMetadataStar(0)
  beginTopLevelMember(main)
    beginTopLevelMethod(, null, null)
      handleNoType()
      handleIdentifier(main, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginForStatement(for)
          beginMetadataStar(int)
          endMetadataStar(0)
          handleIdentifier(int, typeReference)
          handleNoTypeArguments(i)
          handleType(int, null)
          beginVariablesDeclaration(i, null, null)
            handleIdentifier(i, localVariableDeclaration)
            beginInitializedIdentifier(i)
              beginVariableInitializer(=)
                handleLiteralInt(0)
              endVariableInitializer(=)
            endInitializedIdentifier(i)
          endVariablesDeclaration(1, null)
          handleForInitializerLocalVariableDeclaration(0, false)
          handleIdentifier(i, expression)
          handleNoTypeArguments(<)
          handleNoArguments(<)
          handleSend(i, <)
          beginBinaryExpression(<)
            handleLiteralInt(10)
          endBinaryExpression(<, 10)
          handleExpressionStatement(i, ;)
          handleIdentifier(i, expression)
          handleNoTypeArguments(++)
          handleNoArguments(++)
          handleSend(i, ++)
          handleUnaryPostfixAssignmentExpression(++)
          handleForLoopParts(for, (, ;, ;, 1)
          beginForStatementBody({)
            beginBlock({, BlockKind(statement))
            endBlock(0, {, }, BlockKind(statement))
          endForStatementBody(})
        endForStatement(})
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(main, null, })
  endTopLevelDeclaration(})
endCompilationUnit(1, )
