#ifndef ABSTRACTPASS_H
#define ABSTRACTPASS_H

#include "passmanager.h"

namespace xreate
{
    struct PassContext
    {
        CodeScope* scope = 0;
        ManagedFnPtr function;
        ManagedRulePtr rule;
        std::string varDecl;

        PassContext()
        {}

        ~PassContext(){}
    };

    class AbstractPass
    {
    public:
        AbstractPass(PassManager* man);
        virtual void run();
        virtual void finish();

        virtual void processFnCall(ManagedFnPtr function, PassContext context);
        virtual void process(ManagedFnPtr function);
        virtual void process(ManagedRulePtr rule);
        virtual void process(CodeScope* scope, PassContext context);
        virtual  void process(const Expression& expression, PassContext context, const std::string& varDecl="");

    protected:
        PassManager* man;
    };
}
#endif