// Control Flow Graph determination pass

#ifndef CFGPASS_H
#define CFGPASS_H

#include "passmanager.h"
#include "clasplayer.h"
#include "abstractpass.h"

namespace xreate{namespace analysis {
    class CFAGraph;
}}

namespace xreate {
class CFAPass : public AbstractPass<void>
{
public:
    void process(ManagedFnPtr function) override;
    void processFnCall(ManagedFnPtr function, PassContext context) override;
    void processFnCallUncertain(ManagedFnPtr function, PassContext context) override;
    void process(CodeScope* scope, PassContext context, const std::string& hintBlockDecl="") override;
    void process(const Expression& expression, PassContext context, const std::string& varDecl="") override;

    CFAPass(PassManager* manager);

    void finish() override;
    void run() override;
private:
    struct {
        xreate::analysis::CFAGraph* graph;
    } __context;

    std::multimap<Operator, Expression> __signatures; //CFA data for particular operators

    void initSignatures();
}; }

#endif // CFGPASS_H
