#include #include #include #include #include // Analyze assigns fzl_an_res_t analyze_assign(fzl_analyzer_t *analyzer, fzl_node_t *assign_node) { if (!analyzer) return (fzl_an_res_t){.error = true}; if (!assign_node || assign_node->type != FZL_NODETYPE_ASSIGN) { an_push_error(analyzer, NULL, "node is not assignment"); return (fzl_an_res_t){.error = true}; } fzl_node_t *left = assign_node->binary_op.left; fzl_an_res_t leftside = analyze_common(analyzer, left); if (leftside.error) return (fzl_an_res_t){.error = true}; fzl_an_res_t rightside = analyze_common(analyzer, assign_node->binary_op.right); if (rightside.error) return (fzl_an_res_t){.error = true}; if (left->type != FZL_NODETYPE_DECLARATION && left->type != FZL_NODETYPE_IDENTIFIER && left->type != FZL_NODETYPE_FIELD) { an_push_error(analyzer, left->token, "left side must be one of these: declaration, identifier or " "field access"); return (fzl_an_res_t){.error = true}; } if (!an_is_compatible(leftside.type, rightside.type, leftside.classname, rightside.classname)) { snprintf(an_problem, sizeof(an_problem), "incompatible types - '%s' is expected, got '%s'", an_typetostr(leftside.type, leftside.classname), an_typetostr(rightside.type, rightside.classname)); an_push_error(analyzer, assign_node->binary_op.right->token, an_problem); return (fzl_an_res_t){.error = true}; } return (fzl_an_res_t){ .error = false, .type = FZL_TYPE_NULL, .classname = NULL}; }