#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 Symbol& symbol, PassContext context)
{
    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);
    }
}

template<>
void
AbstractPass<void>::process(const Expression& expression, PassContext context, const std::string& varDecl=""){
    if (expression.__state == Expression::COMPOUND){
        for (const Expression &op: expression.getOperands()) {
            process(op, context);
        }

        for (CodeScope* scope: expression.blocks) {
            process(scope, context);
        }

        if (expression.op == Operator::CALL){
            return processExpressionCall(expression, context);
        }

        return;
    }


    assert(false);
}
}