From 75639fbf01bd6ae1212521b6cf822025eb8b598d Mon Sep 17 00:00:00 2001 From: Carlos Maniero Date: Wed, 10 May 2023 16:07:39 -0300 Subject: namespaces: Add a namespace structure that represents a file We have been always parsing a single function. Since we want to have multiple functions in a near future, this patch introduces an namespace that represents an entire file. To ensure a function is defined inside a namespace, a helper function was created. Today our ast_node structure is highly exposed, and this is something that Johnny and I have been discussed. So then, this is a first step to try to protected the code generation from our ast tree. Signed-off-by: Carlos Maniero --- src/ast.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'src/ast.c') diff --git a/src/ast.c b/src/ast.c index 5790c05..47d658d 100644 --- a/src/ast.c +++ b/src/ast.c @@ -44,6 +44,9 @@ void ast_node_destroy(ast_node_t *node) { switch (node->kind) { + case AST_NAMESPACE: + ast_node_destroy_vector(node->data.ns.nodes); + break; case AST_FUNCTION_DECLARATION: ast_node_destroy(node->data.function.body); break; @@ -107,6 +110,24 @@ ast_node_new_function_declaration(string_view_t function_name, type_t return_typ return node; } +ast_node_t * +ast_node_new_namespace(vector_t *nodes) +{ + ast_node_t *node = ast_node_new(); + + *node = (ast_node_t){ + .kind = AST_NAMESPACE, + .result_type = TYPE_VOID, + .data = { + .ns = { + .nodes = nodes, + } + }, + }; + + return node; +} + ast_node_t * ast_node_new_block(vector_t *body) { @@ -254,6 +275,27 @@ ast_node_new_variable(ast_identifier_t *identifier, type_t result_type) return node; } +ast_node_t * +ast_node_ns_get_function_node_by_sv(ast_node_t *ns, string_view_t name) +{ + assert(ns->kind == AST_NAMESPACE); + + for (size_t i = 0; i < ns->data.ns.nodes->size; i++) { + ast_node_t *node = vector_at(ns->data.ns.nodes, i); + + if (node->kind == AST_FUNCTION_DECLARATION && string_view_eq(node->data.function.identifier.name, name)) { + return node; + } + } + return NULL; +} + +ast_node_t * +ast_node_ns_get_function_node_by_name(ast_node_t *ns, char *function_name) +{ + return ast_node_ns_get_function_node_by_sv(ns, string_view_from_str(function_name)); +} + char * ast_type_to_str(type_t type) { -- cgit v1.2.3