#include #include #include #include #include #include // Analyze extern block definition fzl_an_res_t analyze_extern(fzl_analyzer_t *analyzer, fzl_node_t *extern_node) { if (!analyzer) return (fzl_an_res_t){.error = true}; if (!extern_node || extern_node->type != FZL_NODETYPE_EXTERN) { an_push_error(analyzer, NULL, "node is not an extern block"); return (fzl_an_res_t){.error = true}; } if (extern_node->ext.typedefs_count < 1 && extern_node->ext.fns_count < 1) an_push_warning(analyzer, extern_node->token, "extern is empty"); for (size_t i = 0; i < extern_node->ext.typedefs_count; i++) { fzl_node_t *node = extern_node->ext.typedefs[i]; fzl_an_res_t res = analyze_common(analyzer, node); if (res.error) return (fzl_an_res_t){.error = true}; if (node->type != FZL_NODETYPE_TYPEDEF && node->type != FZL_NODETYPE_EXTERN_FN) { snprintf(an_problem, sizeof(an_problem), "unexpected statement '%s' inside extern block", (char *)node->token->value); an_push_error(analyzer, node->token, an_problem); return (fzl_an_res_t){.error = true}; } } for (size_t i = 0; i < extern_node->ext.fns_count; i++) { fzl_an_res_t res = analyze_common(analyzer, extern_node->ext.fns[i]); if (res.error) return (fzl_an_res_t){.error = true}; } return (fzl_an_res_t){ .error = false, .type = FZL_TYPE_NULL, .classname = NULL}; }