beginCompilationUnit(void)
  beginMetadataStar(void)
  endMetadataStar(0)
  beginTopLevelMember(void)
    beginTopLevelMethod(, null)
      handleVoidKeyword(void)
      handleIdentifier(f, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
        beginMetadataStar(dynamic)
        endMetadataStar(0)
        beginFormalParameter(dynamic, MemberKind.TopLevelMethod, null, null, null)
          handleIdentifier(dynamic, typeReference)
          handleNoTypeArguments(sample)
          handleType(dynamic, null)
          handleIdentifier(sample, formalParameterDeclaration)
          handleFormalParameterWithoutValue())
        endFormalParameter(null, null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginIfStatement(if)
          handleIdentifier(sample, expression)
          handleNoTypeArguments(.)
          handleNoArguments(.)
          handleSend(sample, .)
          handleIdentifier(value, expressionContinuation)
          handleNoTypeArguments(!)
          handleNoArguments(!)
          handleSend(value, !)
          handleEndingBinaryExpression(.)
          handleNonNullAssertExpression(!)
          handleParenthesizedExpression(()
          beginBinaryExpression(<)
            handleLiteralInt(10)
          endBinaryExpression(<)
          handleParenthesizedCondition(()
          beginThenStatement({)
            beginBlock({, BlockKind(statement))
              handleIdentifier(print, expression)
              handleNoTypeArguments(()
              beginArguments(()
                beginLiteralString('thing!')
                endLiteralString(0, ))
              endArguments(1, (, ))
              handleSend(print, ;)
              handleExpressionStatement(;)
            endBlock(1, {, }, BlockKind(statement))
          endThenStatement(})
        endIfStatement(if, null)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration()
endCompilationUnit(1, )
