/* file AssignExpr.cpp * * author: Roland Conybeare */ #include "AssignExpr.hpp" #include "xo/indentlog/print/tag.hpp" namespace xo { namespace ast { rp AssignExpr::make(const rp & lhs, const rp & rhs) { return new AssignExpr(lhs, rhs); } AssignExpr::AssignExpr(const rp & lhs, const rp & rhs) : Expression(exprtype::assign, rhs->valuetype()), lhs_{lhs}, rhs_{rhs} { this->free_var_set_ = this->calc_free_variables(); } std::set AssignExpr::calc_free_variables() const { std::set retval = lhs_->get_free_variables(); std::set tmp = rhs_->get_free_variables(); for (const auto & name : tmp) retval.insert(name); return retval; } std::set AssignExpr::get_free_variables() const { return free_var_set_; } std::size_t AssignExpr::visit_preorder(VisitFn visitor_fn) { std::size_t n = 1; visitor_fn(this); n += lhs_->visit_preorder(visitor_fn); n += rhs_->visit_preorder(visitor_fn); return n; } std::size_t AssignExpr::visit_layer(VisitFn visitor_fn) { std::size_t n = 1; visitor_fn(this); n += lhs_->visit_layer(visitor_fn); n += rhs_->visit_layer(visitor_fn); return n; } rp AssignExpr::xform_layer(TransformFn xform_fn) { this->lhs_ = Variable::from(lhs_->xform_layer(xform_fn)).promote(); this->rhs_ = rhs_->xform_layer(xform_fn); return xform_fn(this); } void AssignExpr::attach_envs(ref::brw p) { lhs_->attach_envs(p); rhs_->attach_envs(p); } void AssignExpr::display(std::ostream & os) const { os << ""; } } /*namespace ast*/ } /*namespace xo*/ /* end AssignExpr.cpp */