beginCompilationUnit(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrMixinOrNamedMixinApplicationPrelude(class)
    handleIdentifier(C, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(class, null, null, null, null, null, null, null, null, C)
      handleNoType(C)
      handleClassExtends(null, 1)
      handleClassNoWithClause()
      handleImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, {)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(?)
            handleType(int, ?)
            handleIdentifier(f, fieldDeclaration)
            handleNoFieldInitializer(;)
          endClassFields(null, null, null, null, null, null, null, 1, int, ;)
        endMember()
      endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration(})
  beginMetadataStar(test)
  endMetadataStar(0)
  beginTopLevelMember(test)
    beginTopLevelMethod(}, null, null)
      handleNoType(})
      handleIdentifier(test, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
        beginMetadataStar(dynamic)
        endMetadataStar(0)
        beginFormalParameter(dynamic, MemberKind.TopLevelMethod, null, null, null)
          handleIdentifier(dynamic, typeReference)
          handleNoTypeArguments(x)
          handleType(dynamic, null)
          handleIdentifier(x, formalParameterDeclaration)
          handleFormalParameterWithoutValue())
        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginSwitchStatement(switch)
          handleIdentifier(x, expression)
          handleNoTypeArguments())
          handleNoArguments())
          handleSend(x, ))
          handleParenthesizedCondition((, null, null)
          beginSwitchBlock({)
            beginCaseExpression(case)
              beginPattern(case)
                handleNoTypeArguments(()
                handleNoName(()
                beginPattern(:)
                  handleNoType(var)
                  handleDeclaredVariablePattern(var, f, false)
                  handleNullCheckPattern(?)
                endPattern(?)
                handlePatternField(:)
                handleObjectPatternFields(1, (, ))
                handleObjectPattern(C, null, null)
              endPattern())
              handleSwitchCaseNoWhenClause())
            endCaseExpression(case, null, :)
            beginSwitchCase(0, 1, case)
              handleBreakStatement(false, break, ;)
            endSwitchCase(0, 1, null, null, 1, case, ;)
          endSwitchBlock(1, {, })
        endSwitchStatement(switch, })
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(test, null, })
  endTopLevelDeclaration(})
endCompilationUnit(2, )
