beginCompilationUnit(main)
  beginMetadataStar(main)
  endMetadataStar(0)
  beginTopLevelMember(main)
    beginTopLevelMethod(, null)
      handleNoType()
      handleIdentifier(main, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginSwitchStatement(switch)
          handleIdentifier(a, expression)
          handleNoTypeArguments())
          handleNoArguments())
          handleSend(a, ))
          handleParenthesizedCondition(()
          beginSwitchBlock({)
            beginCaseExpression(case)
              handleIdentifier(x, expression)
              handleNoTypeArguments(?)
              handleNoArguments(?)
              handleSend(x, ?)
              handleLiteralInt(4)
              handleIndexedExpression(?, [, ])
            endCaseExpression(:)
            handleCaseMatch(case, :)
            beginSwitchCase(0, 1, case)
              beginBlock({, BlockKind(statement))
                beginBlock({, BlockKind(statement))
                  beginBlock({, BlockKind(statement))
                    handleLiteralInt(2)
                    handleExpressionStatement(;)
                  endBlock(1, {, }, BlockKind(statement))
                endBlock(1, {, }, BlockKind(statement))
              endBlock(1, {, }, BlockKind(statement))
              handleEmptyStatement(;)
            endSwitchCase(0, 1, null, null, 2, case, })
          endSwitchBlock(1, {, })
        endSwitchStatement(switch, })
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(main, null, })
  endTopLevelDeclaration()
endCompilationUnit(1, )
