|
2 | 2 | #define C_CODE_GENERATOR_H |
3 | 3 | #include "blocks/block_visitor.h" |
4 | 4 | #include "blocks/stmt.h" |
| 5 | +#include "builder/dyn_var.h" |
5 | 6 | #include "util/printer.h" |
6 | 7 | #include <unordered_map> |
7 | 8 | #include <unordered_set> |
@@ -76,6 +77,34 @@ class c_code_generator : public block_visitor { |
76 | 77 | ast->accept(&generator); |
77 | 78 | oss << std::endl; |
78 | 79 | } |
| 80 | + template <typename T> |
| 81 | + static void generate_struct_decl(std::ostream &oss, int indent = 0) { |
| 82 | + static_assert(std::is_base_of<builder::var, T>::value, "Template argument should be a dyn_var"); |
| 83 | + auto save = builder::options::track_members; |
| 84 | + builder::options::track_members = true; |
| 85 | + T v = builder::with_name("_"); |
| 86 | + builder::options::track_members = save; |
| 87 | + /* Dump the type */ |
| 88 | + c_code_generator generator(oss); |
| 89 | + printer::indent(oss, indent); |
| 90 | + auto var_type = T::create_block_type(); |
| 91 | + assert(isa<named_type>(var_type) && "Cannot create struct declarations for un-named types"); |
| 92 | + assert(to<named_type>(var_type)->template_args.size() == 0 && |
| 93 | + "Cannot yet, generate decls for types with template args"); |
| 94 | + oss << "struct " << to<named_type>(var_type)->type_name << " {\n"; |
| 95 | + indent++; |
| 96 | + |
| 97 | + for (auto member : v.members) { |
| 98 | + printer::indent(oss, indent); |
| 99 | + auto decl = std::make_shared<decl_stmt>(); |
| 100 | + decl->decl_var = member->block_var; |
| 101 | + decl->accept(&generator); |
| 102 | + oss << std::endl; |
| 103 | + } |
| 104 | + indent--; |
| 105 | + printer::indent(oss, indent); |
| 106 | + oss << "};" << std::endl; |
| 107 | + } |
79 | 108 | }; |
80 | 109 | } // namespace block |
81 | 110 | #endif |
0 commit comments