aboutsummaryrefslogtreecommitdiff
path: root/src/parseh.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parseh.cpp')
-rw-r--r--src/parseh.cpp41
1 files changed, 33 insertions, 8 deletions
diff --git a/src/parseh.cpp b/src/parseh.cpp
index 3721c83e79..49872a97b3 100644
--- a/src/parseh.cpp
+++ b/src/parseh.cpp
@@ -9,6 +9,8 @@
#include "config.h"
#include "os.hpp"
#include "error.hpp"
+#include "parser.hpp"
+#include "all_types.hpp"
#include <clang/Frontend/ASTUnit.h>
#include <clang/Frontend/CompilerInstance.h>
@@ -18,10 +20,12 @@
using namespace clang;
struct Context {
- ParseH *parse_h;
+ ImportTableEntry *import;
+ ZigList<ErrorMsg *> *errors;
bool warnings_on;
VisibMod visib_mod;
AstNode *c_void_decl_node;
+ AstNode *root;
HashMap<Buf *, bool, buf_hash, buf_eql_buf> type_table;
};
@@ -30,6 +34,7 @@ static AstNode *make_qual_type_node(Context *c, QualType qt);
static AstNode *create_node(Context *c, NodeType type) {
AstNode *node = allocate<AstNode>(1);
node->type = type;
+ node->owner = c->import;
return node;
}
@@ -44,6 +49,10 @@ static const char *decl_name(const Decl *decl) {
return (const char *)named_decl->getName().bytes_begin();
}
+static ZigList<AstNode *> *create_empty_directives(Context *c) {
+ return allocate<ZigList<AstNode*>>(1);
+}
+
static AstNode *create_typedef_node(Context *c, Buf *new_name, AstNode *target_node) {
if (!target_node) {
return nullptr;
@@ -53,7 +62,10 @@ static AstNode *create_typedef_node(Context *c, Buf *new_name, AstNode *target_n
node->data.variable_declaration.is_const = true;
node->data.variable_declaration.visib_mod = c->visib_mod;
node->data.variable_declaration.expr = target_node;
- c->parse_h->var_list.append(node);
+ node->data.variable_declaration.directives = create_empty_directives(c);
+ normalize_parent_ptrs(node);
+
+ c->root->data.root.top_level_decls.append(node);
return node;
}
@@ -79,6 +91,7 @@ static AstNode *pointer_to_type(Context *c, AstNode *type_node, bool is_const) {
AstNode *node = create_node(c, NodeTypePrefixOpExpr);
node->data.prefix_op_expr.prefix_op = is_const ? PrefixOpConstAddressOf : PrefixOpAddressOf;
node->data.prefix_op_expr.primary_expr = convert_to_c_void(c, type_node);
+ normalize_parent_ptrs(node);
return node;
}
@@ -255,6 +268,7 @@ static void visit_fn_decl(Context *c, const FunctionDecl *fn_decl) {
AstNode *node = create_node(c, NodeTypeFnProto);
node->data.fn_proto.is_extern = true;
node->data.fn_proto.visib_mod = c->visib_mod;
+ node->data.fn_proto.directives = create_empty_directives(c);
node->data.fn_proto.is_var_args = fn_decl->isVariadic();
buf_init_from_str(&node->data.fn_proto.name, decl_name(fn_decl));
@@ -276,6 +290,7 @@ static void visit_fn_decl(Context *c, const FunctionDecl *fn_decl) {
break;
}
+ normalize_parent_ptrs(param_decl_node);
node->data.fn_proto.params.append(param_decl_node);
}
@@ -296,8 +311,9 @@ static void visit_fn_decl(Context *c, const FunctionDecl *fn_decl) {
return;
}
- c->parse_h->fn_list.append(node);
+ normalize_parent_ptrs(node);
+ c->root->data.root.top_level_decls.append(node);
}
static void visit_typedef_decl(Context *c, const TypedefNameDecl *typedef_decl) {
@@ -322,6 +338,7 @@ static void visit_typedef_decl(Context *c, const TypedefNameDecl *typedef_decl)
AstNode *node = create_typedef_node(c, type_name, make_qual_type_node(c, child_qt));
if (node) {
+ normalize_parent_ptrs(node);
c->type_table.put(type_name, true);
}
}
@@ -345,7 +362,9 @@ static bool decl_visitor(void *context, const Decl *decl) {
return true;
}
-int parse_h_buf(ParseH *parse_h, Buf *source, const char **args, int args_len, const char *libc_include_path) {
+int parse_h_buf(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, Buf *source,
+ const char **args, int args_len, const char *libc_include_path)
+{
int err;
Buf tmp_file_path = BUF_INIT;
if ((err = os_buf_to_tmp_file(source, buf_create_from_str(".h"), &tmp_file_path))) {
@@ -361,17 +380,18 @@ int parse_h_buf(ParseH *parse_h, Buf *source, const char **args, int args_len, c
clang_argv.append(args[i]);
}
- err = parse_h_file(parse_h, &clang_argv);
+ err = parse_h_file(import, errors, &clang_argv);
os_delete_file(&tmp_file_path);
return err;
}
-int parse_h_file(ParseH *parse_h, ZigList<const char *> *clang_argv) {
+int parse_h_file(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, ZigList<const char *> *clang_argv) {
Context context = {0};
Context *c = &context;
- c->parse_h = parse_h;
+ c->import = import;
+ c->errors = errors;
c->type_table.init(64);
char *ZIG_PARSEH_CFLAGS = getenv("ZIG_PARSEH_CFLAGS");
@@ -455,13 +475,18 @@ int parse_h_file(ParseH *parse_h, ZigList<const char *> *clang_argv) {
ErrorMsg *err_msg = err_msg_create_with_offset(path, line, column, offset, source, msg);
- parse_h->errors.append(err_msg);
+ c->errors->append(err_msg);
}
return 0;
}
+ c->root = create_node(c, NodeTypeRoot);
ast_unit->visitLocalTopLevelDecls(c, decl_visitor);
+ normalize_parent_ptrs(c->root);
+
+ import->root = c->root;
+ import->is_c_import = true;
return 0;
}