beginCompilationUnit(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrMixinOrNamedMixinApplicationPrelude(class)
    handleIdentifier(Class, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(class, null, null, null, null, null, null, null, null, Class)
      handleNoType(Class)
      handleClassExtends(null, 1)
      handleClassNoWithClause()
      handleImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
        beginMetadataStar(dynamic)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, {)
            handleIdentifier(dynamic, typeReference)
            handleNoTypeArguments(field)
            handleType(dynamic, null)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endClassFields(null, null, null, null, null, null, null, 1, dynamic, ;)
        endMember()
        beginMetadataStar(Class)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, null, null, null, null, null, null, Class, Class)
            handleNoType(;)
            handleIdentifier(Class, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(this)
              endMetadataStar(0)
              beginFormalParameter(this, MemberKind.NonStaticMethod, null, null, null)
                handleNoType(()
                handleIdentifier(field, fieldInitializer)
                handleFormalParameterWithoutValue())
              endFormalParameter(this, null, ., field, null, null, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod)
            endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleEmptyFunctionBody(;)
          endClassConstructor(null, Class, (, null, ;)
        endMember()
      endClassOrMixinOrExtensionBody(DeclarationKind.Class, 2, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration(})
  beginMetadataStar(test)
  endMetadataStar(0)
  beginTopLevelMember(test)
    beginTopLevelMethod(}, null, null)
      handleNoType(})
      handleIdentifier(test, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
        beginMetadataStar(a)
        endMetadataStar(0)
        beginFormalParameter(a, MemberKind.TopLevelMethod, null, null, null)
          handleNoType(()
          handleIdentifier(a, formalParameterDeclaration)
          handleFormalParameterWithoutValue())
        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginSwitchStatement(switch)
          handleIdentifier(a, expression)
          handleNoTypeArguments())
          handleNoArguments())
          handleSend(a, a)
          handleParenthesizedCondition((, null, null)
          beginSwitchBlock({)
            beginCaseExpression(case)
              beginPattern(case)
                handleIdentifier(foo, namedRecordFieldReference)
                beginPattern(:)
                  handleIdentifier(int, typeReference)
                  handleNoTypeArguments(b)
                  handleType(int, null)
                  handleDeclaredVariablePattern(null, b, false)
                endPattern(b)
                handlePatternField(:)
                handleRecordPattern((, 1)
              endPattern())
              beginSwitchCaseWhenClause(when)
                handleIdentifier(b, expression)
                handleNoTypeArguments(!=)
                handleNoArguments(!=)
                handleSend(b, b)
                beginBinaryExpression(!=)
                  handleLiteralInt(2)
                endBinaryExpression(!=, 2)
              endSwitchCaseWhenClause(2)
            endCaseExpression(case, when, :)
            beginSwitchCase(0, 1, case)
              handleIdentifier(print, expression)
              handleNoTypeArguments(()
              beginArguments(()
                handleIdentifier(b, expression)
                handleNoTypeArguments())
                handleNoArguments())
                handleSend(b, b)
              endArguments(1, (, ))
              handleSend(print, ))
              handleExpressionStatement(print, ;)
            endSwitchCase(0, 1, null, null, 1, case, ;)
            beginCaseExpression(case)
              beginPattern(case)
                handleIdentifier(foo, namedRecordFieldReference)
                beginPattern(:)
                  beginRecordType(()
                    beginRecordTypeEntry()
                      beginMetadataStar(int)
                      endMetadataStar(0)
                      handleIdentifier(int, typeReference)
                      handleNoTypeArguments(,)
                      handleType(int, null)
                      handleNoName(,)
                    endRecordTypeEntry()
                    beginRecordTypeEntry()
                      beginMetadataStar(int)
                      endMetadataStar(0)
                      handleIdentifier(int, typeReference)
                      handleNoTypeArguments())
                      handleType(int, null)
                      handleNoName())
                    endRecordTypeEntry()
                  endRecordType((, null, 2, false)
                  handleDeclaredVariablePattern(null, b, false)
                endPattern(b)
                handlePatternField(:)
                handleRecordPattern((, 1)
              endPattern())
              beginSwitchCaseWhenClause(when)
                handleIdentifier(b, expression)
                handleNoTypeArguments(!=)
                handleNoArguments(!=)
                handleSend(b, b)
                beginBinaryExpression(!=)
                  beginParenthesizedExpressionOrRecordLiteral(()
                    handleLiteralInt(2)
                    handleLiteralInt(3)
                  endRecordLiteral((, 2, null)
                endBinaryExpression(!=, ))
              endSwitchCaseWhenClause())
            endCaseExpression(case, when, :)
            beginSwitchCase(0, 1, case)
              handleIdentifier(print, expression)
              handleNoTypeArguments(()
              beginArguments(()
                handleIdentifier(b, expression)
                handleNoTypeArguments())
                handleNoArguments())
                handleSend(b, b)
              endArguments(1, (, ))
              handleSend(print, ))
              handleExpressionStatement(print, ;)
            endSwitchCase(0, 1, null, null, 1, case, ;)
            beginCaseExpression(case)
              beginPattern(case)
                handleNoTypeArguments(()
                handleIdentifier(field, namedArgumentReference)
                beginPattern(:)
                  handleIdentifier(int, typeReference)
                  handleNoTypeArguments(b)
                  handleType(int, null)
                  handleDeclaredVariablePattern(null, b, false)
                endPattern(b)
                handlePatternField(:)
                handleObjectPatternFields(1, (, ))
                handleObjectPattern(Class, null, null)
              endPattern())
              beginSwitchCaseWhenClause(when)
                handleIdentifier(b, expression)
                handleNoTypeArguments(!=)
                handleNoArguments(!=)
                handleSend(b, b)
                beginBinaryExpression(!=)
                  handleLiteralInt(2)
                endBinaryExpression(!=, 2)
              endSwitchCaseWhenClause(2)
            endCaseExpression(case, when, :)
            beginSwitchCase(0, 1, case)
              handleIdentifier(print, expression)
              handleNoTypeArguments(()
              beginArguments(()
                handleIdentifier(b, expression)
                handleNoTypeArguments())
                handleNoArguments())
                handleSend(b, b)
              endArguments(1, (, ))
              handleSend(print, ))
              handleExpressionStatement(print, ;)
            endSwitchCase(0, 1, null, null, 1, case, ;)
            beginCaseExpression(case)
              beginPattern(case)
                handleNoTypeArguments(()
                handleIdentifier(field, namedArgumentReference)
                beginPattern(:)
                  beginRecordType(()
                    beginRecordTypeEntry()
                      beginMetadataStar(int)
                      endMetadataStar(0)
                      handleIdentifier(int, typeReference)
                      handleNoTypeArguments(,)
                      handleType(int, null)
                      handleNoName(,)
                    endRecordTypeEntry()
                    beginRecordTypeEntry()
                      beginMetadataStar(int)
                      endMetadataStar(0)
                      handleIdentifier(int, typeReference)
                      handleNoTypeArguments())
                      handleType(int, null)
                      handleNoName())
                    endRecordTypeEntry()
                  endRecordType((, null, 2, false)
                  handleDeclaredVariablePattern(null, b, false)
                endPattern(b)
                handlePatternField(:)
                handleObjectPatternFields(1, (, ))
                handleObjectPattern(Class, null, null)
              endPattern())
              beginSwitchCaseWhenClause(when)
                handleIdentifier(b, expression)
                handleNoTypeArguments(!=)
                handleNoArguments(!=)
                handleSend(b, b)
                beginBinaryExpression(!=)
                  beginParenthesizedExpressionOrRecordLiteral(()
                    handleLiteralInt(2)
                    handleLiteralInt(3)
                  endRecordLiteral((, 2, null)
                endBinaryExpression(!=, ))
              endSwitchCaseWhenClause())
            endCaseExpression(case, when, :)
            beginSwitchCase(0, 1, case)
              handleIdentifier(print, expression)
              handleNoTypeArguments(()
              beginArguments(()
                handleIdentifier(b, expression)
                handleNoTypeArguments())
                handleNoArguments())
                handleSend(b, b)
              endArguments(1, (, ))
              handleSend(print, ))
              handleExpressionStatement(print, ;)
            endSwitchCase(0, 1, null, null, 1, case, ;)
          endSwitchBlock(4, {, })
        endSwitchStatement(switch, })
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(test, null, })
  endTopLevelDeclaration(})
  beginMetadataStar(testNullable)
  endMetadataStar(0)
  beginTopLevelMember(testNullable)
    beginTopLevelMethod(}, null, null)
      handleNoType(})
      handleIdentifier(testNullable, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
        beginMetadataStar(a)
        endMetadataStar(0)
        beginFormalParameter(a, MemberKind.TopLevelMethod, null, null, null)
          handleNoType(()
          handleIdentifier(a, formalParameterDeclaration)
          handleFormalParameterWithoutValue())
        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginSwitchStatement(switch)
          handleIdentifier(a, expression)
          handleNoTypeArguments())
          handleNoArguments())
          handleSend(a, a)
          handleParenthesizedCondition((, null, null)
          beginSwitchBlock({)
            beginCaseExpression(case)
              beginPattern(case)
                handleIdentifier(foo, namedRecordFieldReference)
                beginPattern(:)
                  beginRecordType(()
                    beginRecordTypeEntry()
                      beginMetadataStar(int)
                      endMetadataStar(0)
                      handleIdentifier(int, typeReference)
                      handleNoTypeArguments(,)
                      handleType(int, null)
                      handleNoName(,)
                    endRecordTypeEntry()
                    beginRecordTypeEntry()
                      beginMetadataStar(int)
                      endMetadataStar(0)
                      handleIdentifier(int, typeReference)
                      handleNoTypeArguments())
                      handleType(int, null)
                      handleNoName())
                    endRecordTypeEntry()
                  endRecordType((, ?, 2, false)
                  handleDeclaredVariablePattern(null, b, false)
                endPattern(b)
                handlePatternField(:)
                handleRecordPattern((, 1)
              endPattern())
              beginSwitchCaseWhenClause(when)
                handleIdentifier(b, expression)
                handleNoTypeArguments(!=)
                handleNoArguments(!=)
                handleSend(b, b)
                beginBinaryExpression(!=)
                  beginParenthesizedExpressionOrRecordLiteral(()
                    handleLiteralInt(2)
                    handleLiteralInt(3)
                  endRecordLiteral((, 2, null)
                endBinaryExpression(!=, ))
              endSwitchCaseWhenClause())
            endCaseExpression(case, when, :)
            beginSwitchCase(0, 1, case)
              handleIdentifier(print, expression)
              handleNoTypeArguments(()
              beginArguments(()
                handleIdentifier(b, expression)
                handleNoTypeArguments())
                handleNoArguments())
                handleSend(b, b)
              endArguments(1, (, ))
              handleSend(print, ))
              handleExpressionStatement(print, ;)
            endSwitchCase(0, 1, null, null, 1, case, ;)
            beginCaseExpression(case)
              beginPattern(case)
                handleNoTypeArguments(()
                handleIdentifier(field, namedArgumentReference)
                beginPattern(:)
                  beginRecordType(()
                    beginRecordTypeEntry()
                      beginMetadataStar(int)
                      endMetadataStar(0)
                      handleIdentifier(int, typeReference)
                      handleNoTypeArguments(,)
                      handleType(int, null)
                      handleNoName(,)
                    endRecordTypeEntry()
                    beginRecordTypeEntry()
                      beginMetadataStar(int)
                      endMetadataStar(0)
                      handleIdentifier(int, typeReference)
                      handleNoTypeArguments())
                      handleType(int, null)
                      handleNoName())
                    endRecordTypeEntry()
                  endRecordType((, ?, 2, false)
                  handleDeclaredVariablePattern(null, b, false)
                endPattern(b)
                handlePatternField(:)
                handleObjectPatternFields(1, (, ))
                handleObjectPattern(Class, null, null)
              endPattern())
              beginSwitchCaseWhenClause(when)
                handleIdentifier(b, expression)
                handleNoTypeArguments(!=)
                handleNoArguments(!=)
                handleSend(b, b)
                beginBinaryExpression(!=)
                  beginParenthesizedExpressionOrRecordLiteral(()
                    handleLiteralInt(2)
                    handleLiteralInt(3)
                  endRecordLiteral((, 2, null)
                endBinaryExpression(!=, ))
              endSwitchCaseWhenClause())
            endCaseExpression(case, when, :)
            beginSwitchCase(0, 1, case)
              handleIdentifier(print, expression)
              handleNoTypeArguments(()
              beginArguments(()
                handleIdentifier(b, expression)
                handleNoTypeArguments())
                handleNoArguments())
                handleSend(b, b)
              endArguments(1, (, ))
              handleSend(print, ))
              handleExpressionStatement(print, ;)
            endSwitchCase(0, 1, null, null, 1, case, ;)
          endSwitchBlock(2, {, })
        endSwitchStatement(switch, })
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(testNullable, null, })
  endTopLevelDeclaration(})
endCompilationUnit(3, )
