#pragma once
#include <libsolidity/ast/AST.h>
#include <map>
#include <set>
#include <variant>
namespace solidity::frontend
{
struct CallGraph
{
enum class SpecialNode
{
InternalDispatch,
Entry,
};
using Node = std::variant<CallableDeclaration const*, SpecialNode>;
struct CompareByID
{
using is_transparent = void;
bool operator()(Node const& _lhs, Node const& _rhs) const;
bool operator()(Node const& _lhs, int64_t _rhs) const;
bool operator()(int64_t _lhs, Node const& _rhs) const;
};
std::map<Node, std::set<Node, CompareByID>, CompareByID> edges;
std::map<ContractDefinition const*, ASTNode const*, ASTCompareByID<ContractDefinition>> bytecodeDependency;
std::set<EventDefinition const*, ASTNode::CompareByID> emittedEvents;
std::set<ErrorDefinition const*, ASTNode::CompareByID> usedErrors;
};
}