// Data Flow Graph determination pass

#ifndef DFGPASS_H
#define DFGPASS_H

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

namespace xreate {

class ClaspLayer;

class DFGPass : public AbstractPass<SymbolNode> {
public:
	SymbolNode process(CodeScope* scope, PassContext context, const std::string& hintBlockDecl="");
	SymbolNode process(const Expression& expression, PassContext context, const std::string& varDecl="") override;

    DFGPass(PassManager* manager);

    void init();
    void run();
    void finish();
private:
    struct
    {
        DFAGraph graph;
    } __context;

    std::map<Operator, Expression> __signatures;		//DFA data for particular operators
    ClaspLayer* clasp;
};
};

#endif
