beginCompilationUnit(void)
  beginMetadataStar(void)
  endMetadataStar(0)
  beginTopLevelMember(void)
    beginTopLevelMethod(, null, null)
      handleVoidKeyword(void)
      handleIdentifier(foo, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginIfStatement(if)
          handleIdentifier(obj, expression)
          handleNoTypeArguments(case)
          handleNoArguments(case)
          handleSend(obj, obj)
          beginPattern(case)
            handleIdentifier(longFieldName, namedRecordFieldReference)
            beginPattern(:)
              beginConstantPattern(const)
                beginParenthesizedExpressionOrRecordLiteral(()
                  handleIdentifier(first, namedRecordFieldReference)
                  handleLiteralInt(1)
                  handleNamedRecordField(:)
                  handleIdentifier(second, namedRecordFieldReference)
                  handleLiteralInt(2)
                  handleNamedRecordField(:)
                endRecordLiteral((, 2, null)
              endConstantPattern(const)
            endPattern())
            handlePatternField(:)
            handleRecordPattern((, 1)
          endPattern())
          handleParenthesizedCondition((, case, null)
          beginThenStatement({)
            beginBlock({, BlockKind(statement))
              handleEmptyStatement(;)
            endBlock(1, {, }, BlockKind(statement))
          endThenStatement({, })
        endIfStatement(if, null, })
        beginIfStatement(if)
          handleIdentifier(obj, expression)
          handleNoTypeArguments(case)
          handleNoArguments(case)
          handleSend(obj, obj)
          beginPattern(case)
            beginConstantPattern(const)
              beginParenthesizedExpressionOrRecordLiteral(()
                handleIdentifier(element, expression)
                handleNoTypeArguments(,)
                handleNoArguments(,)
                handleSend(element, element)
                handleIdentifier(element, expression)
                handleNoTypeArguments(,)
                handleNoArguments(,)
                handleSend(element, element)
                handleIdentifier(element, expression)
                handleNoTypeArguments(,)
                handleNoArguments(,)
                handleSend(element, element)
                handleIdentifier(element, expression)
                handleNoTypeArguments())
                handleNoArguments())
                handleSend(element, element)
              endRecordLiteral((, 4, null)
            endConstantPattern(const)
          endPattern())
          handleParenthesizedCondition((, case, null)
          beginThenStatement({)
            beginBlock({, BlockKind(statement))
              handleEmptyStatement(;)
            endBlock(1, {, }, BlockKind(statement))
          endThenStatement({, })
        endIfStatement(if, null, })
        beginIfStatement(if)
          handleIdentifier(obj, expression)
          handleNoTypeArguments(case)
          handleNoArguments(case)
          handleSend(obj, obj)
          beginPattern(case)
            handleNoTypeArguments(()
            handleIdentifier(longFieldName, namedArgumentReference)
            beginPattern(:)
              beginConstantPattern(const)
                beginParenthesizedExpressionOrRecordLiteral(()
                  handleIdentifier(first, namedRecordFieldReference)
                  handleLiteralInt(1)
                  handleNamedRecordField(:)
                  handleIdentifier(second, namedRecordFieldReference)
                  handleLiteralInt(2)
                  handleNamedRecordField(:)
                endRecordLiteral((, 2, null)
              endConstantPattern(const)
            endPattern())
            handlePatternField(:)
            handleObjectPatternFields(1, (, ))
            handleObjectPattern(Foo, null, null)
          endPattern())
          handleParenthesizedCondition((, case, null)
          beginThenStatement({)
            beginBlock({, BlockKind(statement))
              handleEmptyStatement(;)
            endBlock(1, {, }, BlockKind(statement))
          endThenStatement({, })
        endIfStatement(if, null, })
      endBlockFunctionBody(3, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration(})
endCompilationUnit(1, )
