beginCompilationUnit(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrNamedMixinApplicationPrelude(class)
    handleIdentifier(Foo, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(class, null, Foo)
      handleNoType(Foo)
      handleClassExtends(null, 1)
      handleClassNoWithClause()
      handleClassOrMixinImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinBody(DeclarationKind.Class, {)
        beginMetadataStar(bool)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, operator)
            handleIdentifier(bool, typeReference)
            handleNoTypeArguments(operator)
            handleType(bool, null)
            handleOperatorName(operator, <)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginReturnStatement(return)
                handleLiteralBool(true)
              endReturnStatement(true, return, ;)
            endBlockFunctionBody(1, {, })
          endClassMethod(null, bool, (, null, })
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, operator)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(operator)
            handleType(int, null)
            handleOperatorName(operator, <<)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginReturnStatement(return)
                handleLiteralInt(42)
              endReturnStatement(true, return, ;)
            endBlockFunctionBody(1, {, })
          endClassMethod(null, int, (, null, })
        endMember()
        beginMetadataStar(bool)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, operator)
            handleIdentifier(bool, typeReference)
            handleNoTypeArguments(operator)
            handleType(bool, null)
            handleOperatorName(operator, >)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginReturnStatement(return)
                handleLiteralBool(true)
              endReturnStatement(true, return, ;)
            endBlockFunctionBody(1, {, })
          endClassMethod(null, bool, (, null, })
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, operator)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(operator)
            handleType(int, null)
            handleOperatorName(operator, >>)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginReturnStatement(return)
                handleLiteralInt(42)
              endReturnStatement(true, return, ;)
            endBlockFunctionBody(1, {, })
          endClassMethod(null, int, (, null, })
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, operator)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(operator)
            handleType(int, null)
            handleOperatorName(operator, >>>)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginReturnStatement(return)
                handleLiteralInt(42)
              endReturnStatement(true, return, ;)
            endBlockFunctionBody(1, {, })
          endClassMethod(null, int, (, null, })
        endMember()
      endClassOrMixinBody(DeclarationKind.Class, 5, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration()
endCompilationUnit(1, )
