#include "abstractpass.h"
#include "attachments.h"
#include "passmanager.h"

using namespace std;

namespace xreate {

    template<>
    void defaultValue(){};

    void AbstractPassBase::finish()
    {}

    AbstractPassBase::AbstractPassBase(PassManager *manager)
            : man(manager) {
    }

    template<>
    void
    AbstractPass<void>::processSymbol(const std::string& ident, PassContext context)
    {
        const Symbol& symbol = context.scope->findSymbol(ident);

        if (__visitedSymbols.isCached(symbol))
            return;

        if (CodeScope::hasDeclaration(symbol)) {
        	__visitedSymbols.setCachedValue(symbol);

            PassContext context2 = context;
            context2.scope = symbol.scope;
            process(CodeScope::findDeclaration(symbol), context2, ident);
        }
    }
}
