/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 * 
 * Author: pgess <v.melnychenko@xreate.org>
 * 
 * cfapass.cpp
 * Control Flow Graph building pass
 */


#ifndef CFGPASS_H
#define CFGPASS_H

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

namespace xreate{namespace cfa {
    
class CFAGraph;
    
/** \brief Control Flow Analysis Pass(%CFA)*/
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
