1
void dump::dump_assign_statement( assign_statement const * as ) {
2
CHECK_NULL(as,"assign_statement")
3
dump_expression( as->left.get() );
5
case assign_statement::h_value: out << " = "; break;
6
case assign_statement::h_init_refer: out << " := "; break;
7
case assign_statement::h_default: out << " |= "; break;
9
dump_expression( as->right.get() );
12
void dump::dump_declaration( declaration const * decl, unsigned flags ) {
13
CHECK_NULL( decl, "declaration" );
15
if( decl->is_export ) {
19
switch( decl->lifetime ) {
20
case declaration::l_local: break;
21
case declaration::l_global: out << "@lifetime(global) "; break;
24
if( decl->import_type != declaration::it_none) {
25
switch( decl->import_type ) {
26
case declaration::it_none: break;
27
case declaration::it_abi_code: out << "@import("; break;
28
case declaration::it_abi_data: out << "@import_data("; break;
30
if( decl->import_module.size() ) {
31
out << decl->import_module << ".";
33
out << decl->import_name;
34
switch( decl->name_form ) {
35
case declaration::nf_bare: out << ",bare"; break;
36
case declaration::nf_leaf: out << ",leaf"; break;
37
case declaration::nf_auto: out << ",auto"; break;
42
switch( decl->form ) {
43
case declaration::f_single: out << "single "; break;
44
case declaration::f_multi: out << "multi "; break;
45
case declaration::f_arg: out << "arg "; break; //internal (not in code directly)
46
case declaration::f_return: out << "return "; break; //internal
47
case declaration::f_capture: out << "capture "; break; //internal
52
if( show_spec_type ) {
53
if( decl->spec_type ) {
55
dump_type_spec( decl->spec_type.get() );
59
//the decl itself need not be valid, only the values (relevant for class parametric functions)
60
dump_type_ref( decl->type, tf_no_validate );
63
if( decl->literal_value && !omit_value && !(flags & df_omit_value) ) {
65
dump_expression( decl->literal_value.get(), ef_expand_name );
69
void dump::dump_var_statement( var_statement const * vs ) {
70
CHECK_NULL( vs, "var_statement" )
72
dump_declaration( vs->decl.get() );
75
if( vs->init_refer_value )
79
dump_expression( vs->value.get() );
83
void dump::dump_init_statement( init_statement const * is ) {
84
CHECK_NULL( is, "init_statement" )
88
dump_declaration( decl.get(), df_omit_value );
91
out << " = undefined";
95
if( is->init_refer_value )
99
dump_expression( is->value.get(), ef_expand_name );
102
if( is->no_release ) {
103
out << " no_release";
110
dump_statement( is->code.get() );
112
out << indent_str() << "}" << endl();
116
void dump::dump_defer_statement( defer_statement const * defer ) {
117
CHECK_NULL( defer, "defer_statement" )
118
out << (defer->error_only ? "defer_error" : "defer");
119
dump_statement_block( defer->block.get() );
122
void dump::dump_do_statement( do_statement const * ds ) {
123
CHECK_NULL( ds, "do_statement" )
130
out << "switch {" << endl();
132
for( auto & v : ds->expr_list ) {
135
dump_expression( v.cond.get(), ef_isolated );
140
dump_statement_block( v.block.get() );
144
out << indent_str() << "}";
146
dump_error_statement( *ds );
149
void dump::dump_statement( statement const * st ) {
150
CHECK_NULL(st, "statement")
154
switch( st->statement_form() )
158
dump_##type( static_cast<type const*>(st) ); \
163
DS(expression_statement)
168
DS(loop_flow_statement)
171
DS(typedef_statement)
178
void dump::dump_statement_block( statement_block const * block ) {
179
CHECK_NULL(block, "statement_block")
182
if( shown.find(block) != shown.end() ) {
186
shown.insert( block );
188
if( block->reference_text.size() ) {
189
out << "/* " << block->reference_text << " */ ";
191
out << "{" << endl();
194
//global symbols will already be in the static init block...?
195
if( block->symbols->get_level() > 0 ) {
196
out << indent_str() << "// local_decls" << endl();
197
auto const & locals = block->symbols->get_local_decls(true);
198
for( auto & local : locals ) {
200
dump_declaration( local.get() );
203
out << indent_str() << "// end local_decls" << endl();
206
for( size_t i=0; i < block->list.size(); ++i ) {
207
dump_statement( block->list[i].get() );
208
if( SHOW_COMPLETENESS && !block->list[i]->is_resolved() ) {
209
out << " //UNRESOLVED";
214
out << indent_str() << "} ";
216
if( SHOW_COMPLETENESS && !block->is_complete() ) {
217
out << " /* INCOMPLETE */";
221
void dump::dump_typedef_statement( typedef_statement const * ts ) {
222
CHECK_NULL(ts,"typedef_statement" );
224
if( ts->is_export ) {
229
case typedef_statement::w_prototype:
230
out << "typedef " << ts->name;
231
if( show_spec_type ) {
232
if( ts->spec_type ) {
234
dump_type_spec( ts->spec_type.get() );
238
dump_type_ref( ts->type, true );
242
case typedef_statement::w_alias: {
243
out << "alias " << ts->name << " : ";
244
dump_type_spec( ts->spec_type.get() );
248
case typedef_statement::w_class: {
249
out << "class " << ts->name << " ";
250
if( ts->spec_type ) {
251
dump_type_spec( ts->spec_type.get() );
253
dump_statement_block( ts->class_block.get() );
260
void dump::dump_return_statement( return_statement const * rs ) {
261
CHECK_NULL(rs,"return_statement" );
267
dump_expression( rs->value.get(), ef_isolated );
271
void dump::dump_expression_statement( expression_statement const * es ) {
272
CHECK_NULL( es, "expression_statement" );
276
dump_expression( es->expr.get(), ef_isolated );
277
dump_error_statement( *es );
280
void dump::dump_error_statement( error_statement const & ds ) {
283
switch( ds.on_match ) {
284
case fail_level::resume: out << "resume_error"; break;
285
case fail_level::cancel: out << "cancel"; break;
286
case fail_level::fail: out << "fail"; break;
287
case fail_level::abandon: out << "abandon"; break;
290
dump_statement_block( ds.on_error.get() );
294
void dump::dump_fail_statement( fail_statement const * fs ) {
295
CHECK_NULL( fs, "fail_statement" );
296
switch( fs->level ) {
297
case fail_level::resume: out << "resume_error"; break;
298
case fail_level::cancel: out << "cancel"; break;
299
case fail_level::fail: out << "fail"; break;
300
case fail_level::abandon: out << "abandon"; break;
304
void dump::dump_loop_flow_statement( loop_flow_statement const * ls ) {
305
CHECK_NULL( ls, "loop_flow_statement" );
307
case loop_flow_statement::f_break: out << "break"; break;
308
case loop_flow_statement::f_next: out << "next"; break;
312
void dump::dump_noop_statement( noop_statement const * ns ) {
313
CHECK_NULL( ns, "noop_statement" );
317
void dump::dump_import_statement( import_statement const * is ) {
318
CHECK_NULL( is, "import_statement" );
319
out << "import " << is->mod_name;
322
void dump::dump_for_statement( for_statement const * fs ) {
323
CHECK_NULL( fs, "for_statement" );
324
out << "for " << fs->item << " in ";
325
dump_expression( fs->iterable.get() );
327
dump_statement_block( fs->block.get() );