36class TypeVariableSubstitutionVisitor :
public Transform {
44 const IR::Node *replacement(
const IR::ITypeVar *original,
const IR::Node *node);
48 bool replace =
false,
bool cloneInfInt =
false)
49 : bindings(bindings), replace(replace), cloneInfInt(cloneInfInt) {
50 setName(
"TypeVariableSubstitution");
53 const IR::Node *preorder(IR::TypeParameters *tps)
override;
54 const IR::Node *preorder(IR::Type_Any *tv)
override {
55 return replacement(getOriginal<IR::Type_Any>(), tv);
57 const IR::Node *preorder(IR::Type_Var *tv)
override {
58 return replacement(getOriginal<IR::Type_Var>(), tv);
60 const IR::Node *preorder(IR::Type_InfInt *ti)
override {
61 const auto *n = cloneInfInt ? IR::Type_InfInt::get() : ti;
62 return replacement(getOriginal<IR::Type_InfInt>(), n);
66class TypeSubstitutionVisitor :
public TypeVariableSubstitutionVisitor {
71 : TypeVariableSubstitutionVisitor(ts), typeMap(typeMap) {
73 setName(
"TypeSubstitutionVisitor");
75 const IR::Node *postorder(IR::PathExpression *path)
override {
77 return new IR::PathExpression(path->path->clone());
79 const IR::Node *postorder(IR::Type_Name *type)
override {
80 auto actual = typeMap->getTypeType(getOriginal<IR::Type_Name>(),
true);
81 if (
auto tv = actual->to<IR::ITypeVar>()) {
82 LOG3(
"Replacing " << tv);
83 return replacement(tv, type);
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13