aboutsummaryrefslogtreecommitdiff
path: root/src/ast_render.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2017-01-10 15:39:52 -0500
committerAndrew Kelley <superjoe30@gmail.com>2017-01-10 15:39:52 -0500
commit430e33b869b004ca24faee2dfa9e51aa4e94093f (patch)
tree8b5b3124c51214ac78151eddf28822f8e9d050c0 /src/ast_render.cpp
parent8d27a027051e93e6f63aa9b969fed1dbfcf2aa73 (diff)
downloadzig-430e33b869b004ca24faee2dfa9e51aa4e94093f.tar.gz
zig-430e33b869b004ca24faee2dfa9e51aa4e94093f.zip
partially fix parseh command
Diffstat (limited to 'src/ast_render.cpp')
-rw-r--r--src/ast_render.cpp81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/ast_render.cpp b/src/ast_render.cpp
index 2c541b1600..0ade4005bc 100644
--- a/src/ast_render.cpp
+++ b/src/ast_render.cpp
@@ -6,6 +6,7 @@
*/
#include "ast_render.hpp"
+#include "analyze.hpp"
#include <stdio.h>
@@ -891,3 +892,83 @@ void ast_render(FILE *f, AstNode *node, int indent_size) {
render_node_grouped(&ar, node);
}
+static void ast_render_tld_fn(AstRender *ar, TldFn *tld_fn) {
+ FnTableEntry *fn_entry = tld_fn->fn_entry;
+ FnTypeId *fn_type_id = &fn_entry->type_entry->data.fn.fn_type_id;
+ const char *visib_mod_str = visib_mod_string(tld_fn->base.visib_mod);
+ const char *extern_str = extern_string(fn_type_id->is_extern);
+ const char *coldcc_str = fn_type_id->is_cold ? "coldcc " : "";
+ const char *nakedcc_str = fn_type_id->is_naked ? "nakedcc " : "";
+ fprintf(ar->f, "%s%s%s%sfn %s(", visib_mod_str, extern_str, coldcc_str, nakedcc_str, buf_ptr(&fn_entry->symbol_name));
+ for (size_t i = 0; i < fn_type_id->param_count; i += 1) {
+ FnTypeParamInfo *param_info = &fn_type_id->param_info[i];
+ if (param_info->is_noalias) {
+ fprintf(ar->f, "noalias ");
+ }
+ fprintf(ar->f, "arg_%zu: %s", i, buf_ptr(&param_info->type->name));
+ }
+ if (fn_type_id->return_type->id == TypeTableEntryIdVoid) {
+ fprintf(ar->f, ");\n");
+ } else {
+ fprintf(ar->f, ") -> %s;\n", buf_ptr(&fn_type_id->return_type->name));
+ }
+}
+
+static void ast_render_tld_var(AstRender *ar, TldVar *tld_var) {
+ VariableTableEntry *var = tld_var->var;
+ const char *visib_mod_str = visib_mod_string(tld_var->base.visib_mod);
+ const char *const_or_var = const_or_var_string(var->src_is_const);
+ const char *extern_str = extern_string(var->is_extern);
+ fprintf(ar->f, "%s%s%s %s", visib_mod_str, extern_str, const_or_var, buf_ptr(&var->name));
+
+ if (var->value.type->id == TypeTableEntryIdNumLitFloat ||
+ var->value.type->id == TypeTableEntryIdNumLitInt)
+ {
+ // skip type
+ } else {
+ fprintf(ar->f, ": %s", buf_ptr(&var->value.type->name));
+ }
+
+ if (var->value.special == ConstValSpecialRuntime) {
+ fprintf(ar->f, ";\n");
+ return;
+ }
+
+ Buf buf = BUF_INIT;
+ buf_resize(&buf, 0);
+ render_const_value(&buf, &var->value);
+
+ fprintf(ar->f, " = %s;\n", buf_ptr(&buf));
+}
+
+void ast_render_decls(FILE *f, int indent_size, ImportTableEntry *import) {
+ AstRender ar = {0};
+ ar.f = f;
+ ar.indent_size = indent_size;
+ ar.indent = 0;
+
+ auto it = import->decls_scope->decl_table.entry_iterator();
+ for (;;) {
+ auto *entry = it.next();
+ if (!entry)
+ break;
+
+ Tld *tld = entry->value;
+ switch (tld->id) {
+ case TldIdVar:
+ ast_render_tld_var(&ar, (TldVar *)tld);
+ break;
+ case TldIdFn:
+ ast_render_tld_fn(&ar, (TldFn *)tld);
+ break;
+ case TldIdContainer:
+ fprintf(stdout, "container\n");
+ break;
+ case TldIdTypeDef:
+ fprintf(stdout, "typedef\n");
+ break;
+ }
+ }
+}
+
+