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({)
        beginMetadataStar(dynamic)
        endMetadataStar(0)
        handleIdentifier(dynamic, typeReference)
        handleNoTypeArguments(i)
        handleType(dynamic, null)
        beginVariablesDeclaration(i, null, null)
          handleIdentifier(i, localVariableDeclaration)
          beginInitializedIdentifier(i)
            beginVariableInitializer(=)
              handleLiteralInt(10)
            endVariableInitializer(=)
          endInitializedIdentifier(i)
        endVariablesDeclaration(1, ;)
        handleIdentifier(print, expression)
        handleNoTypeArguments(()
        beginArguments(()
          beginLiteralString(')
            handleIdentifier(i, expression)
            handleNoTypeArguments(as)
            handleNoArguments(as)
            handleSend(i, as)
            beginAsOperatorType(as)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(?)
              handleType(int, ?)
            endAsOperatorType(as)
            handleAsOperator(as)
            handleInterpolationExpression(${, })
            handleStringPart(')
          endLiteralString(1, ))
        endArguments(1, (, ))
        handleSend(print, ;)
        handleExpressionStatement(;)
        handleIdentifier(print, expression)
        handleNoTypeArguments(()
        beginArguments(()
          beginLiteralString(')
            handleIdentifier(i, expression)
            handleNoTypeArguments(is)
            handleNoArguments(is)
            handleSend(i, is)
            beginIsOperatorType(is)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(?)
              handleType(int, ?)
            endIsOperatorType(is)
            handleIsOperator(is, null)
            handleInterpolationExpression(${, })
            handleStringPart(')
          endLiteralString(1, ))
        endArguments(1, (, ))
        handleSend(print, ;)
        handleExpressionStatement(;)
      endBlockFunctionBody(3, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration()
endCompilationUnit(1, )
