// Control Flow Graph determination pass

#ifndef CFGPASS_H
#define CFGPASS_H

#include "xreatemanager.h"
#include "clasplayer.h"
#include "abstractpass.h"

namespace xreate{namespace cfa {
    
class CFAGraph;
    
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 {
        CFAGraph* graph;
    } __context;

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

    void initSignatures();
}; 

}} //end of namespace xreate::cfa

#endif // CFGPASS_H
