/* file DefineExpr.cpp * * author: Roland Conybeare */ #include "DefineExpr.hpp" #include "Variable.hpp" namespace xo { namespace ast { rp DefineExpr::make(std::string lhs_name, rp rhs) { TypeDescr rhs_valuetype = nullptr; if (rhs) rhs_valuetype = rhs->valuetype(); return new DefineExpr(rhs_valuetype, std::move(lhs_name), std::move(rhs)); } /*make*/ DefineExpr::DefineExpr(TypeDescr rhs_valuetype, std::string lhs_name, rp rhs) : Expression(exprtype::define, rhs_valuetype), lhs_name_{std::move(lhs_name)}, rhs_{std::move(rhs)} { this->free_var_set_ = this->calc_free_variables(); } rp DefineExpr::lhs_variable() const { return Variable::make(lhs_name(), valuetype()); } std::set DefineExpr::calc_free_variables() const { std::set retval; if (rhs_) retval = rhs_->get_free_variables(); /* but remove this variable */ if (!this->lhs_name().empty()) retval.erase(this->lhs_name()); return retval; } /*calc_free_variables*/ void DefineExpr::display(std::ostream & os) const { os << ""; } /*display*/ // ----- DefineExprAccess ----- rp DefineExprAccess::make(std::string lhs_name, rp rhs) { TypeDescr rhs_valuetype = nullptr; if (rhs) rhs_valuetype = rhs->valuetype(); return new DefineExprAccess(rhs_valuetype, std::move(lhs_name), std::move(rhs)); } rp DefineExprAccess::make_empty() { return new DefineExprAccess(nullptr /*rhs_valuetype*/, "" /*lhs_name*/, nullptr /*rhs*/); } void DefineExprAccess::assign_rhs(const rp & x) { assert(x); this->rhs_ = x; if (x) { this->assign_valuetype(x->valuetype()); } this->free_var_set_ = this->calc_free_variables(); } } /*namespace ast*/ } /*namespace xo*/ /* end DefineExpr.cpp */