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(var)
        endMetadataStar(0)
        beginPattern(var)
          beginPattern(()
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(x)
            handleType(int, null)
            handleDeclaredVariablePattern(null, x, false)
          endPattern(x)
          handlePatternField(null)
          beginPattern(,)
            beginRecordType(()
              beginRecordTypeEntry()
                beginMetadataStar(int)
                endMetadataStar(0)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(,)
                handleType(int, null)
                handleNoName(,)
              endRecordTypeEntry()
            endRecordType((, ?, 1, false)
            handleDeclaredVariablePattern(null, y, false)
          endPattern(y)
          handlePatternField(null)
          handleRecordPattern((, 2)
        endPattern())
        beginSwitchExpression(switch)
          handleIdentifier(foo, expression)
          handleNoTypeArguments())
          handleNoArguments())
          handleSend(foo, foo)
          handleParenthesizedCondition((, null, null)
          beginSwitchExpressionBlock({)
            beginSwitchExpressionCase()
              beginPattern({)
                handleNoType(_)
                handleWildcardPattern(null, _)
              endPattern(_)
              handleSwitchExpressionCasePattern(_)
              beginParenthesizedExpressionOrRecordLiteral(()
                handleLiteralInt(42)
                handleLiteralNull(null)
              endRecordLiteral((, 2, null)
            endSwitchExpressionCase(_, null, =>, ))
          endSwitchExpressionBlock(1, {, })
        endSwitchExpression(switch, })
        handlePatternVariableDeclarationStatement(var, =, ;)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration(})
endCompilationUnit(1, )
