def __init__( self, perFileSettings ):
     iterateapi.IterateAPI.__init__( self )
     self._code = GrowCode()
     self._namespace = []
     self.inClass = []
     self._protectionIgnoring = protectionignoring.ProtectionIgnoring()
     self._voodoomocks = []
     self._chainCache = None
     self._perFileSettings = perFileSettings
 def __init__( self, perFileSettings ):
     iterateapi.IterateAPI.__init__( self )
     self._code = GrowCode()
     self._namespace = []
     self.inClass = []
     self._protectionIgnoring = protectionignoring.ProtectionIgnoring()
     self._voodoomocks = []
     self._chainCache = None
     self._perFileSettings = perFileSettings
class VoodooIterator( iterateapi.IterateAPI ):
    def __init__( self, perFileSettings ):
        iterateapi.IterateAPI.__init__( self )
        self._code = GrowCode()
        self._namespace = []
        self.inClass = []
        self._protectionIgnoring = protectionignoring.ProtectionIgnoring()
        self._voodoomocks = []
        self._chainCache = None
        self._perFileSettings = perFileSettings

    def out( self ):
        return self._code.result()

    def code( self ):
        return self._code

    def protectionIgnoring( self ):
        return self._protectionIgnoring

    def fullIdentifier( self , identifier ):
        return "::".join( self._namespace + self.inClass + [ identifier ] )

    def structForwardDeclaration( self, name ):
        if self._protectionIgnoring.ignore():
            return
        if name in self._perFileSettings.SKIP:
            return
        self._code.lineOut( "struct " + name + ";" )
        self._code.lineOut( "" )

    def variableDeclaration( self, name, text ):
        if self._protectionIgnoring.ignore():
            return
        if name in self._perFileSettings.SKIP:
            return
        self._textOut( text )

    def typedef( self, name, text ):
        if self._protectionIgnoring.ignore():
            return
        if name in self._perFileSettings.SKIP:
            return
        self._textOut( text )

    def union( self, name, text ):
        if self._protectionIgnoring.ignore():
            return
        if name in self._perFileSettings.SKIP:
            return
        self._textOut( text )

    def enum( self, name, text ):
        if self._protectionIgnoring.ignore():
            return
        if name in self._perFileSettings.SKIP:
            return
        self._textOut( text )

    def fieldDeclaration( self, name, text ):
        if self._protectionIgnoring.ignore():
            return
        if name in self._perFileSettings.SKIP:
            return
        self._textOut( text )

    def using( self, text ):
        if self._protectionIgnoring.ignore():
            return
        self._textOut( text )

    def functionForwardDeclaration( self, decomposition ):
        if self._protectionIgnoring.ignore():
            return
        if decomposition.name in self._perFileSettings.SKIP:
            return
        self._function( decomposition )

    def functionDefinition( self, decomposition ):
        if self._protectionIgnoring.ignore():
            return
        if decomposition.name in self._perFileSettings.SKIP:
            return
        self._function( decomposition )

    def constructorDefinition( self, decomposition ):
        if self._protectionIgnoring.ignore():
            return
        mock = self._voodoomocks[ -1 ]
        mock.implementConstructor( decomposition )

    def method( self, decomposition ):
        if self._protectionIgnoring.ignore():
            return
        if decomposition.static:
            self._function( decomposition )
        else:
            mock = self._voodoomocks[ -1 ]
            mock.implementMethod( decomposition )

    def enterStruct( self, name, inheritance, templatePrefix, templateParametersList, fullText ):
        self._enterConstruct( name, inheritance, templatePrefix, templateParametersList, fullText, 'struct', 'public' )
    def leaveStruct( self ):
        self._leaveConstruct()
    def enterClass( self, name, inheritance, templatePrefix, templateParametersList, fullText ):
        self._enterConstruct( name, inheritance, templatePrefix, templateParametersList, fullText, 'class', 'private' )
    def leaveClass( self ):
        self._leaveConstruct()

    def enterNamespace( self, name ):
        if self._protectionIgnoring.ignore():
            return
        self._namespace.append( name )
        self._code.lineOut( "namespace %s" % name )
        self._code.lineOut( "{" )
        self._code.increaseIndent()

    def leaveNamespace( self ):
        if self._protectionIgnoring.ignore():
            return
        self._namespace.pop()
        self._code.decreaseIndent()
        self._code.lineOut( "};" )

    def accessSpec( self, access ):
        if access != 'private':
            self._code.decreaseIndent()
            self._code.lineOut( access + ":" )
            self._code.increaseIndent()
        self._protectionIgnoring.change( access )

    def _textOut( self, text ):
        self._code.lineOut( text + ";" )
        self._code.lineOut( "" )

    def _function( self, decomposition ):
        chain = VoodooChain( decomposition.name, self.fullIdentifier( decomposition.name ), self._code, self._chainCache )
        self._chainCache = chain.cache()
        chain.overload( decomposition )

    def shouldImplementEnterConstruct( self, name, fullText, defaultProtection ):
        if name in self._perFileSettings.NO_MOCK:
            self._code.lineOut( fullText + ";" )
            self._code.lineOut( "" )
            self._protectionIgnoring.enterSkipped()
        elif name in self._perFileSettings.SKIP:
            self._protectionIgnoring.enterSkipped()
        else:
            self._protectionIgnoring.enter( defaultProtection )
        return not self._protectionIgnoring.ignoreButLast()

    def _enterConstruct( self, name, inheritance, templatePrefix, templateParametersList, fullText, construct, defaultProtection ):
        if not self.shouldImplementEnterConstruct( name, fullText, defaultProtection ):
            return
        mock = VoodooMock(  construct = construct,
                            identifier = name,
                            inherits = [ identifier for protection, identifier in inheritance ],
                            fullIdentifier = self.fullIdentifier( name ),
                            code = self._code,
                            perFileSettings = self._perFileSettings,
                            templatePrefix = templatePrefix,
                            templateParametersList = templateParametersList )
        mock.implementRedirectorClassHeader()
        self._voodoomocks.append( mock )
        self.inClass.append( name )

    def shouldImplementLeaveConstruct( self ):
        ignore = self._protectionIgnoring.ignoreButLast()
        self._protectionIgnoring.leave()
        return not ignore

    def _leaveConstruct( self ):
        if not self.shouldImplementLeaveConstruct():
            return
        self.inClass.pop()
        mock = self._voodoomocks.pop()
        mock.implementRedirectorClassFooter()
        mock.implementMockClass()
