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

using namespace std;

namespace xreate {

    template<>
    void defaultValue<void>(){}

    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;

        __visitedSymbols.setCachedValue(symbol);
        const Expression& declaration = CodeScope::findDeclaration(symbol);

        if (declaration.isDefined()){
            PassContext context2 = context.updateScope(symbol.scope);
            process(declaration, context2, ident);
        }
    }
}
