51 lines
1.5 KiB
C
51 lines
1.5 KiB
C
#include <common/fzl_types.h>
|
|
#include <compiler/fzl_analyzer.h>
|
|
#include <compiler/fzl_parser.h>
|
|
#include <compiler/internals/analyzer.h>
|
|
#include <stddef.h>
|
|
#include <stdio.h>
|
|
|
|
// 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};
|
|
}
|