class VoodooIterator( iterateapi.IterateAPI ):
    def __init__( self, perFileSettings ):
        iterateapi.IterateAPI.__init__( self )
        self._code = GrowCode()
        self._namespace = []
        self.inClass = []
        self._protectionIgnoring = protectionignoring.ProtectionIgnoring()
        self._voodoomocks = []
        self._chainCache = None
        self._perFileSettings = perFileSettings

    def out( self ):
        return self._code.result()

    def code( self ):
        return self._code

    def protectionIgnoring( self ):
        return self._protectionIgnoring

    def fullIdentifier( self , identifier ):
        return "::".join( self._namespace + self.inClass + [ identifier ] )

    def classForwardDeclaration( self, name, templatePrefix ):
        self._forwardDeclaration( name, templatePrefix, "class" )

    def structForwardDeclaration( self, name, templatePrefix ):
        self._forwardDeclaration( name, templatePrefix, "struct" )

    def variableDeclaration( self, name, text ):
        if self._protectionIgnoring.ignore():
            return
        if name in self._perFileSettings.SKIP:
            return
        self._textOut( text )

    def typedef( self, name, text ):
        if self._protectionIgnoring.ignore():
            return
        if name in self._perFileSettings.SKIP:
            return
        self._textOut( text )

    def union( self, name, text ):
        if self._protectionIgnoring.ignore():
            return
        if name in self._perFileSettings.SKIP:
            return
        self._textOut( text )

    def enum( self, name, text ):
        if self._protectionIgnoring.ignore():
            return
        if name in self._perFileSettings.SKIP:
            return
        self._textOut( text )

    def fieldDeclaration( self, name, text ):
        if self._protectionIgnoring.ignore():
            return
        if name in self._perFileSettings.SKIP:
            return
        self._textOut( text )

    def using( self, text ):
        if self._protectionIgnoring.ignore():
            return
        self._textOut( text )

    def functionForwardDeclaration( self, decomposition ):
        if self._protectionIgnoring.ignore():
            return
        if decomposition.name in self._perFileSettings.SKIP:
            return
        self._function( decomposition )

    def functionDefinition( self, decomposition ):
        if self._protectionIgnoring.ignore():
            return
        if decomposition.name in self._perFileSettings.SKIP:
            return
        self._function( decomposition )

    def constructorDefinition( self, decomposition ):
        if self._protectionIgnoring.ignore():
            return
        mock = self._voodoomocks[ -1 ]
        mock.implementConstructor( decomposition )

    def method( self, decomposition ):
        if self._protectionIgnoring.ignore():
            return
        if decomposition.static:
            self._function( decomposition )
        else:
            mock = self._voodoomocks[ -1 ]
            mock.implementMethod( decomposition )

    def enterStruct( self, name, inheritance, templatePrefix, templateParametersList, fullText ):
        self._enterConstruct( name, inheritance, templatePrefix, templateParametersList, fullText, 'struct', 'public' )
    def leaveStruct( self ):
        self._leaveConstruct()
    def enterClass( self, name, inheritance, templatePrefix, templateParametersList, fullText ):
        self._enterConstruct( name, inheritance, templatePrefix, templateParametersList, fullText, 'class', 'private' )
    def leaveClass( self ):
        self._leaveConstruct()

    def enterNamespace( self, name ):
        if self._protectionIgnoring.ignore():
            return
        self._namespace.append( name )
        self._code.lineOut( "namespace %s" % name )
        self._code.lineOut( "{" )
        self._code.increaseIndent()

    def leaveNamespace( self ):
        if self._protectionIgnoring.ignore():
            return
        self._namespace.pop()
        self._code.decreaseIndent()
        self._code.lineOut( "};" )

    def accessSpec( self, access ):
        if access != 'private':
            self._code.decreaseIndent()
            self._code.lineOut( access + ":" )
            self._code.increaseIndent()
        self._protectionIgnoring.change( access )

    def _textOut( self, text ):
        self._code.lineOut( text + ";" )
        self._code.lineOut( "" )

    def _function( self, decomposition ):
        chain = VoodooChain( decomposition.name, self.fullIdentifier( decomposition.name ), self._code, self._chainCache )
        self._chainCache = chain.cache()
        chain.overload( decomposition )

    def shouldImplementEnterConstruct( self, name, fullText, defaultProtection ):
        if name in self._perFileSettings.NO_MOCK:
            self._code.lineOut( fullText + ";" )
            self._code.lineOut( "" )
            self._protectionIgnoring.enterSkipped()
        elif name in self._perFileSettings.SKIP:
            self._protectionIgnoring.enterSkipped()
        else:
            self._protectionIgnoring.enter( defaultProtection )
        return not self._protectionIgnoring.ignoreButLast()

    def _forwardDeclaration( self, name, templatePrefix, construct ):
        if self._protectionIgnoring.ignore():
            return
        if name in self._perFileSettings.SKIP:
            return
        if templatePrefix != "":
            self._code.lineOut( templatePrefix )
        self._code.lineOut( "%s %s;" % ( construct, name ) )
        self._code.lineOut( "" )

    def _enterConstruct( self, name, inheritance, templatePrefix, templateParametersList, fullText, construct, defaultProtection ):
        if not self.shouldImplementEnterConstruct( name, fullText, defaultProtection ):
            return
        mock = VoodooMock(  construct = construct,
                            identifier = name,
                            inherits = [ identifier for protection, identifier in inheritance ],
                            fullIdentifier = self.fullIdentifier( name ),
                            code = self._code,
                            perFileSettings = self._perFileSettings,
                            templatePrefix = templatePrefix,
                            templateParametersList = templateParametersList )
        mock.implementRedirectorClassHeader()
        self._voodoomocks.append( mock )
        self.inClass.append( name )

    def shouldImplementLeaveConstruct( self ):
        ignore = self._protectionIgnoring.ignoreButLast()
        self._protectionIgnoring.leave()
        return not ignore

    def _leaveConstruct( self ):
        if not self.shouldImplementLeaveConstruct():
            return
        self.inClass.pop()
        mock = self._voodoomocks.pop()
        mock.implementRedirectorClassFooter()
        mock.implementMockClass()