SequenceNode* handleStencilAssignment(FuncCallLikeNode* lhs, ExpressionNode* rhs) { SequenceNode* retval = new SequenceNode(); retval->setLocation(FileLocation(yylineno)); StencilNode* stencil = dynamic_cast<StencilNode*>(lhs); if (stencil == nullptr) { std::string err_msg = "Internal error: The stencil \"" + lhs->name() + "\" does not appear to be properly defined"; yyerror(err_msg.c_str()); } #if 0 // If the type is a collection of invalids (no pun intended) // we can safely set it to the type of the rhs EquelleType lhs_et = SymbolTable::variableType(stencil->name()); if (lhs_et.basicType() == Invalid && lhs_et.compositeType() == Collection && lhs_et.isStencil()) { EquelleType lhs_et = rhs->type(); lhs_et.setMutable(true); SymbolTable::setVariableType(stencil->name(), lhs_et); // TODO: set dimensions correctly here TypeNode* lhs_type = new TypeNode(lhs_et); retval->pushNode(new VarDeclNode(stencil->name(), lhs_type)); } #endif retval->pushNode(new StencilAssignmentNode(stencil, rhs)); return retval; }
Node* handleDeclarationAssign(const std::string& name, TypeNode* type, ExpressionNode* expr) { SequenceNode* seq = new SequenceNode; seq->pushNode(handleDeclaration(name, type)); seq->pushNode(handleAssignment(name, expr)); seq->setLocation(FileLocation(yylineno)); return seq; }