beginCompilationUnit(f)
  beginMetadataStar(f)
  endMetadataStar(0)
  beginTopLevelMember(f)
    beginTopLevelMethod(, null, null)
      handleNoType()
      handleIdentifier(f, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
        beginMetadataStar(x)
        endMetadataStar(0)
        beginFormalParameter(x, MemberKind.TopLevelMethod, null, null, null)
          handleNoType(()
          handleIdentifier(x, formalParameterDeclaration)
          handleFormalParameterWithoutValue())
        endFormalParameter(null, null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginSwitchExpression(switch)
        handleIdentifier(x, expression)
        handleSendWithoutArguments(x, x, ))
        handleParenthesizedCondition((, null, null)
        beginSwitchExpressionBlock({)
          beginSwitchExpressionCase()
            beginPattern({)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(_)
              handleType(int, null)
              handleWildcardPattern(null, _)
            endPattern(_)
            handleSwitchExpressionCasePattern(_)
            handleLiteralInt(0)
          endSwitchExpressionCase(int, null, =>, 0)
          beginSwitchExpressionCase()
            beginPattern(,)
              handleNoType(_)
              handleWildcardPattern(null, _)
            endPattern(_)
            handleSwitchExpressionCasePattern(_)
            handleLiteralInt(1)
          endSwitchExpressionCase(_, null, =>, 1)
        endSwitchExpressionBlock(2, {, })
      endSwitchExpression(switch, })
      handleExpressionFunctionBody(=>, ;)
    endTopLevelMethod(f, null, ;)
  endTopLevelDeclaration(;)
endCompilationUnit(1, )
