45class TypeVariableSubstitutionVisitor :
public Transform {
53 const IR::Node *replacement(
const IR::ITypeVar *original,
const IR::Node *node);
57 bool replace =
false,
bool cloneInfInt =
false)
58 : bindings(bindings), replace(replace), cloneInfInt(cloneInfInt) {
59 setName(
"TypeVariableSubstitution");
62 const IR::Node *preorder(IR::TypeParameters *tps)
override;
63 const IR::Node *preorder(IR::Type_Any *tv)
override {
64 return replacement(getOriginal<IR::Type_Any>(), tv);
66 const IR::Node *preorder(IR::Type_Var *tv)
override {
67 return replacement(getOriginal<IR::Type_Var>(), tv);
69 const IR::Node *preorder(IR::Type_InfInt *ti)
override {
70 const auto *n = cloneInfInt ? IR::Type_InfInt::get() : ti;
71 return replacement(getOriginal<IR::Type_InfInt>(), n);
75class TypeSubstitutionVisitor :
public TypeVariableSubstitutionVisitor {
80 : TypeVariableSubstitutionVisitor(ts), typeMap(typeMap) {
82 setName(
"TypeSubstitutionVisitor");
84 const IR::Node *postorder(IR::PathExpression *path)
override {
86 return new IR::PathExpression(path->path->clone());
88 const IR::Node *postorder(IR::Type_Name *type)
override {
89 auto actual = typeMap->getTypeType(getOriginal<IR::Type_Name>(),
true);
90 if (
auto tv = actual->to<IR::ITypeVar>()) {
91 LOG3(
"Replacing " << tv);
92 return replacement(tv, type);
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24