v2 / cmd / tools / vast / vast.v
2502 lines · 2305 sloc · 80.21 KB · c8fcb5956edabb0151a69d77c4a9ed95ded60806
Raw
1module main
2
3import os
4import time
5import flag
6import v.token
7import v.parser
8import v.ast
9import v.pref
10import v.errors
11import v.checker
12import strings
13
14struct Context {
15mut:
16 is_watch bool
17 is_compile bool
18 is_print bool
19 is_terse bool
20 is_skip_defaults bool
21 check bool
22 hide_names map[string]bool
23}
24
25const vast_context = &Context{}
26
27fn main() {
28 if os.args.len < 2 {
29 eprintln('not enough parameters')
30 exit(1)
31 }
32 mut ctx := unsafe { vast_context }
33 mut fp := flag.new_flag_parser(os.args[2..])
34 fp.application('v ast')
35 fp.usage_example('demo.v generate demo.json file.')
36 fp.usage_example('-w demo.v generate demo.json file, and watch for changes.')
37 fp.usage_example('-c demo.v generate demo.json *and* a demo.c file, and watch for changes.')
38 fp.usage_example('-p demo.v print the json output to stdout.')
39 fp.usage_example('-s demo.v do NOT show the properties having default values, like false for bools, 0 for ints etc.')
40 fp.description('Dump a JSON representation of the V AST for a given .v or .vsh file.')
41 fp.description('By default, `v ast` will save the JSON to a .json file, named after the .v file.')
42 fp.description('Pass -p to see it instead.')
43 ctx.is_watch = fp.bool('watch', `w`, false,
44 'watch a .v file for changes, rewrite the .json file, when a change is detected')
45 ctx.is_print = fp.bool('print', `p`, false, 'print the AST to stdout')
46 ctx.is_compile = fp.bool('compile', `c`, false,
47 'watch the .v file for changes, rewrite the .json file, *AND* generate a .c file too on any change')
48 ctx.is_terse = fp.bool('terse', `t`, false,
49 'terse output, only with tree node names (AST structure), no details')
50 ctx.is_skip_defaults = fp.bool('skip-defaults', `s`, false,
51 'skip properties that have default values like false, 0, "", etc')
52 ctx.check = fp.bool('check', `k`, false, 'run v.checker as well (it may modify the AST)')
53 hfields := fp.string_multi('hide', 0,
54 'hide the specified fields. You can give several, by separating them with `,`').join(',')
55 for hf in hfields.split(',') {
56 ctx.hide_names[hf] = true
57 }
58 fp.limit_free_args_to_at_least(1)!
59 rest_of_args := fp.remaining_parameters()
60 for vfile in rest_of_args {
61 file := get_abs_path(vfile)
62 check_file(file)
63 ctx.write_file_or_print(file)
64 if ctx.is_watch || ctx.is_compile {
65 ctx.watch_for_changes(file)
66 }
67 }
68}
69
70fn (ctx Context) skip_empty(child &Node) bool {
71 if ctx.is_skip_defaults {
72 if child == unsafe { 0 } {
73 return true
74 }
75 if child.type == .t_false {
76 return true
77 }
78 if child.type == .t_null {
79 return true
80 }
81 if child.type == .t_number && child.valuedouble == 0.0 {
82 return true
83 }
84 if child.type == .t_string {
85 slen := unsafe { vstrlen_char(child.valuestring) }
86 if slen == 0 {
87 return true
88 }
89 if slen > 7 {
90 s := unsafe { child.valuestring.vstring_with_len(slen) }
91 if s.starts_with('enum:0(') {
92 return true
93 }
94 }
95 }
96 if child.type == .t_array && child.child == unsafe { 0 } {
97 return true
98 }
99 if child.type == .t_object && child.child == unsafe { 0 } {
100 return true
101 }
102 }
103 return false
104}
105
106fn (ctx Context) write_file_or_print(file string) {
107 if ctx.is_print {
108 println(json(file))
109 } else {
110 println('${time.now()}: AST written to: ' + json_file(file))
111 }
112}
113
114// generate ast json file and c source code file
115fn (ctx Context) watch_for_changes(file string) {
116 println('start watching...')
117 mut timestamp := i64(0)
118 for {
119 new_timestamp := os.file_last_mod_unix(file)
120 if timestamp != new_timestamp {
121 ctx.write_file_or_print(file)
122 if ctx.is_compile {
123 file_name := file[0..(file.len - os.file_ext(file).len)]
124 os.system('v -o ${file_name}.c ${file}')
125 }
126 }
127 timestamp = new_timestamp
128 time.sleep(500 * time.millisecond)
129 }
130}
131
132// get absolute path for file
133fn get_abs_path(path string) string {
134 if os.is_abs_path(path) {
135 return path
136 } else if path.starts_with('./') {
137 return os.join_path(os.getwd(), path[2..])
138 } else {
139 return os.join_path(os.getwd(), path)
140 }
141}
142
143// check file is v file and exists
144fn check_file(file string) {
145 if os.file_ext(file) !in ['.v', '.vv', '.vsh'] {
146 eprintln('the file `${file}` must be a v file or vsh file')
147 exit(1)
148 }
149 if !os.exists(file) {
150 eprintln('the v file `${file}` does not exist')
151 exit(1)
152 }
153}
154
155// generate json file with the same file name
156fn json_file(file string) string {
157 ast_json := json(file)
158 // support .v and .vsh file
159 file_name := file[0..(file.len - os.file_ext(file).len)]
160 json_file := file_name + '.json'
161 os.write_file(json_file, ast_json) or { panic(err) }
162 return json_file
163}
164
165// generate json string
166fn json(file string) string {
167 // use as permissive preferences as possible, so that `v ast`
168 // can print the AST of arbitrary V files, even .vsh or ones
169 // that require globals:
170 mut pref_ := &pref.Preferences{}
171 pref_.fill_with_defaults()
172 pref_.enable_globals = true
173 pref_.is_fmt = true
174
175 mut t := Tree{
176 root: create_object()
177 table: ast.new_table()
178 pref: pref_
179 }
180 // parse file with comment
181 mut ast_file := parser.parse_file(file, mut t.table, .parse_comments, t.pref)
182
183 if vast_context.check {
184 mut the_checker := checker.new_checker(t.table, pref_)
185 the_checker.check(mut ast_file)
186 }
187 t.root = t.ast_file(ast_file)
188 // generate the ast string
189 s := json_print(mut t.root)
190 return s
191}
192
193// the ast tree
194struct Tree {
195 pref &pref.Preferences = unsafe { nil }
196mut:
197 table &ast.Table = unsafe { nil }
198 root Node // the root of tree
199}
200
201// add item to object node
202@[inline]
203fn (mut node Node) add(key string, child &Node) {
204 if vast_context.hide_names.len > 0 && key in vast_context.hide_names {
205 return
206 }
207 if vast_context.is_terse {
208 return
209 }
210 if vast_context.skip_empty(child) {
211 return
212 }
213 add_item_to_object(mut node, key, child)
214}
215
216// add item to object node
217@[inline]
218fn (mut node Node) add_terse(key string, child &Node) {
219 if vast_context.hide_names.len > 0 && key in vast_context.hide_names {
220 return
221 }
222 if vast_context.skip_empty(child) {
223 return
224 }
225 add_item_to_object(mut node, key, child)
226}
227
228// add item to array node
229@[inline]
230fn (mut node Node) add_item(child &Node) {
231 if vast_context.skip_empty(child) {
232 return
233 }
234 add_item_to_array(mut node, child)
235}
236
237// string type node
238fn (t Tree) string_node(val string) &Node {
239 return create_string(val)
240}
241
242// number type node
243fn (t Tree) number_node(val int) &Node {
244 return create_number(val)
245}
246
247// bool type node
248fn (t Tree) bool_node(val bool) &Node {
249 if val {
250 return create_true()
251 } else {
252 return create_false()
253 }
254}
255
256// null type node
257fn (t Tree) null_node() &Node {
258 return create_null()
259}
260
261// type node
262fn (t Tree) type_node(typ ast.Type) &Node {
263 if typ == 0 {
264 return create_null()
265 } else {
266 type_name := t.table.get_type_name(typ)
267 return create_string(strings.repeat(`&`, typ.nr_muls()) + type_name)
268 }
269}
270
271// token type node
272fn (t Tree) token_node(tok_kind token.Kind) &Node {
273 return t.string_node('token:${int(tok_kind)}(${tok_kind.str()})')
274}
275
276// enum type node
277fn (t Tree) enum_node[T](value T) &Node {
278 return t.string_node('enum:${int(value)}(${value})')
279}
280
281// for [][]comment
282fn (t Tree) two_dimension_comment(node [][]ast.Comment) &Node {
283 mut comments := create_array()
284 for n in node {
285 mut comment_array := create_array()
286 for c in n {
287 comment_array.add_item(t.comment(c))
288 }
289 comments.add_item(comment_array)
290 }
291 return comments
292}
293
294// ast file root node
295fn (t Tree) ast_file(node ast.File) &Node {
296 mut obj := create_object()
297 obj.add_terse('ast_type', t.string_node('ast.File'))
298 obj.add_terse('path', t.string_node(node.path))
299 obj.add('path_base', t.string_node(node.path_base))
300 obj.add_terse('nr_lines', t.number_node(node.nr_lines))
301 obj.add_terse('nr_bytes', t.number_node(node.nr_bytes))
302 obj.add_terse('mod', t.mod(node.mod))
303 obj.add_terse('imports', t.imports(node.imports))
304 obj.add('global_scope', t.scope(node.global_scope))
305 obj.add('scope', t.scope(node.scope))
306 obj.add('errors', t.errors(node.errors))
307 obj.add('warnings', t.warnings(node.warnings))
308 obj.add('notices', t.notices(node.notices))
309 obj.add_terse('auto_imports', t.array_node_string(node.auto_imports))
310 mut symbol_obj := create_object()
311 for key, val in node.imported_symbols {
312 symbol_obj.add_terse(key, t.string_node(val))
313 }
314 obj.add_terse('imported_symbols', symbol_obj)
315 obj.add_terse('generic_fns', t.array_node_generic_fns(node.generic_fns))
316 obj.add_terse('embedded_files', t.array_node_embed_file(node.embedded_files))
317 obj.add_terse('global_labels', t.array_node_string(node.global_labels))
318 obj.add_terse('is_test', t.bool_node(node.is_test))
319 obj.add_terse('stmts', t.stmts(node.stmts))
320 return obj
321}
322
323// embed files
324fn (t Tree) embed_file(node ast.EmbeddedFile) &Node {
325 mut obj := create_object()
326 obj.add_terse('ast_type', t.string_node('EmbeddedFile'))
327 obj.add_terse('rpath', t.string_node(node.rpath))
328 obj.add('apath', t.string_node(node.apath))
329 obj.add('compression_type', t.string_node(node.compression_type))
330 obj.add('is_compressed', t.bool_node(node.is_compressed))
331 obj.add('len', t.number_node(node.len))
332 obj.add('bytes', t.array_node_u8(node.bytes))
333 return obj
334}
335
336// ast module node
337fn (t Tree) mod(node ast.Module) &Node {
338 mut obj := create_object()
339 obj.add_terse('ast_type', t.string_node('Module'))
340 obj.add_terse('name', t.string_node(node.name))
341 obj.add('short_name', t.string_node(node.short_name))
342 obj.add_terse('attrs', t.array_node_attr(node.attrs))
343 obj.add('pos', t.pos(node.pos))
344 obj.add('name_pos', t.pos(node.name_pos))
345 obj.add_terse('is_skipped', t.bool_node(node.is_skipped))
346 return obj
347}
348
349fn (t Tree) scope(scope &ast.Scope) &Node {
350 mut obj := create_object()
351 if unsafe { scope == nil } {
352 return obj
353 }
354 obj.add_terse('ast_type', t.string_node('Scope'))
355 obj.add_terse('parent', t.string_node(ptr_str(scope.parent)))
356 mut children_arr := create_array()
357 for s in scope.children {
358 mut children_obj := create_object()
359 children_obj.add_terse('parent', t.string_node(ptr_str(s.parent)))
360 children_obj.add('start_pos', t.number_node(s.start_pos))
361 children_obj.add('end_pos', t.number_node(s.end_pos))
362 children_arr.add_item(children_obj)
363 }
364 obj.add_terse('children', children_arr)
365 obj.add('start_pos', t.number_node(scope.start_pos))
366 obj.add('end_pos', t.number_node(scope.end_pos))
367 obj.add_terse('objects', t.objects(scope.objects))
368 obj.add_terse('struct_fields', t.array_node_scope_struct_field(scope.struct_fields))
369 return obj
370}
371
372fn (t Tree) scope_struct_field(node ast.ScopeStructField) &Node {
373 mut obj := create_object()
374 obj.add_terse('ast_type', t.string_node('ScopeStructField'))
375 obj.add_terse('struct_type', t.type_node(node.struct_type))
376 obj.add_terse('name', t.string_node(node.name))
377 obj.add_terse('typ', t.type_node(node.typ))
378 obj.add_terse('orig_type', t.type_node(node.orig_type))
379 obj.add('pos', t.pos(node.pos))
380 obj.add_terse('smartcasts', t.array_node_type(node.smartcasts))
381 return obj
382}
383
384fn (t Tree) objects(so map[string]ast.ScopeObject) &Node {
385 mut obj := create_object()
386 for key, val in so {
387 obj.add_terse(key, t.scope_object(val))
388 }
389 return obj
390}
391
392fn (t Tree) scope_object(node ast.ScopeObject) &Node {
393 obj := match node {
394 ast.EmptyScopeObject { create_object() }
395 ast.ConstField { t.const_field(node) }
396 ast.GlobalField { t.global_field(node) }
397 ast.Var { t.var(node) }
398 ast.AsmRegister { t.asm_register(node) }
399 }
400
401 return obj
402}
403
404fn (t Tree) imports(nodes []ast.Import) &Node {
405 mut import_array := create_array()
406 for node in nodes {
407 import_array.add_item(t.import_module(node))
408 }
409 return import_array
410}
411
412fn (t Tree) errors(errors_ []errors.Error) &Node {
413 mut errs := create_array()
414 for e in errors_ {
415 mut obj := create_object()
416 obj.add_terse('message', t.string_node(e.message))
417 obj.add_terse('file_path', t.string_node(e.file_path))
418 obj.add('pos', t.pos(e.pos))
419 obj.add('reporter', t.enum_node(e.reporter))
420 errs.add_item(obj)
421 }
422 return errs
423}
424
425fn (t Tree) warnings(warnings []errors.Warning) &Node {
426 mut warns := create_array()
427 for w in warnings {
428 mut obj := create_object()
429 obj.add_terse('message', t.string_node(w.message))
430 obj.add_terse('file_path', t.string_node(w.file_path))
431 obj.add('pos', t.pos(w.pos))
432 obj.add('reporter', t.enum_node(w.reporter))
433 warns.add_item(obj)
434 }
435 return warns
436}
437
438fn (t Tree) notices(notices []errors.Notice) &Node {
439 mut notice_array := create_array()
440 for n in notices {
441 mut obj := create_object()
442 obj.add_terse('message', t.string_node(n.message))
443 obj.add_terse('file_path', t.string_node(n.file_path))
444 obj.add('pos', t.pos(n.pos))
445 obj.add('reporter', t.enum_node(n.reporter))
446 notice_array.add_item(obj)
447 }
448 return notice_array
449}
450
451// stmt array node
452fn (t Tree) stmts(stmts []ast.Stmt) &Node {
453 mut stmt_array := create_array()
454 for s in stmts {
455 stmt_array.add_item(t.stmt(s))
456 }
457 return stmt_array
458}
459
460fn (t Tree) stmt(node ast.Stmt) &Node {
461 match node {
462 ast.Module { return t.mod(node) }
463 ast.Import { return t.import_module(node) }
464 ast.ConstDecl { return t.const_decl(node) }
465 ast.FnDecl { return t.fn_decl(node) }
466 ast.StructDecl { return t.struct_decl(node) }
467 ast.EnumDecl { return t.enum_decl(node) }
468 ast.InterfaceDecl { return t.interface_decl(node) }
469 ast.HashStmt { return t.hash_stmt(node) }
470 ast.ComptimeFor { return t.comptime_for(node) }
471 ast.GlobalDecl { return t.global_decl(node) }
472 ast.DeferStmt { return t.defer_stmt(node) }
473 ast.TypeDecl { return t.type_decl(node) }
474 ast.GotoLabel { return t.goto_label(node) }
475 ast.GotoStmt { return t.goto_stmt(node) }
476 ast.AssignStmt { return t.assign_stmt(node) }
477 ast.Return { return t.return_(node) }
478 ast.ForCStmt { return t.for_c_stmt(node) }
479 ast.ForStmt { return t.for_stmt(node) }
480 ast.ForInStmt { return t.for_in_stmt(node) }
481 ast.BranchStmt { return t.branch_stmt(node) }
482 ast.AssertStmt { return t.assert_stmt(node) }
483 ast.ExprStmt { return t.expr_stmt(node) }
484 ast.Block { return t.block(node) }
485 ast.SemicolonStmt { return t.semicolon_stmt(node) }
486 ast.SqlStmt { return t.sql_stmt(node) }
487 ast.AsmStmt { return t.asm_stmt(node) }
488 ast.NodeError { return t.node_error(node) }
489 ast.EmptyStmt { return t.empty_stmt(node) }
490 ast.DebuggerStmt { return t.debugger_stmt(node) }
491 }
492
493 return t.null_node()
494}
495
496fn (t Tree) import_module(node ast.Import) &Node {
497 mut obj := create_object()
498 obj.add_terse('ast_type', t.string_node('Import'))
499 obj.add_terse('source_name', t.string_node(node.source_name))
500 obj.add_terse('mod', t.string_node(node.mod))
501 obj.add_terse('alias', t.string_node(node.alias))
502 obj.add_terse('syms', t.array_node_import_symbol(node.syms))
503 obj.add('comments', t.array_node_comment(node.comments))
504 obj.add('next_comments', t.array_node_comment(node.next_comments))
505 obj.add('pos', t.pos(node.pos))
506 obj.add('mod_pos', t.pos(node.mod_pos))
507 obj.add('alias_pos', t.pos(node.alias_pos))
508 obj.add('syms_pos', t.pos(node.syms_pos))
509 return obj
510}
511
512fn (t Tree) import_symbol(node ast.ImportSymbol) &Node {
513 mut obj := create_object()
514 obj.add_terse('name', t.string_node(node.name))
515 obj.add('pos', t.pos(node.pos))
516 return obj
517}
518
519fn (t Tree) pos(p token.Pos) &Node {
520 mut obj := create_object()
521 obj.add('line_nr', t.number_node(p.line_nr))
522 obj.add('last_line', t.number_node(p.last_line))
523 obj.add('pos', t.number_node(p.pos))
524 obj.add('len', t.number_node(p.len))
525 return obj
526}
527
528fn (t Tree) comment(node ast.Comment) &Node {
529 mut obj := create_object()
530 obj.add_terse('ast_type', t.string_node('Comment'))
531 obj.add('text', t.string_node(node.text))
532 obj.add('is_multi', t.bool_node(node.is_multi))
533 obj.add('pos', t.pos(node.pos))
534 return obj
535}
536
537fn (t Tree) const_decl(node ast.ConstDecl) &Node {
538 mut obj := create_object()
539 obj.add_terse('ast_type', t.string_node('ConstDecl'))
540 obj.add_terse('is_pub', t.bool_node(node.is_pub))
541 obj.add_terse('is_block', t.bool_node(node.is_block))
542 obj.add_terse('fields', t.array_node_const_field(node.fields))
543 obj.add_terse('attrs', t.array_node_attr(node.attrs))
544 obj.add('end_comments', t.array_node_comment(node.end_comments))
545 obj.add('pos', t.pos(node.pos))
546 return obj
547}
548
549fn (t Tree) lambda_expr(node ast.LambdaExpr) &Node {
550 mut obj := create_object()
551 obj.add_terse('ast_type', t.string_node('LambdaExpr'))
552 obj.add_terse('params', t.array_node_ident(node.params))
553 obj.add_terse('pos_expr', t.pos(node.pos_expr))
554 obj.add_terse('expr', t.expr(node.expr))
555 obj.add_terse('pos_end', t.pos(node.pos_end))
556 obj.add('scope', t.number_node(int(node.scope)))
557 obj.add('func', t.number_node(int(node.func)))
558 obj.add_terse('is_checked', t.bool_node(node.is_checked))
559 obj.add_terse('typ', t.type_node(node.typ))
560 return obj
561}
562
563fn (t Tree) const_field(node ast.ConstField) &Node {
564 mut obj := create_object()
565 obj.add_terse('ast_type', t.string_node('ConstField'))
566 obj.add_terse('mod', t.string_node(node.mod))
567 obj.add_terse('name', t.string_node(node.name))
568 obj.add_terse('expr', t.expr(node.expr))
569 obj.add_terse('is_pub', t.bool_node(node.is_pub))
570 obj.add_terse('is_markused', t.bool_node(node.is_markused))
571 obj.add_terse('typ', t.type_node(node.typ))
572 obj.add('comments', t.array_node_comment(node.comments))
573 obj.add('comptime_expr_value', t.comptime_expr_value(node.comptime_expr_value))
574 obj.add('pos', t.pos(node.pos))
575 return obj
576}
577
578fn (t Tree) comptime_expr_value(node ast.ComptTimeConstValue) &Node {
579 match node {
580 ast.EmptyExpr {
581 return t.empty_expr(node)
582 }
583 string {
584 return t.string_node(node)
585 }
586 else {
587 return t.string_node(node.str())
588 }
589 }
590}
591
592// function declaration
593fn (t Tree) fn_decl(node ast.FnDecl) &Node {
594 mut obj := create_object()
595 obj.add_terse('ast_type', t.string_node('FnDecl'))
596 obj.add_terse('name', t.string_node(node.name))
597 obj.add_terse('short_name', t.string_node(node.short_name))
598 obj.add_terse('mod', t.string_node(node.mod))
599 obj.add_terse('kind', t.enum_node(node.kind))
600 obj.add_terse('is_deprecated', t.bool_node(node.is_deprecated))
601 obj.add_terse('is_pub', t.bool_node(node.is_pub))
602 obj.add_terse('is_c_variadic', t.bool_node(node.is_c_variadic))
603 obj.add_terse('is_c_extern', t.bool_node(node.is_c_extern))
604 obj.add_terse('is_variadic', t.bool_node(node.is_variadic))
605 obj.add('is_anon', t.bool_node(node.is_anon))
606 obj.add_terse('is_noreturn', t.bool_node(node.is_noreturn))
607 obj.add_terse('is_weak', t.bool_node(node.is_weak))
608 obj.add_terse('is_manualfree', t.bool_node(node.is_manualfree))
609 obj.add('is_main', t.bool_node(node.is_main))
610 obj.add('is_test', t.bool_node(node.is_test))
611 obj.add('is_conditional', t.bool_node(node.is_conditional))
612 obj.add_terse('is_exported', t.bool_node(node.is_exported))
613 obj.add('is_keep_alive', t.bool_node(node.is_keep_alive))
614 obj.add_terse('is_unsafe', t.bool_node(node.is_unsafe))
615 obj.add_terse('is_markused', t.bool_node(node.is_markused))
616 obj.add_terse('is_file_translated', t.bool_node(node.is_file_translated))
617 obj.add_terse('is_closure', t.bool_node(node.is_closure))
618 obj.add_terse('receiver', t.struct_field(node.receiver))
619 obj.add('receiver_pos', t.pos(node.receiver_pos))
620 obj.add_terse('is_method', t.bool_node(node.is_method))
621 obj.add_terse('is_static_type_method', t.bool_node(node.is_static_type_method))
622 obj.add('method_type_pos', t.pos(node.method_type_pos))
623 obj.add('method_idx', t.number_node(node.method_idx))
624 obj.add_terse('rec_mut', t.bool_node(node.rec_mut))
625 obj.add_terse('has_prev_newline', t.bool_node(node.has_prev_newline))
626 obj.add_terse('has_break_line', t.bool_node(node.has_break_line))
627 obj.add('rec_share', t.enum_node(node.rec_share))
628 obj.add_terse('language', t.enum_node(node.language))
629 obj.add('file_mode', t.enum_node(node.file_mode))
630 obj.add('no_body', t.bool_node(node.no_body))
631 obj.add('is_builtin', t.bool_node(node.is_builtin))
632 obj.add('file', t.string_node(node.file))
633 obj.add('is_direct_arr', t.bool_node(node.is_direct_arr))
634 obj.add('ctdefine_idx', t.number_node(node.ctdefine_idx))
635 obj.add('pos', t.pos(node.pos))
636 obj.add('end_pos', t.pos(node.end_pos))
637 obj.add('body_pos', t.pos(node.body_pos))
638 obj.add('return_type_pos', t.pos(node.return_type_pos))
639 obj.add('file', t.string_node(node.file))
640 obj.add('has_return', t.bool_node(node.has_return))
641 obj.add('should_be_skipped', t.bool_node(node.should_be_skipped))
642 obj.add('ninstances', t.number_node(node.ninstances))
643 obj.add_terse('has_await', t.bool_node(node.has_await))
644 obj.add_terse('return_type', t.type_node(node.return_type))
645 obj.add('source_file', t.number_node(int(node.source_file)))
646 obj.add('scope', t.number_node(int(node.scope)))
647 obj.add_terse('attrs', t.array_node_attr(node.attrs))
648 obj.add_terse('params', t.array_node_arg(node.params))
649 obj.add_terse('generic_names', t.array_node_string(node.generic_names))
650 obj.add_terse('stmts', t.array_node_stmt(node.stmts))
651 obj.add('comments', t.array_node_comment(node.comments))
652 obj.add('next_comments', t.array_node_comment(node.next_comments))
653 obj.add('label_names', t.array_node_string(node.label_names))
654 obj.add('defer_stmts', t.array_node_defer_stmt(node.defer_stmts))
655 return obj
656}
657
658fn (t Tree) anon_fn(node ast.AnonFn) &Node {
659 mut obj := create_object()
660 obj.add_terse('ast_type', t.string_node('AnonFn'))
661 obj.add_terse('decl', t.fn_decl(node.decl))
662 obj.add('inherited_vars', t.array_node_arg(node.inherited_vars))
663 obj.add_terse('typ', t.type_node(node.typ))
664 obj.add('has_ct_var', t.bool_node(node.has_ct_var))
665 mut symbol_obj := create_object()
666 for key, val in node.has_gen {
667 symbol_obj.add_terse(key.str(), t.bool_node(val))
668 }
669 obj.add_terse('has_gen', symbol_obj)
670 return obj
671}
672
673fn (t Tree) struct_decl(node ast.StructDecl) &Node {
674 mut obj := create_object()
675 obj.add_terse('ast_type', t.string_node('StructDecl'))
676 obj.add_terse('name', t.string_node(node.name))
677 obj.add_terse('is_pub', t.bool_node(node.is_pub))
678 obj.add('pub_pos', t.number_node(node.pub_pos))
679 obj.add('mut_pos', t.number_node(node.mut_pos))
680 obj.add('pub_mut_pos', t.number_node(node.pub_mut_pos))
681 obj.add('global_pos', t.number_node(node.global_pos))
682 obj.add('module_pos', t.number_node(node.module_pos))
683 obj.add_terse('language', t.enum_node(node.language))
684 obj.add_terse('is_union', t.bool_node(node.is_union))
685 obj.add('pos', t.pos(node.pos))
686 obj.add_terse('fields', t.array_node_struct_field(node.fields))
687 obj.add_terse('generic_types', t.array_node_type(node.generic_types))
688 obj.add_terse('attrs', t.array_node_attr(node.attrs))
689 obj.add('end_comments', t.array_node_comment(node.end_comments))
690 obj.add_terse('embeds', t.array_node_embed(node.embeds))
691 obj.add('is_implements', t.bool_node(node.is_implements))
692 obj.add_terse('implements_types', t.array_node_type_expr(node.implements_types))
693 return obj
694}
695
696fn (t Tree) struct_field(node ast.StructField) &Node {
697 mut obj := create_object()
698 obj.add_terse('ast_type', t.string_node('StructField'))
699 obj.add_terse('name', t.string_node(node.name))
700 obj.add_terse('typ', t.type_node(node.typ))
701 obj.add_terse('anon_struct_decl', t.struct_decl(node.anon_struct_decl))
702 obj.add_terse('unaliased_typ', t.type_node(node.unaliased_typ))
703 obj.add('type_pos', t.pos(node.type_pos))
704 obj.add('option_pos', t.pos(node.option_pos))
705 obj.add_terse('has_default_expr', t.bool_node(node.has_default_expr))
706 obj.add_terse('default_expr_typ', t.type_node(node.default_expr_typ))
707 obj.add_terse('default_expr', t.expr(node.default_expr))
708 obj.add_terse('is_pub', t.bool_node(node.is_pub))
709 obj.add_terse('is_mut', t.bool_node(node.is_mut))
710 obj.add_terse('is_global', t.bool_node(node.is_global))
711 obj.add_terse('is_volatile', t.bool_node(node.is_volatile))
712 obj.add_terse('is_deprecated', t.bool_node(node.is_deprecated))
713 obj.add_terse('attrs', t.array_node_attr(node.attrs))
714 obj.add('pre_comments', t.array_node_comment(node.pre_comments))
715 obj.add('comments', t.array_node_comment(node.comments))
716 obj.add('next_comments', t.array_node_comment(node.next_comments))
717 obj.add('pos', t.pos(node.pos))
718 obj.add_terse('i', t.number_node(node.i))
719 return obj
720}
721
722fn (t Tree) embed(node ast.Embed) &Node {
723 mut obj := create_object()
724 obj.add_terse('typ', t.type_node(node.typ))
725 obj.add('pos', t.pos(node.pos))
726 obj.add('comments', t.array_node_comment(node.comments))
727 return obj
728}
729
730fn (t Tree) enum_decl(node ast.EnumDecl) &Node {
731 mut obj := create_object()
732 obj.add_terse('ast_type', t.string_node('EnumDecl'))
733 obj.add_terse('name', t.string_node(node.name))
734 obj.add_terse('is_pub', t.bool_node(node.is_pub))
735 obj.add_terse('is_flag', t.bool_node(node.is_flag))
736 obj.add_terse('is_multi_allowed', t.bool_node(node.is_multi_allowed))
737 obj.add('pos', t.pos(node.pos))
738 obj.add_terse('fields', t.array_node_enum_field(node.fields))
739 obj.add('comments', t.array_node_comment(node.comments))
740 obj.add_terse('attrs', t.array_node_attr(node.attrs))
741 obj.add_terse('typ', t.type_node(node.typ))
742 obj.add_terse('enum_typ', t.type_node(node.enum_typ))
743 return obj
744}
745
746fn (t Tree) enum_field(node ast.EnumField) &Node {
747 mut obj := create_object()
748 obj.add_terse('ast_type', t.string_node('EnumField'))
749 obj.add_terse('name', t.string_node(node.name))
750 obj.add_terse('has_expr', t.bool_node(node.has_expr))
751 obj.add_terse('expr', t.expr(node.expr))
752 obj.add('pos', t.pos(node.pos))
753 obj.add('pre_comments', t.array_node_comment(node.pre_comments))
754 obj.add('comments', t.array_node_comment(node.comments))
755 obj.add('next_comments', t.array_node_comment(node.next_comments))
756 return obj
757}
758
759fn (t Tree) interface_decl(node ast.InterfaceDecl) &Node {
760 mut obj := create_object()
761 obj.add_terse('ast_type', t.string_node('InterfaceDecl'))
762 obj.add_terse('name', t.string_node(node.name))
763 obj.add_terse('typ', t.type_node(node.typ))
764 obj.add_terse('is_pub', t.bool_node(node.is_pub))
765 obj.add('mut_pos', t.number_node(node.mut_pos))
766 obj.add_terse('field_names', t.array_node_string(node.field_names))
767 obj.add_terse('methods', t.array_node_fn_decl(node.methods))
768 obj.add_terse('fields', t.array_node_struct_field(node.fields))
769 obj.add('pre_comments', t.array_node_comment(node.pre_comments))
770 obj.add('name_pos', t.pos(node.name_pos))
771 obj.add_terse('language', t.enum_node(node.language))
772 obj.add('pos', t.pos(node.pos))
773 obj.add('are_embeds_expanded', t.bool_node(node.are_embeds_expanded))
774 obj.add_terse('embeds', t.array_node_interface_embedding(node.embeds))
775 obj.add_terse('attrs', t.array_node_attr(node.attrs))
776 return obj
777}
778
779fn (t Tree) interface_embedding(node ast.InterfaceEmbedding) &Node {
780 mut obj := create_object()
781 obj.add_terse('ast_type', t.string_node('InterfaceEmbedding'))
782 obj.add_terse('name', t.string_node(node.name))
783 obj.add_terse('typ', t.type_node(node.typ))
784 obj.add('pos', t.pos(node.pos))
785 obj.add('comments', t.array_node_comment(node.comments))
786 return obj
787}
788
789fn (t Tree) attr(node ast.Attr) &Node {
790 mut obj := create_object()
791 obj.add_terse('ast_type', t.string_node('Attr'))
792 obj.add_terse('name', t.string_node(node.name))
793 obj.add_terse('has_arg', t.bool_node(node.has_arg))
794 obj.add_terse('arg', t.string_node(node.arg))
795 obj.add_terse('kind', t.enum_node(node.kind))
796 obj.add_terse('ct_opt', t.bool_node(node.ct_opt))
797 obj.add_terse('has_at', t.bool_node(node.has_at))
798 obj.add_terse('ct_expr', t.expr(node.ct_expr))
799 obj.add_terse('ct_evaled', t.bool_node(node.ct_evaled))
800 obj.add_terse('ct_skip', t.bool_node(node.ct_skip))
801 obj.add('pos', t.pos(node.pos))
802 return obj
803}
804
805fn (t Tree) hash_stmt(node ast.HashStmt) &Node {
806 mut obj := create_object()
807 obj.add_terse('ast_type', t.string_node('HashStmt'))
808 obj.add_terse('mod', t.string_node(node.mod))
809 obj.add_terse('val', t.string_node(node.val))
810 obj.add_terse('kind', t.string_node(node.kind))
811 obj.add_terse('main', t.string_node(node.main))
812 obj.add_terse('msg', t.string_node(node.msg))
813 obj.add_terse('is_use_once', t.bool_node(node.is_use_once))
814 obj.add_terse('ct_conds', t.array_node_expr(node.ct_conds))
815 obj.add_terse('source_file', t.string_node(node.source_file))
816 obj.add_terse('attrs', t.array_node_attr(node.attrs))
817 obj.add('pos', t.pos(node.pos))
818 return obj
819}
820
821fn (t Tree) comptime_for(node ast.ComptimeFor) &Node {
822 mut obj := create_object()
823 obj.add_terse('ast_type', t.string_node('ComptimeFor'))
824 obj.add_terse('val_var', t.string_node(node.val_var))
825 obj.add_terse('typ', t.type_node(node.typ))
826 obj.add_terse('kind', t.enum_node(node.kind))
827 obj.add('pos', t.pos(node.pos))
828 obj.add('typ_pos', t.pos(node.pos))
829 obj.add_terse('stmts', t.array_node_stmt(node.stmts))
830 return obj
831}
832
833fn (t Tree) global_decl(node ast.GlobalDecl) &Node {
834 mut obj := create_object()
835 obj.add_terse('ast_type', t.string_node('GlobalDecl'))
836 obj.add_terse('mod', t.string_node(node.mod))
837 obj.add_terse('attrs', t.array_node_attr(node.attrs))
838 obj.add_terse('is_block', t.bool_node(node.is_block))
839 obj.add_terse('fields', t.array_node_global_field(node.fields))
840 obj.add('pos', t.pos(node.pos))
841 obj.add('end_comments', t.array_node_comment(node.end_comments))
842 return obj
843}
844
845fn (t Tree) global_field(node ast.GlobalField) &Node {
846 mut obj := create_object()
847 obj.add_terse('ast_type', t.string_node('GlobalField'))
848 obj.add_terse('name', t.string_node(node.name))
849 obj.add_terse('expr', t.expr(node.expr))
850 obj.add_terse('typ', t.type_node(node.typ))
851 obj.add_terse('has_expr', t.bool_node(node.has_expr))
852 obj.add_terse('is_markused', t.bool_node(node.is_markused))
853 obj.add_terse('is_weak', t.bool_node(node.is_weak))
854 obj.add_terse('is_hidden', t.bool_node(node.is_hidden))
855 obj.add('comments', t.array_node_comment(node.comments))
856 obj.add('pos', t.pos(node.pos))
857 obj.add('typ_pos', t.pos(node.typ_pos))
858 return obj
859}
860
861fn (t Tree) defer_stmt(node ast.DeferStmt) &Node {
862 mut obj := create_object()
863 obj.add_terse('ast_type', t.string_node('DeferStmt'))
864 obj.add_terse('stmts', t.array_node_stmt(node.stmts))
865 obj.add_terse('defer_vars', t.array_node_ident(node.defer_vars))
866 obj.add_terse('ifdef', t.string_node(node.ifdef))
867 obj.add('idx_in_fn', t.number_node(node.idx_in_fn))
868 obj.add('pos', t.pos(node.pos))
869 return obj
870}
871
872fn (t Tree) type_decl(node ast.TypeDecl) &Node {
873 match node {
874 ast.AliasTypeDecl { return t.alias_type_decl(node) }
875 ast.FnTypeDecl { return t.fn_type_decl(node) }
876 ast.SumTypeDecl { return t.sum_type_decl(node) }
877 }
878}
879
880fn (t Tree) alias_type_decl(node ast.AliasTypeDecl) &Node {
881 mut obj := create_object()
882 obj.add_terse('ast_type', t.string_node('AliasTypeDecl'))
883 obj.add_terse('name', t.string_node(node.name))
884 obj.add_terse('mod', t.string_node(node.mod))
885 obj.add_terse('typ', t.type_node(node.typ))
886 obj.add_terse('parent_type', t.type_node(node.parent_type))
887 obj.add_terse('is_pub', t.bool_node(node.is_pub))
888 obj.add('comments', t.array_node_comment(node.comments))
889 obj.add('pos', t.pos(node.pos))
890 return obj
891}
892
893fn (t Tree) sum_type_decl(node ast.SumTypeDecl) &Node {
894 mut obj := create_object()
895 obj.add_terse('ast_type', t.string_node('SumTypeDecl'))
896 obj.add_terse('name', t.string_node(node.name))
897 obj.add_terse('mod', t.string_node(node.mod))
898 obj.add_terse('is_pub', t.bool_node(node.is_pub))
899 obj.add('pos', t.pos(node.pos))
900 obj.add_terse('typ', t.type_node(node.typ))
901 obj.add_terse('generic_types', t.array_node_type(node.generic_types))
902 obj.add_terse('variants', t.array_node_type_expr(node.variants))
903 obj.add('name_pos', t.pos(node.name_pos))
904 return obj
905}
906
907fn (t Tree) fn_type_decl(node ast.FnTypeDecl) &Node {
908 mut obj := create_object()
909 obj.add_terse('ast_type', t.string_node('FnTypeDecl'))
910 obj.add_terse('name', t.string_node(node.name))
911 obj.add_terse('mod', t.string_node(node.mod))
912 obj.add_terse('is_pub', t.bool_node(node.is_pub))
913 obj.add_terse('typ', t.type_node(node.typ))
914 obj.add('pos', t.pos(node.pos))
915 obj.add('comments', t.array_node_comment(node.comments))
916 return obj
917}
918
919fn (t Tree) arg(node ast.Param) &Node {
920 mut obj := create_object()
921 obj.add_terse('ast_type', t.string_node('Param'))
922 obj.add_terse('name', t.string_node(node.name))
923 obj.add_terse('typ', t.type_node(node.typ))
924 obj.add_terse('is_mut', t.bool_node(node.is_mut))
925 obj.add_terse('is_shared', t.bool_node(node.is_shared))
926 obj.add_terse('is_atomic', t.bool_node(node.is_atomic))
927 obj.add_terse('on_newline', t.bool_node(node.on_newline))
928 obj.add('pos', t.pos(node.pos))
929 obj.add('type_pos', t.pos(node.type_pos))
930 return obj
931}
932
933fn (t Tree) goto_label(node ast.GotoLabel) &Node {
934 mut obj := create_object()
935 obj.add_terse('ast_type', t.string_node('GotoLabel'))
936 obj.add_terse('name', t.string_node(node.name))
937 obj.add_terse('is_used', t.bool_node(node.is_used))
938 obj.add('pos', t.pos(node.pos))
939 return obj
940}
941
942fn (t Tree) goto_stmt(node ast.GotoStmt) &Node {
943 mut obj := create_object()
944 obj.add_terse('ast_type', t.string_node('GotoStmt'))
945 obj.add_terse('name', t.string_node(node.name))
946 obj.add('pos', t.pos(node.pos))
947 return obj
948}
949
950fn (t Tree) assign_stmt(node ast.AssignStmt) &Node {
951 mut obj := create_object()
952 obj.add_terse('ast_type', t.string_node('AssignStmt'))
953 obj.add_terse('op', t.token_node(node.op))
954 obj.add_terse('left', t.array_node_expr(node.left))
955 obj.add_terse('left_types', t.array_node_type(node.left_types))
956 obj.add_terse('right', t.array_node_expr(node.right))
957 obj.add_terse('right_types', t.array_node_type(node.left_types))
958 obj.add_terse('is_static', t.bool_node(node.is_static))
959 obj.add_terse('is_volatile', t.bool_node(node.is_volatile))
960 obj.add_terse('is_simple', t.bool_node(node.is_simple))
961 obj.add_terse('has_cross_var', t.bool_node(node.has_cross_var))
962 obj.add('pos', t.pos(node.pos))
963 obj.add('end_comments', t.array_node_comment(node.end_comments))
964 return obj
965}
966
967fn (t Tree) var(node ast.Var) &Node {
968 mut obj := create_object()
969 obj.add_terse('ast_type', t.string_node('Var'))
970 obj.add_terse('name', t.string_node(node.name))
971 obj.add_terse('typ', t.type_node(node.typ))
972 obj.add_terse('orig_type', t.type_node(node.orig_type))
973 obj.add_terse('expr', t.expr(node.expr))
974 obj.add_terse('is_arg', t.bool_node(node.is_arg))
975 obj.add_terse('is_mut', t.bool_node(node.is_mut))
976 obj.add_terse('is_static', t.bool_node(node.is_static))
977 obj.add_terse('is_volatile', t.bool_node(node.is_volatile))
978 obj.add('is_used', t.bool_node(node.is_used))
979 obj.add('is_changed', t.bool_node(node.is_changed))
980 obj.add_terse('ct_type_var', t.enum_node(node.ct_type_var))
981 obj.add('is_or', t.bool_node(node.is_or))
982 obj.add('is_tmp', t.bool_node(node.is_tmp))
983 obj.add('is_autofree_tmp', t.bool_node(node.is_autofree_tmp))
984 obj.add('is_auto_deref', t.bool_node(node.is_auto_deref))
985 obj.add('is_inherited', t.bool_node(node.is_inherited))
986 obj.add('has_inherited', t.bool_node(node.has_inherited))
987 obj.add('is_auto_heap', t.bool_node(node.is_auto_heap))
988 obj.add('is_stack_obj', t.bool_node(node.is_stack_obj))
989 obj.add_terse('share', t.enum_node(node.share))
990 obj.add('pos', t.pos(node.pos))
991 obj.add_terse('smartcasts', t.array_node_type(node.smartcasts))
992 return obj
993}
994
995fn (t Tree) return_(node ast.Return) &Node {
996 mut obj := create_object()
997 obj.add_terse('ast_type', t.string_node('Return'))
998 obj.add_terse('exprs', t.array_node_expr(node.exprs))
999 obj.add_terse('types', t.array_node_type(node.types))
1000 obj.add('pos', t.pos(node.pos))
1001 return obj
1002}
1003
1004fn (t Tree) for_c_stmt(node ast.ForCStmt) &Node {
1005 mut obj := create_object()
1006 obj.add_terse('ast_type', t.string_node('ForCStmt'))
1007 obj.add_terse('has_init', t.bool_node(node.has_init))
1008 obj.add_terse('init', t.stmt(node.init))
1009 obj.add_terse('has_cond', t.bool_node(node.has_cond))
1010 obj.add_terse('cond', t.expr(node.cond))
1011 obj.add_terse('has_inc', t.bool_node(node.has_inc))
1012 obj.add_terse('inc', t.stmt(node.inc))
1013 obj.add_terse('is_multi', t.bool_node(node.is_multi))
1014 obj.add_terse('label', t.string_node(node.label))
1015 obj.add('pos', t.pos(node.pos))
1016 obj.add('comments', t.array_node_comment(node.comments))
1017 obj.add('scope', t.number_node(int(node.scope)))
1018 obj.add_terse('stmts', t.array_node_stmt(node.stmts))
1019 return obj
1020}
1021
1022fn (t Tree) for_stmt(node ast.ForStmt) &Node {
1023 mut obj := create_object()
1024 obj.add_terse('ast_type', t.string_node('ForStmt'))
1025 obj.add_terse('cond', t.expr(node.cond))
1026 obj.add_terse('is_inf', t.bool_node(node.is_inf))
1027 obj.add_terse('label', t.string_node(node.label))
1028 obj.add('pos', t.pos(node.pos))
1029 obj.add('comments', t.array_node_comment(node.comments))
1030 obj.add('scope', t.number_node(int(node.scope)))
1031 obj.add_terse('stmts', t.array_node_stmt(node.stmts))
1032 return obj
1033}
1034
1035fn (t Tree) for_in_stmt(node ast.ForInStmt) &Node {
1036 mut obj := create_object()
1037 obj.add_terse('ast_type', t.string_node('ForInStmt'))
1038 obj.add_terse('key_var', t.string_node(node.key_var))
1039 obj.add_terse('val_var', t.string_node(node.val_var))
1040 obj.add_terse('cond', t.expr(node.cond))
1041 obj.add_terse('is_range', t.bool_node(node.is_range))
1042 obj.add_terse('high', t.expr(node.high))
1043 obj.add_terse('key_type', t.type_node(node.key_type))
1044 obj.add_terse('val_type', t.type_node(node.val_type))
1045 obj.add_terse('cond_type', t.type_node(node.cond_type))
1046 obj.add_terse('kind', t.enum_node(node.kind))
1047 obj.add_terse('val_is_mut', t.bool_node(node.val_is_mut))
1048 obj.add_terse('val_is_ref', t.bool_node(node.val_is_ref))
1049 obj.add_terse('label', t.string_node(node.label))
1050 obj.add('pos', t.pos(node.pos))
1051 obj.add('comments', t.array_node_comment(node.comments))
1052 obj.add('scope', t.number_node(int(node.scope)))
1053 obj.add_terse('stmts', t.array_node_stmt(node.stmts))
1054 return obj
1055}
1056
1057fn (t Tree) branch_stmt(node ast.BranchStmt) &Node {
1058 mut obj := create_object()
1059 obj.add_terse('ast_type', t.string_node('BranchStmt'))
1060 obj.add_terse('kind', t.token_node(node.kind))
1061 obj.add_terse('label', t.string_node(node.label))
1062 obj.add('pos', t.pos(node.pos))
1063 return obj
1064}
1065
1066fn (t Tree) assert_stmt(node ast.AssertStmt) &Node {
1067 mut obj := create_object()
1068 obj.add_terse('ast_type', t.string_node('AssertStmt'))
1069 obj.add_terse('expr', t.expr(node.expr))
1070 obj.add_terse('is_used', t.bool_node(node.is_used))
1071 if node.extra !is ast.EmptyExpr {
1072 obj.add_terse('extra', t.expr(node.extra))
1073 obj.add('extra_pos', t.pos(node.extra_pos))
1074 }
1075 obj.add('pos', t.pos(node.pos))
1076 return obj
1077}
1078
1079fn (t Tree) block(node ast.Block) &Node {
1080 mut obj := create_object()
1081 obj.add_terse('ast_type', t.string_node('Block'))
1082 obj.add_terse('stmts', t.array_node_stmt(node.stmts))
1083 obj.add_terse('is_unsafe', t.bool_node(node.is_unsafe))
1084 obj.add('pos', t.pos(node.pos))
1085 return obj
1086}
1087
1088fn (t Tree) comptime_call(node ast.ComptimeCall) &Node {
1089 mut obj := create_object()
1090 obj.add_terse('ast_type', t.string_node('ComptimeCall'))
1091 obj.add_terse('method_name', t.string_node(node.method_name))
1092 obj.add_terse('kind', t.enum_node(node.kind))
1093 obj.add_terse('left', t.expr(node.left))
1094 obj.add_terse('is_template', t.bool_node(node.is_template))
1095 obj.add_terse('is_veb', t.bool_node(node.is_veb))
1096 obj.add_terse('veb_tmpl', t.string_node(node.veb_tmpl.path))
1097 obj.add_terse('args_var', t.string_node(node.args_var))
1098 obj.add_terse('has_parens', t.bool_node(node.has_parens))
1099 obj.add_terse('embed_file', t.embed_file(node.embed_file))
1100 obj.add('method_pos', t.pos(node.method_pos))
1101 obj.add_terse('left_type', t.type_node(node.left_type))
1102 obj.add_terse('result_type', t.type_node(node.result_type))
1103 obj.add('scope', t.scope(node.scope))
1104 obj.add_terse('env_value', t.string_node(node.env_value))
1105 obj.add_terse('compile_value', t.string_node(node.compile_value))
1106 obj.add('pos', t.pos(node.pos))
1107 obj.add_terse('args', t.array_node_call_arg(node.args))
1108 obj.add_terse('or_block', t.or_expr(node.or_block))
1109 return obj
1110}
1111
1112fn (t Tree) comptime_selector(node ast.ComptimeSelector) &Node {
1113 mut obj := create_object()
1114 obj.add_terse('ast_type', t.string_node('ComptimeSelector'))
1115 obj.add_terse('has_parens', t.bool_node(node.has_parens))
1116 obj.add_terse('left', t.expr(node.left))
1117 obj.add_terse('field_expr', t.expr(node.field_expr))
1118 obj.add_terse('left_type', t.type_node(node.left_type))
1119 obj.add_terse('typ', t.type_node(node.typ))
1120 obj.add('pos', t.pos(node.pos))
1121 return obj
1122}
1123
1124fn (t Tree) expr_stmt(node ast.ExprStmt) &Node {
1125 mut obj := create_object()
1126 obj.add_terse('ast_type', t.string_node('ExprStmt'))
1127 obj.add_terse('typ', t.type_node(node.typ))
1128 obj.add_terse('is_expr', t.bool_node(node.is_expr))
1129 obj.add_terse('expr', t.expr(node.expr))
1130 obj.add('pos', t.pos(node.pos))
1131 obj.add('comments', t.array_node_comment(node.comments))
1132 return obj
1133}
1134
1135// expr
1136fn (t Tree) expr(expr ast.Expr) &Node {
1137 match expr {
1138 ast.IntegerLiteral {
1139 return t.integer_literal(expr)
1140 }
1141 ast.FloatLiteral {
1142 return t.float_literal(expr)
1143 }
1144 ast.StringLiteral {
1145 return t.string_literal(expr)
1146 }
1147 ast.CharLiteral {
1148 return t.char_literal(expr)
1149 }
1150 ast.BoolLiteral {
1151 return t.bool_literal(expr)
1152 }
1153 ast.StringInterLiteral {
1154 return t.string_inter_literal(expr)
1155 }
1156 ast.EnumVal {
1157 return t.enum_val(expr)
1158 }
1159 ast.Assoc {
1160 return t.assoc(expr)
1161 }
1162 ast.AtExpr {
1163 return t.at_expr(expr)
1164 }
1165 ast.CastExpr {
1166 return t.cast_expr(expr)
1167 }
1168 ast.AsCast {
1169 return t.as_cast(expr)
1170 }
1171 ast.TypeNode {
1172 return t.type_expr(expr)
1173 }
1174 ast.SizeOf {
1175 return t.size_of(expr)
1176 }
1177 ast.IsRefType {
1178 return t.is_ref_type(expr)
1179 }
1180 ast.PrefixExpr {
1181 return t.prefix_expr(expr)
1182 }
1183 ast.InfixExpr {
1184 return t.infix_expr(expr)
1185 }
1186 ast.IndexExpr {
1187 return t.index_expr(expr)
1188 }
1189 ast.PostfixExpr {
1190 return t.postfix_expr(expr)
1191 }
1192 ast.SelectorExpr {
1193 return t.selector_expr(expr)
1194 }
1195 ast.RangeExpr {
1196 return t.range_expr(expr)
1197 }
1198 ast.IfExpr {
1199 return t.if_expr(expr)
1200 }
1201 ast.Ident {
1202 return t.ident(expr)
1203 }
1204 ast.CallExpr {
1205 return t.call_expr(expr)
1206 }
1207 ast.OrExpr {
1208 return t.or_expr(expr)
1209 }
1210 ast.StructInit {
1211 return t.struct_init(expr)
1212 }
1213 ast.ArrayInit {
1214 return t.array_init(expr)
1215 }
1216 ast.MapInit {
1217 return t.map_init(expr)
1218 }
1219 ast.None {
1220 return t.none_expr(expr)
1221 }
1222 ast.ParExpr {
1223 return t.par_expr(expr)
1224 }
1225 ast.IfGuardExpr {
1226 return t.if_guard_expr(expr)
1227 }
1228 ast.MatchExpr {
1229 return t.match_expr(expr)
1230 }
1231 ast.ConcatExpr {
1232 return t.concat_expr(expr)
1233 }
1234 ast.TypeOf {
1235 return t.type_of(expr)
1236 }
1237 ast.Likely {
1238 return t.likely(expr)
1239 }
1240 ast.SqlExpr {
1241 return t.sql_expr(expr)
1242 }
1243 ast.ComptimeCall {
1244 return t.comptime_call(expr)
1245 }
1246 ast.ComptimeSelector {
1247 return t.comptime_selector(expr)
1248 }
1249 ast.LockExpr {
1250 return t.lock_expr(expr)
1251 }
1252 ast.UnsafeExpr {
1253 return t.unsafe_expr(expr)
1254 }
1255 ast.ChanInit {
1256 return t.chan_init(expr)
1257 }
1258 ast.SelectExpr {
1259 return t.select_expr(expr)
1260 }
1261 ast.Comment {
1262 return t.comment(expr)
1263 }
1264 ast.AnonFn {
1265 return t.anon_fn(expr)
1266 }
1267 ast.ArrayDecompose {
1268 return t.array_decompose(expr)
1269 }
1270 ast.GoExpr {
1271 return t.go_expr(expr)
1272 }
1273 ast.SpawnExpr {
1274 return t.spawn_expr(expr)
1275 }
1276 ast.OffsetOf {
1277 return t.offset_of(expr)
1278 }
1279 ast.DumpExpr {
1280 return t.dump_expr(expr)
1281 }
1282 ast.LambdaExpr {
1283 return t.lambda_expr(expr)
1284 }
1285 ast.NodeError {
1286 return t.node_error(expr)
1287 }
1288 ast.EmptyExpr {
1289 return t.empty_expr(expr)
1290 }
1291 ast.Nil {
1292 return t.nil_expr(expr)
1293 }
1294 else {
1295 // println('unknown expr')
1296 return t.null_node()
1297 }
1298 }
1299}
1300
1301fn (t Tree) integer_literal(node ast.IntegerLiteral) &Node {
1302 mut obj := create_object()
1303 obj.add_terse('ast_type', t.string_node('IntegerLiteral'))
1304 obj.add_terse('val', t.string_node(node.val))
1305 obj.add('pos', t.pos(node.pos))
1306 return obj
1307}
1308
1309fn (t Tree) float_literal(node ast.FloatLiteral) &Node {
1310 mut obj := create_object()
1311 obj.add_terse('ast_type', t.string_node('FloatLiteral'))
1312 obj.add_terse('val', t.string_node(node.val))
1313 obj.add('pos', t.pos(node.pos))
1314 return obj
1315}
1316
1317fn (t Tree) string_literal(node ast.StringLiteral) &Node {
1318 mut obj := create_object()
1319 obj.add_terse('ast_type', t.string_node('StringLiteral'))
1320 obj.add_terse('val', t.string_node(node.val))
1321 obj.add_terse('is_raw', t.bool_node(node.is_raw))
1322 obj.add_terse('language', t.enum_node(node.language))
1323 obj.add('pos', t.pos(node.pos))
1324 return obj
1325}
1326
1327fn (t Tree) char_literal(node ast.CharLiteral) &Node {
1328 mut obj := create_object()
1329 obj.add_terse('ast_type', t.string_node('CharLiteral'))
1330 obj.add_terse('val', t.string_node(node.val))
1331 obj.add('pos', t.pos(node.pos))
1332 return obj
1333}
1334
1335fn (t Tree) bool_literal(node ast.BoolLiteral) &Node {
1336 mut obj := create_object()
1337 obj.add_terse('ast_type', t.string_node('BoolLiteral'))
1338 obj.add_terse('val', t.bool_node(node.val))
1339 obj.add('pos', t.pos(node.pos))
1340 return obj
1341}
1342
1343fn (t Tree) string_inter_literal(node ast.StringInterLiteral) &Node {
1344 mut obj := create_object()
1345 obj.add_terse('ast_type', t.string_node('StringInterLiteral'))
1346 obj.add_terse('vals', t.array_node_string(node.vals))
1347 obj.add_terse('exprs', t.array_node_expr(node.exprs))
1348 obj.add_terse('expr_types', t.array_node_type(node.expr_types))
1349 obj.add_terse('fwidths', t.array_node_int(node.fwidths))
1350 obj.add_terse('precisions', t.array_node_int(node.precisions))
1351 obj.add_terse('pluss', t.array_node_bool(node.pluss))
1352 obj.add_terse('fills', t.array_node_bool(node.fills))
1353 obj.add_terse('fmt_poss', t.array_node_position(node.fmt_poss))
1354 obj.add_terse('fmts', t.array_node_u8(node.fmts))
1355 obj.add_terse('need_fmts', t.array_node_bool(node.need_fmts))
1356 obj.add('pos', t.pos(node.pos))
1357 return obj
1358}
1359
1360fn (t Tree) enum_val(node ast.EnumVal) &Node {
1361 mut obj := create_object()
1362 obj.add_terse('ast_type', t.string_node('EnumVal'))
1363 obj.add_terse('enum_name', t.string_node(node.enum_name))
1364 obj.add_terse('mod', t.string_node(node.mod))
1365 obj.add_terse('val', t.string_node(node.val))
1366 obj.add_terse('typ', t.type_node(node.typ))
1367 obj.add('pos', t.pos(node.pos))
1368 return obj
1369}
1370
1371fn (t Tree) assoc(node ast.Assoc) &Node {
1372 mut obj := create_object()
1373 obj.add_terse('ast_type', t.string_node('Assoc'))
1374 obj.add_terse('var_name', t.string_node(node.var_name))
1375 obj.add_terse('fields', t.array_node_string(node.fields))
1376 obj.add_terse('exprs', t.array_node_expr(node.exprs))
1377 obj.add_terse('typ', t.type_node(node.typ))
1378 obj.add('pos', t.pos(node.pos))
1379 obj.add('scope', t.number_node(int(node.scope)))
1380 return obj
1381}
1382
1383fn (t Tree) at_expr(node ast.AtExpr) &Node {
1384 mut obj := create_object()
1385 obj.add_terse('ast_type', t.string_node('AtExpr'))
1386 obj.add_terse('name', t.string_node(node.name))
1387 obj.add('pos', t.pos(node.pos))
1388 obj.add_terse('kind', t.enum_node(node.kind))
1389 obj.add_terse('val', t.string_node(node.val))
1390 return obj
1391}
1392
1393fn (t Tree) cast_expr(node ast.CastExpr) &Node {
1394 mut obj := create_object()
1395 obj.add_terse('ast_type', t.string_node('CastExpr'))
1396 obj.add_terse('typ', t.type_node(node.typ))
1397 obj.add_terse('ityp', t.number_node(int(node.typ)))
1398 obj.add_terse('typname', t.string_node(node.typname))
1399 obj.add_terse('has_arg', t.bool_node(node.has_arg))
1400 obj.add_terse('arg', t.expr(node.arg))
1401 obj.add_terse('expr_type', t.type_node(node.expr_type))
1402 obj.add_terse('expr', t.expr(node.expr))
1403 obj.add('pos', t.pos(node.pos))
1404 return obj
1405}
1406
1407fn (t Tree) as_cast(node ast.AsCast) &Node {
1408 mut obj := create_object()
1409 obj.add_terse('ast_type', t.string_node('AsCast'))
1410 obj.add_terse('expr', t.expr(node.expr))
1411 obj.add_terse('typ', t.type_node(node.typ))
1412 obj.add_terse('expr_type', t.type_node(node.expr_type))
1413 obj.add('pos', t.pos(node.pos))
1414 return obj
1415}
1416
1417fn (t Tree) type_expr(node ast.TypeNode) &Node {
1418 mut obj := create_object()
1419 obj.add_terse('ast_type', t.string_node('TypeNode'))
1420 obj.add_terse('typ', t.type_node(node.typ))
1421 obj.add('pos', t.pos(node.pos))
1422 return obj
1423}
1424
1425fn (t Tree) size_of(node ast.SizeOf) &Node {
1426 mut obj := create_object()
1427 obj.add_terse('ast_type', t.string_node('SizeOf'))
1428 obj.add_terse('guessed_type', t.bool_node(node.guessed_type))
1429 obj.add_terse('is_type', t.bool_node(node.is_type))
1430 obj.add_terse('typ', t.type_node(node.typ))
1431 obj.add_terse('expr', t.expr(node.expr))
1432 obj.add('pos', t.pos(node.pos))
1433 return obj
1434}
1435
1436fn (t Tree) is_ref_type(node ast.IsRefType) &Node {
1437 mut obj := create_object()
1438 obj.add_terse('ast_type', t.string_node('IsRefType'))
1439 obj.add_terse('guessed_type', t.bool_node(node.guessed_type))
1440 obj.add_terse('is_type', t.bool_node(node.is_type))
1441 obj.add_terse('typ', t.type_node(node.typ))
1442 obj.add_terse('expr', t.expr(node.expr))
1443 obj.add('pos', t.pos(node.pos))
1444 return obj
1445}
1446
1447fn (t Tree) prefix_expr(node ast.PrefixExpr) &Node {
1448 mut obj := create_object()
1449 obj.add_terse('ast_type', t.string_node('PrefixExpr'))
1450 obj.add_terse('op', t.token_node(node.op))
1451 obj.add_terse('right', t.expr(node.right))
1452 obj.add_terse('right_type', t.type_node(node.right_type))
1453 obj.add_terse('or_block', t.or_expr(node.or_block))
1454 obj.add_terse('is_option', t.bool_node(node.is_option))
1455 obj.add('pos', t.pos(node.pos))
1456 return obj
1457}
1458
1459fn (t Tree) infix_expr(node ast.InfixExpr) &Node {
1460 mut obj := create_object()
1461 obj.add_terse('ast_type', t.string_node('InfixExpr'))
1462 obj.add_terse('op', t.token_node(node.op))
1463 obj.add_terse('left', t.expr(node.left))
1464 obj.add_terse('left_type', t.type_node(node.left_type))
1465 obj.add_terse('right', t.expr(node.right))
1466 obj.add_terse('right_type', t.type_node(node.right_type))
1467 obj.add_terse('promoted_type', t.type_node(node.promoted_type))
1468 obj.add('auto_locked', t.string_node(node.auto_locked))
1469 obj.add_terse('or_block', t.or_expr(node.or_block))
1470 obj.add_terse('is_stmt', t.bool_node(node.is_stmt))
1471 obj.add_terse('ct_left_value_evaled', t.bool_node(node.ct_left_value_evaled))
1472 obj.add_terse('ct_left_value', t.comptime_expr_value(node.ct_left_value))
1473 obj.add_terse('ct_right_value_evaled', t.bool_node(node.ct_right_value_evaled))
1474 obj.add_terse('ct_right_value', t.comptime_expr_value(node.ct_right_value))
1475 obj.add('pos', t.pos(node.pos))
1476 return obj
1477}
1478
1479fn (t Tree) index_expr(node ast.IndexExpr) &Node {
1480 mut obj := create_object()
1481 obj.add_terse('ast_type', t.string_node('IndexExpr'))
1482 obj.add_terse('left', t.expr(node.left))
1483 obj.add_terse('left_type', t.type_node(node.left_type))
1484 obj.add_terse('index', t.expr(node.index))
1485 obj.add_terse('is_setter', t.bool_node(node.is_setter))
1486 obj.add_terse('is_direct', t.bool_node(node.is_direct))
1487 obj.add_terse('or_expr', t.or_expr(node.or_expr))
1488 obj.add_terse('typ', t.type_node(node.typ))
1489 obj.add('pos', t.pos(node.pos))
1490 return obj
1491}
1492
1493fn (t Tree) postfix_expr(node ast.PostfixExpr) &Node {
1494 mut obj := create_object()
1495 obj.add_terse('ast_type', t.string_node('PostfixExpr'))
1496 obj.add_terse('op', t.token_node(node.op))
1497 obj.add_terse('expr', t.expr(node.expr))
1498 obj.add('auto_locked', t.string_node(node.auto_locked))
1499 obj.add('pos', t.pos(node.pos))
1500 obj.add('is_c2v_prefix', t.bool_node(node.is_c2v_prefix))
1501 return obj
1502}
1503
1504fn (t Tree) selector_expr(node ast.SelectorExpr) &Node {
1505 mut obj := create_object()
1506 obj.add_terse('ast_type', t.string_node('SelectorExpr'))
1507 obj.add_terse('expr', t.expr(node.expr))
1508 obj.add_terse('expr_type', t.type_node(node.expr_type))
1509 obj.add_terse('field_name', t.string_node(node.field_name))
1510 obj.add_terse('typ', t.type_node(node.typ))
1511 obj.add_terse('name_type', t.type_node(node.name_type))
1512 obj.add_terse('or_block', t.or_expr(node.or_block))
1513 obj.add_terse('gkind_field', t.enum_node(node.gkind_field))
1514 obj.add_terse('from_embed_types', t.array_node_type(node.from_embed_types))
1515 obj.add_terse('has_hidden_receiver', t.bool_node(node.has_hidden_receiver))
1516 obj.add_terse('next_token', t.token_node(node.next_token))
1517 obj.add_terse('is_field_typ', t.bool_node(node.is_field_typ))
1518 obj.add('pos', t.pos(node.pos))
1519 obj.add('scope', t.number_node(int(node.scope)))
1520 return obj
1521}
1522
1523fn (t Tree) range_expr(node ast.RangeExpr) &Node {
1524 mut obj := create_object()
1525 obj.add_terse('ast_type', t.string_node('RangeExpr'))
1526 obj.add_terse('low', t.expr(node.low))
1527 obj.add_terse('high', t.expr(node.high))
1528 obj.add_terse('has_high', t.bool_node(node.has_high))
1529 obj.add_terse('has_low', t.bool_node(node.has_low))
1530 obj.add_terse('typ', t.type_node(node.typ))
1531 obj.add('pos', t.pos(node.pos))
1532 return obj
1533}
1534
1535fn (t Tree) if_expr(node ast.IfExpr) &Node {
1536 mut obj := create_object()
1537 obj.add_terse('ast_type', t.string_node('IfExpr'))
1538 obj.add_terse('is_comptime', t.bool_node(node.is_comptime))
1539 obj.add_terse('tok_kind', t.token_node(node.tok_kind))
1540 obj.add_terse('branches', t.array_node_if_branch(node.branches))
1541 obj.add_terse('left', t.expr(node.left))
1542 obj.add_terse('typ', t.type_node(node.typ))
1543 obj.add_terse('has_else', t.bool_node(node.has_else))
1544 obj.add_terse('is_expr', t.bool_node(node.is_expr))
1545 obj.add('pos', t.pos(node.pos))
1546 obj.add('post_comments', t.array_node_comment(node.post_comments))
1547 return obj
1548}
1549
1550fn (t Tree) if_branch(node ast.IfBranch) &Node {
1551 mut obj := create_object()
1552 obj.add_terse('ast_type', t.string_node('IfBranch'))
1553 obj.add_terse('cond', t.expr(node.cond))
1554 obj.add('pos', t.pos(node.pos))
1555 obj.add('body_pos', t.pos(node.body_pos))
1556 obj.add_terse('stmts', t.array_node_stmt(node.stmts))
1557 obj.add('scope', t.number_node(int(node.scope)))
1558 obj.add('comments', t.array_node_comment(node.comments))
1559 return obj
1560}
1561
1562fn (t Tree) ident(node ast.Ident) &Node {
1563 mut obj := create_object()
1564 obj.add_terse('ast_type', t.string_node('Ident'))
1565 obj.add_terse('mod', t.string_node(node.mod))
1566 obj.add_terse('name', t.string_node(node.name))
1567 obj.add_terse('language', t.enum_node(node.language))
1568 obj.add_terse('is_mut', t.bool_node(node.is_mut))
1569 obj.add_terse('comptime', t.bool_node(node.comptime))
1570 obj.add_terse('tok_kind', t.token_node(node.tok_kind))
1571 obj.add_terse('kind', t.enum_node(node.kind))
1572 obj.add_terse('info', t.ident_info(node.info))
1573 obj.add('pos', t.pos(node.pos))
1574 obj.add('mut_pos', t.pos(node.mut_pos))
1575 obj.add('obj', t.scope_object(node.obj))
1576 obj.add('scope', t.number_node(int(node.scope)))
1577 obj.add_terse('or_expr', t.or_expr(node.or_expr))
1578 return obj
1579}
1580
1581fn (t Tree) ident_info(node ast.IdentInfo) &Node {
1582 match node {
1583 ast.IdentVar { return t.ident_var(node) }
1584 ast.IdentFn { return t.ident_fn(node) }
1585 }
1586}
1587
1588fn (t Tree) ident_var(node ast.IdentVar) &Node {
1589 mut obj := create_object()
1590 obj.add_terse('ast_type', t.string_node('IdentVar'))
1591 obj.add_terse('typ', t.type_node(node.typ))
1592 obj.add_terse('is_mut', t.bool_node(node.is_mut))
1593 obj.add_terse('is_static', t.bool_node(node.is_static))
1594 obj.add_terse('is_volatile', t.bool_node(node.is_volatile))
1595 obj.add_terse('is_option', t.bool_node(node.is_option))
1596 obj.add_terse('share', t.enum_node(node.share))
1597 return obj
1598}
1599
1600fn (t Tree) ident_fn(node ast.IdentFn) &Node {
1601 mut obj := create_object()
1602 obj.add_terse('ast_type', t.string_node('IdentFn'))
1603 obj.add_terse('typ', t.type_node(node.typ))
1604 return obj
1605}
1606
1607fn (t Tree) call_expr(node ast.CallExpr) &Node {
1608 mut obj := create_object()
1609 obj.add_terse('ast_type', t.string_node('CallExpr'))
1610 obj.add_terse('mod', t.string_node(node.mod))
1611 obj.add_terse('name', t.string_node(node.name))
1612 obj.add_terse('const_name', t.string_node(node.const_name))
1613 obj.add_terse('language', t.enum_node(node.language))
1614 obj.add_terse('kind', t.enum_node(node.kind))
1615 obj.add_terse('left_type', t.type_node(node.left_type))
1616 obj.add_terse('receiver_type', t.type_node(node.receiver_type))
1617 obj.add_terse('return_type', t.type_node(node.return_type))
1618 obj.add_terse('fn_var_type', t.type_node(node.fn_var_type))
1619 obj.add_terse('left', t.expr(node.left))
1620 obj.add_terse('is_method', t.bool_node(node.is_method))
1621 obj.add_terse('is_field', t.bool_node(node.is_field))
1622 obj.add_terse('is_fn_var', t.bool_node(node.is_fn_var))
1623 obj.add_terse('is_fn_a_const', t.bool_node(node.is_fn_a_const))
1624 obj.add('is_keep_alive', t.bool_node(node.is_keep_alive))
1625 obj.add_terse('is_noreturn', t.bool_node(node.is_noreturn))
1626 obj.add_terse('is_ctor_new', t.bool_node(node.is_ctor_new))
1627 obj.add_terse('is_return_used', t.bool_node(node.is_return_used))
1628 obj.add_terse('is_static_method', t.bool_node(node.is_static_method))
1629 obj.add_terse('is_variadic', t.bool_node(node.is_variadic))
1630 obj.add('should_be_skipped', t.bool_node(node.should_be_skipped))
1631 obj.add_terse('free_receiver', t.bool_node(node.free_receiver))
1632 obj.add('scope', t.number_node(int(node.scope)))
1633 obj.add_terse('args', t.array_node_call_arg(node.args))
1634 obj.add_terse('expected_arg_types', t.array_node_type(node.expected_arg_types))
1635 obj.add_terse('concrete_types', t.array_node_type(node.concrete_types))
1636 obj.add_terse('or_block', t.or_expr(node.or_block))
1637 obj.add('concrete_list_pos', t.pos(node.concrete_list_pos))
1638 obj.add_terse('from_embed_types', t.array_node_type(node.from_embed_types))
1639 obj.add('comments', t.array_node_comment(node.comments))
1640 obj.add('pos', t.pos(node.pos))
1641 obj.add('name_pos', t.pos(node.name_pos))
1642 return obj
1643}
1644
1645fn (t Tree) call_arg(node ast.CallArg) &Node {
1646 mut obj := create_object()
1647 obj.add_terse('ast_type', t.string_node('CallArg'))
1648 obj.add_terse('typ', t.type_node(node.typ))
1649 obj.add_terse('is_mut', t.bool_node(node.is_mut))
1650 obj.add_terse('share', t.enum_node(node.share))
1651 obj.add_terse('expr', t.expr(node.expr))
1652 obj.add_terse('should_be_ptr', t.bool_node(node.should_be_ptr))
1653 obj.add('is_tmp_autofree', t.bool_node(node.is_tmp_autofree))
1654 obj.add('pos', t.pos(node.pos))
1655 obj.add('comments', t.array_node_comment(node.comments))
1656 return obj
1657}
1658
1659fn (t Tree) or_expr(node ast.OrExpr) &Node {
1660 mut obj := create_object()
1661 obj.add_terse('ast_type', t.string_node('OrExpr'))
1662 obj.add_terse('stmts', t.array_node_stmt(node.stmts))
1663 obj.add_terse('kind', t.enum_node(node.kind))
1664 obj.add('pos', t.pos(node.pos))
1665 obj.add('scope', t.number_node(int(node.scope)))
1666 return obj
1667}
1668
1669fn (t Tree) struct_init(node ast.StructInit) &Node {
1670 mut obj := create_object()
1671 obj.add_terse('ast_type', t.string_node('StructInit'))
1672 obj.add_terse('typ', t.type_node(node.typ))
1673 obj.add_terse('no_keys', t.bool_node(node.no_keys))
1674 obj.add_terse('is_short_syntax', t.bool_node(node.is_short_syntax))
1675 obj.add_terse('is_anon', t.bool_node(node.is_anon))
1676 obj.add_terse('unresolved', t.bool_node(node.unresolved))
1677 obj.add_terse('has_update_expr', t.bool_node(node.has_update_expr))
1678 obj.add_terse('update_expr', t.expr(node.update_expr))
1679 obj.add_terse('update_expr_type', t.type_node(node.update_expr_type))
1680 obj.add('pos', t.pos(node.pos))
1681 obj.add('name_pos', t.pos(node.name_pos))
1682 obj.add('update_expr_comments', t.array_node_comment(node.update_expr_comments))
1683 obj.add('update_expr_pos', t.pos(node.update_expr_pos))
1684 obj.add_terse('init_fields', t.array_node_struct_init_field(node.init_fields))
1685 obj.add('pre_comments', t.array_node_comment(node.pre_comments))
1686 return obj
1687}
1688
1689fn (t Tree) struct_init_field(node ast.StructInitField) &Node {
1690 mut obj := create_object()
1691 obj.add_terse('ast_type', t.string_node('StructInitField'))
1692 obj.add_terse('name', t.string_node(node.name))
1693 obj.add_terse('expr', t.expr(node.expr))
1694 obj.add_terse('typ', t.type_node(node.typ))
1695 obj.add_terse('expected_type', t.type_node(node.expected_type))
1696 obj.add_terse('parent_type', t.type_node(node.parent_type))
1697 obj.add('pre_comments', t.array_node_comment(node.pre_comments))
1698 obj.add('end_comments', t.array_node_comment(node.end_comments))
1699 obj.add('next_comments', t.array_node_comment(node.next_comments))
1700 obj.add('pos', t.pos(node.pos))
1701 obj.add('name_pos', t.pos(node.name_pos))
1702 return obj
1703}
1704
1705fn (t Tree) array_init(node ast.ArrayInit) &Node {
1706 mut obj := create_object()
1707 obj.add_terse('ast_type', t.string_node('ArrayInit'))
1708 obj.add_terse('typ', t.type_node(node.typ))
1709 obj.add_terse('elem_type', t.type_node(node.elem_type))
1710 obj.add_terse('exprs', t.array_node_expr(node.exprs))
1711 obj.add('ecmnts', t.two_dimension_comment(node.ecmnts))
1712 obj.add('pre_cmnts', t.array_node_comment(node.pre_cmnts))
1713 obj.add('elem_type_pos', t.pos(node.elem_type_pos))
1714 obj.add_terse('is_fixed', t.bool_node(node.is_fixed))
1715 obj.add_terse('is_option', t.bool_node(node.is_option))
1716 obj.add_terse('has_val', t.bool_node(node.has_val))
1717 obj.add_terse('mod', t.string_node(node.mod))
1718 obj.add_terse('len_expr', t.expr(node.len_expr))
1719 obj.add_terse('cap_expr', t.expr(node.cap_expr))
1720 obj.add_terse('init_expr', t.expr(node.init_expr))
1721 obj.add_terse('has_len', t.bool_node(node.has_len))
1722 obj.add_terse('has_cap', t.bool_node(node.has_cap))
1723 obj.add_terse('has_init', t.bool_node(node.has_init))
1724 obj.add_terse('has_index', t.bool_node(node.has_index))
1725 obj.add_terse('expr_types', t.array_node_type(node.expr_types))
1726 obj.add('pos', t.pos(node.pos))
1727 return obj
1728}
1729
1730fn (t Tree) map_init(node ast.MapInit) &Node {
1731 mut obj := create_object()
1732 obj.add_terse('ast_type', t.string_node('MapInit'))
1733 obj.add_terse('typ', t.type_node(node.typ))
1734 obj.add_terse('key_type', t.type_node(node.key_type))
1735 obj.add_terse('value_type', t.type_node(node.value_type))
1736 obj.add_terse('keys', t.array_node_expr(node.keys))
1737 obj.add_terse('vals', t.array_node_expr(node.vals))
1738 obj.add_terse('val_types', t.array_node_type(node.val_types))
1739 obj.add_terse('has_update_expr', t.bool_node(node.has_update_expr))
1740 obj.add_terse('update_expr', t.expr(node.update_expr))
1741 obj.add('pos', t.pos(node.pos))
1742 obj.add('pre_cmnts', t.array_node_comment(node.pre_cmnts))
1743 obj.add('comments', t.two_dimension_comment(node.comments))
1744 obj.add('update_expr_comments', t.array_node_comment(node.update_expr_comments))
1745 obj.add('update_expr_pos', t.pos(node.update_expr_pos))
1746 return obj
1747}
1748
1749fn (t Tree) none_expr(node ast.None) &Node {
1750 mut obj := create_object()
1751 obj.add_terse('ast_type', t.string_node('None'))
1752 obj.add('pos', t.pos(node.pos))
1753 return obj
1754}
1755
1756fn (t Tree) par_expr(node ast.ParExpr) &Node {
1757 mut obj := create_object()
1758 obj.add_terse('ast_type', t.string_node('ParExpr'))
1759 obj.add_terse('expr', t.expr(node.expr))
1760 obj.add('pos', t.pos(node.pos))
1761 return obj
1762}
1763
1764fn (t Tree) if_guard_expr(node ast.IfGuardExpr) &Node {
1765 mut obj := create_object()
1766 obj.add_terse('ast_type', t.string_node('IfGuardExpr'))
1767 obj.add_terse('vars', t.array_node_if_guard_var(node.vars))
1768 obj.add_terse('expr', t.expr(node.expr))
1769 obj.add_terse('expr_type', t.type_node(node.expr_type))
1770 return obj
1771}
1772
1773fn (t Tree) if_guard_var(node ast.IfGuardVar) &Node {
1774 mut obj := create_object()
1775 obj.add_terse('ast_type', t.string_node('IfGuardVar'))
1776 obj.add_terse('name', t.string_node(node.name))
1777 obj.add_terse('is_mut', t.bool_node(node.is_mut))
1778 obj.add('pos', t.pos(node.pos))
1779 return obj
1780}
1781
1782fn (t Tree) match_expr(node ast.MatchExpr) &Node {
1783 mut obj := create_object()
1784 obj.add_terse('ast_type', t.string_node('MatchExpr'))
1785 obj.add_terse('tok_kind', t.token_node(node.tok_kind))
1786 obj.add_terse('cond', t.expr(node.cond))
1787 obj.add_terse('cond_type', t.type_node(node.cond_type))
1788 obj.add_terse('return_type', t.type_node(node.return_type))
1789 obj.add_terse('expected_type', t.type_node(node.expected_type))
1790 obj.add_terse('is_sum_type', t.bool_node(node.is_sum_type))
1791 obj.add_terse('is_expr', t.bool_node(node.is_expr))
1792 obj.add('pos', t.pos(node.pos))
1793 obj.add_terse('branches', t.array_node_match_branch(node.branches))
1794 obj.add('comments', t.array_node_comment(node.comments))
1795 return obj
1796}
1797
1798fn (t Tree) match_branch(node ast.MatchBranch) &Node {
1799 mut obj := create_object()
1800 obj.add_terse('ast_type', t.string_node('MatchBranch'))
1801 obj.add('ecmnts', t.two_dimension_comment(node.ecmnts))
1802 obj.add_terse('stmts', t.array_node_stmt(node.stmts))
1803 obj.add_terse('is_else', t.bool_node(node.is_else))
1804 obj.add('pos', t.pos(node.pos))
1805 obj.add_terse('post_comments', t.array_node_comment(node.post_comments))
1806 obj.add('branch_pos', t.pos(node.branch_pos))
1807 obj.add_terse('exprs', t.array_node_expr(node.exprs))
1808 obj.add('scope', t.number_node(int(node.scope)))
1809 return obj
1810}
1811
1812fn (t Tree) concat_expr(node ast.ConcatExpr) &Node {
1813 mut obj := create_object()
1814 obj.add_terse('ast_type', t.string_node('ConcatExpr'))
1815 obj.add_terse('vals', t.array_node_expr(node.vals))
1816 obj.add_terse('return_type', t.type_node(node.return_type))
1817 obj.add('pos', t.pos(node.pos))
1818 return obj
1819}
1820
1821fn (t Tree) type_of(node ast.TypeOf) &Node {
1822 mut obj := create_object()
1823 obj.add_terse('ast_type', t.string_node('TypeOf'))
1824 obj.add_terse('is_type', t.bool_node(node.is_type))
1825 obj.add_terse('typ', t.type_node(node.typ))
1826 obj.add_terse('expr', t.expr(node.expr))
1827 obj.add('pos', t.pos(node.pos))
1828 return obj
1829}
1830
1831fn (t Tree) likely(node ast.Likely) &Node {
1832 mut obj := create_object()
1833 obj.add_terse('ast_type', t.string_node('Likely'))
1834 obj.add_terse('expr', t.expr(node.expr))
1835 obj.add_terse('is_likely', t.bool_node(node.is_likely))
1836 obj.add('pos', t.pos(node.pos))
1837 return obj
1838}
1839
1840fn (t Tree) sql_expr(node ast.SqlExpr) &Node {
1841 mut obj := create_object()
1842 obj.add_terse('ast_type', t.string_node('SqlExpr'))
1843 obj.add_terse('type', t.type_node(node.typ))
1844 obj.add_terse('aggregate_kind', t.string_node('${node.aggregate_kind}'))
1845 obj.add_terse('aggregate_field', t.string_node(node.aggregate_field))
1846 obj.add_terse('db_expr', t.expr(node.db_expr))
1847 obj.add_terse('table_expr', t.type_expr(node.table_expr))
1848 obj.add_terse('has_where', t.bool_node(node.has_where))
1849 obj.add_terse('where_expr', t.expr(node.where_expr))
1850 obj.add_terse('has_order', t.bool_node(node.has_order))
1851 obj.add_terse('order_expr', t.expr(node.order_expr))
1852 obj.add_terse('has_desc', t.bool_node(node.has_desc))
1853 obj.add_terse('is_array', t.bool_node(node.is_array))
1854 obj.add_terse('or_expr', t.or_expr(node.or_expr))
1855 obj.add('pos', t.pos(node.pos))
1856 obj.add_terse('typ', t.type_node(node.typ))
1857 obj.add_terse('has_limit', t.bool_node(node.has_limit))
1858 obj.add_terse('limit_expr', t.expr(node.limit_expr))
1859 obj.add_terse('has_offset', t.bool_node(node.has_offset))
1860 obj.add_terse('offset_expr', t.expr(node.offset_expr))
1861 obj.add_terse('fields', t.array_node_struct_field(node.fields))
1862 mut sub_struct_map := create_object()
1863 for key, val in node.sub_structs {
1864 sub_struct_map.add_terse(key.str(), t.sql_expr(val))
1865 }
1866 obj.add_terse('sub_structs', sub_struct_map)
1867 return obj
1868}
1869
1870fn (t Tree) semicolon_stmt(node ast.SemicolonStmt) &Node {
1871 mut obj := create_object()
1872 obj.add('pos', t.pos(node.pos))
1873 return obj
1874}
1875
1876fn (t Tree) sql_stmt(node ast.SqlStmt) &Node {
1877 mut obj := create_object()
1878 obj.add_terse('ast_type', t.string_node('SqlStmt'))
1879 obj.add_terse('db_expr_type', t.type_node(node.db_expr_type))
1880 obj.add_terse('db_expr', t.expr(node.db_expr))
1881 obj.add_terse('or_expr', t.or_expr(node.or_expr))
1882 obj.add('pos', t.pos(node.pos))
1883 obj.add_terse('lines', t.array_node_sql_stmt_line(node.lines))
1884 return obj
1885}
1886
1887fn (t Tree) sql_stmt_line(node ast.SqlStmtLine) &Node {
1888 mut obj := create_object()
1889 obj.add_terse('ast_type', t.string_node('SqlStmtLine'))
1890 obj.add_terse('kind', t.enum_node(node.kind))
1891 obj.add_terse('table_expr', t.type_expr(node.table_expr))
1892 obj.add_terse('object_var', t.string_node(node.object_var))
1893 obj.add_terse('where_expr', t.expr(node.where_expr))
1894 obj.add_terse('fields', t.array_node_struct_field(node.fields))
1895 obj.add_terse('updated_columns', t.array_node_string(node.updated_columns))
1896 obj.add_terse('update_exprs', t.array_node_expr(node.update_exprs))
1897 obj.add('pos', t.pos(node.pos))
1898 obj.add('pre_comments', t.array_node_comment(node.pre_comments))
1899 obj.add('end_comments', t.array_node_comment(node.end_comments))
1900
1901 mut sub_struct_map := create_object()
1902 for key, val in node.sub_structs {
1903 sub_struct_map.add_terse(key.str(), t.sql_stmt_line(val))
1904 }
1905 obj.add_terse('sub_structs', sub_struct_map)
1906 return obj
1907}
1908
1909fn (t Tree) lock_expr(expr ast.LockExpr) &Node {
1910 mut obj := create_object()
1911 obj.add_terse('ast_type', t.string_node('LockExpr'))
1912 obj.add_terse('is_expr', t.bool_node(expr.is_expr))
1913 obj.add_terse('typ', t.type_node(expr.typ))
1914 obj.add('pos', t.pos(expr.pos))
1915 obj.add_terse('stmts', t.array_node_stmt(expr.stmts))
1916 obj.add_terse('lockeds', t.array_node_expr(expr.lockeds))
1917 obj.add_terse('r_lock', t.array_node_bool(expr.is_rlock))
1918 return obj
1919}
1920
1921fn (t Tree) unsafe_expr(expr ast.UnsafeExpr) &Node {
1922 mut obj := create_object()
1923 obj.add_terse('ast_type', t.string_node('UnsafeExpr'))
1924 obj.add_terse('expr', t.expr(expr.expr))
1925 obj.add('pos', t.pos(expr.pos))
1926 return obj
1927}
1928
1929fn (t Tree) chan_init(expr ast.ChanInit) &Node {
1930 mut obj := create_object()
1931 obj.add_terse('ast_type', t.string_node('ChanInit'))
1932 obj.add_terse('has_cap', t.bool_node(expr.has_cap))
1933 obj.add_terse('cap_expr', t.expr(expr.cap_expr))
1934 obj.add_terse('typ', t.type_node(expr.typ))
1935 obj.add_terse('elem_type', t.type_node(expr.elem_type))
1936 obj.add('pos', t.pos(expr.pos))
1937 obj.add('elem_type_pos', t.pos(expr.elem_type_pos))
1938 return obj
1939}
1940
1941fn (t Tree) select_expr(expr ast.SelectExpr) &Node {
1942 mut obj := create_object()
1943 obj.add_terse('ast_type', t.string_node('SelectExpr'))
1944 obj.add_terse('branches', t.array_node_select_branch(expr.branches))
1945 obj.add_terse('is_expr', t.bool_node(expr.is_expr))
1946 obj.add_terse('has_exception', t.bool_node(expr.has_exception))
1947 obj.add_terse('expected_type', t.type_node(expr.expected_type))
1948 obj.add('pos', t.pos(expr.pos))
1949 return obj
1950}
1951
1952fn (t Tree) select_branch(expr ast.SelectBranch) &Node {
1953 mut obj := create_object()
1954 obj.add_terse('ast_type', t.string_node('SelectBranch'))
1955 obj.add_terse('stmt', t.stmt(expr.stmt))
1956 obj.add_terse('stmts', t.array_node_stmt(expr.stmts))
1957 obj.add('pos', t.pos(expr.pos))
1958 obj.add('comment', t.comment(expr.comment))
1959 obj.add_terse('is_else', t.bool_node(expr.is_else))
1960 obj.add_terse('is_timeout', t.bool_node(expr.is_timeout))
1961 obj.add('post_comments', t.array_node_comment(expr.post_comments))
1962 return obj
1963}
1964
1965fn (t Tree) array_decompose(expr ast.ArrayDecompose) &Node {
1966 mut obj := create_object()
1967 obj.add_terse('ast_type', t.string_node('ArrayDecompose'))
1968 obj.add_terse('expr', t.expr(expr.expr))
1969 obj.add_terse('expr_type', t.type_node(expr.expr_type))
1970 obj.add_terse('arg_type', t.type_node(expr.arg_type))
1971 obj.add('pos', t.pos(expr.pos))
1972 return obj
1973}
1974
1975fn (t Tree) go_expr(expr ast.GoExpr) &Node {
1976 mut obj := create_object()
1977 obj.add_terse('ast_type', t.string_node('GoExpr'))
1978 obj.add_terse('call_expr', t.call_expr(expr.call_expr))
1979 obj.add_terse('is_expr', t.bool_node(expr.is_expr))
1980 obj.add('pos', t.pos(expr.pos))
1981 return obj
1982}
1983
1984fn (t Tree) spawn_expr(expr ast.SpawnExpr) &Node {
1985 mut obj := create_object()
1986 obj.add_terse('ast_type', t.string_node('SpawnExpr'))
1987 obj.add_terse('call_expr', t.call_expr(expr.call_expr))
1988 obj.add_terse('is_expr', t.bool_node(expr.is_expr))
1989 obj.add('pos', t.pos(expr.pos))
1990 return obj
1991}
1992
1993fn (t Tree) offset_of(expr ast.OffsetOf) &Node {
1994 mut obj := create_object()
1995 obj.add_terse('ast_type', t.string_node('OffsetOf'))
1996 obj.add_terse('struct_type', t.type_node(expr.struct_type))
1997 obj.add_terse('field', t.string_node('field'))
1998 obj.add('pos', t.pos(expr.pos))
1999 return obj
2000}
2001
2002fn (t Tree) dump_expr(expr ast.DumpExpr) &Node {
2003 mut obj := create_object()
2004 obj.add_terse('ast_type', t.string_node('DumpExpr'))
2005 obj.add_terse('expr', t.expr(expr.expr))
2006 obj.add_terse('expr_type', t.type_node(expr.expr_type))
2007 obj.add('pos', t.pos(expr.pos))
2008 return obj
2009}
2010
2011fn (t Tree) node_error(expr ast.NodeError) &Node {
2012 mut obj := create_object()
2013 obj.add_terse('ast_type', t.string_node('NodeError'))
2014 obj.add_terse('idx', t.number_node(expr.idx))
2015 obj.add('pos', t.pos(expr.pos))
2016 return obj
2017}
2018
2019fn (t Tree) empty_expr(_expr ast.EmptyExpr) &Node {
2020 mut obj := create_object()
2021 obj.add_terse('ast_type', t.string_node('EmptyExpr'))
2022 // obj.add('x', t.number_node(expr.x))
2023 return obj
2024}
2025
2026fn (t Tree) empty_stmt(node ast.EmptyStmt) &Node {
2027 mut obj := create_object()
2028 obj.add_terse('ast_type', t.string_node('EmptyStmt'))
2029 obj.add('pos', t.pos(node.pos))
2030 return obj
2031}
2032
2033fn (t Tree) debugger_stmt(node ast.DebuggerStmt) &Node {
2034 mut obj := create_object()
2035 obj.add_terse('ast_type', t.string_node('DebuggerStmt'))
2036 obj.add('pos', t.pos(node.pos))
2037 return obj
2038}
2039
2040fn (t Tree) nil_expr(node ast.Nil) &Node {
2041 mut obj := create_object()
2042 obj.add_terse('ast_type', t.string_node('Nil'))
2043 obj.add('pos', t.pos(node.pos))
2044 return obj
2045}
2046
2047fn (t Tree) asm_stmt(node ast.AsmStmt) &Node {
2048 mut obj := create_object()
2049 obj.add_terse('ast_type', t.string_node('AsmStmt'))
2050 obj.add_terse('arch', t.enum_node(node.arch))
2051 obj.add_terse('is_basic', t.bool_node(node.is_basic))
2052 obj.add_terse('is_volatile', t.bool_node(node.is_volatile))
2053 obj.add_terse('is_goto', t.bool_node(node.is_goto))
2054 obj.add('scope', t.scope(node.scope))
2055 // obj.add('scope', t.number_node(int(node.scope)))
2056 obj.add('pos', t.pos(node.pos))
2057 obj.add_terse('clobbered', t.array_node_asm_clobbered(node.clobbered))
2058 obj.add_terse('templates', t.array_node_asm_template(node.templates))
2059 obj.add_terse('output', t.array_node_asm_io(node.output))
2060 obj.add_terse('input', t.array_node_asm_io(node.input))
2061 obj.add_terse('global_labels', t.array_node_string(node.global_labels))
2062 obj.add_terse('local_labels', t.array_node_string(node.local_labels))
2063 return obj
2064}
2065
2066fn (t Tree) asm_register(node ast.AsmRegister) &Node {
2067 mut obj := create_object()
2068 obj.add_terse('ast_type', t.string_node('AsmRegister'))
2069 obj.add_terse('name', t.string_node(node.name))
2070 obj.add_terse('typ', t.type_node(node.typ))
2071 obj.add_terse('size', t.number_node(node.size))
2072 return obj
2073}
2074
2075fn (t Tree) asm_template(node ast.AsmTemplate) &Node {
2076 mut obj := create_object()
2077 obj.add_terse('ast_type', t.string_node('AsmTemplate'))
2078 obj.add_terse('name', t.string_node(node.name))
2079 obj.add_terse('is_label', t.bool_node(node.is_label))
2080 obj.add_terse('is_directive', t.bool_node(node.is_directive))
2081 obj.add_terse('args', t.array_node_asm_arg(node.args))
2082 obj.add('comments', t.array_node_comment(node.comments))
2083 obj.add('pos', t.pos(node.pos))
2084 return obj
2085}
2086
2087fn (t Tree) asm_addressing(node ast.AsmAddressing) &Node {
2088 mut obj := create_object()
2089 obj.add_terse('ast_type', t.string_node('AsmAddressing'))
2090 obj.add_terse('scale', t.number_node(node.scale))
2091 obj.add_terse('mode', t.enum_node(node.mode))
2092 obj.add_terse('segment', t.string_node(node.segment))
2093 obj.add_terse('displacement', t.asm_arg(node.displacement))
2094 obj.add_terse('base', t.asm_arg(node.base))
2095 obj.add_terse('index', t.asm_arg(node.index))
2096 obj.add('pos', t.pos(node.pos))
2097 return obj
2098}
2099
2100fn (t Tree) asm_arg(node ast.AsmArg) &Node {
2101 match node {
2102 ast.AsmAddressing {
2103 return t.asm_addressing(node)
2104 }
2105 ast.AsmAlias {
2106 return t.asm_alias(node)
2107 }
2108 ast.AsmDisp {
2109 return t.asm_disp(node)
2110 }
2111 ast.AsmRegister {
2112 return t.asm_register(node)
2113 }
2114 ast.BoolLiteral {
2115 return t.bool_literal(node)
2116 }
2117 ast.CharLiteral {
2118 return t.char_literal(node)
2119 }
2120 ast.FloatLiteral {
2121 return t.float_literal(node)
2122 }
2123 ast.IntegerLiteral {
2124 return t.integer_literal(node)
2125 }
2126 string {
2127 return t.string_node(node)
2128 }
2129 }
2130}
2131
2132fn (t Tree) asm_alias(node ast.AsmAlias) &Node {
2133 mut obj := create_object()
2134 obj.add_terse('ast_type', t.string_node('AsmAlias'))
2135 obj.add_terse('name', t.string_node(node.name))
2136 obj.add('pos', t.pos(node.pos))
2137 return obj
2138}
2139
2140fn (t Tree) asm_disp(node ast.AsmDisp) &Node {
2141 mut obj := create_object()
2142 obj.add_terse('ast_type', t.string_node('AsmDisp'))
2143 obj.add_terse('val', t.string_node(node.val))
2144 obj.add('pos', t.pos(node.pos))
2145 return obj
2146}
2147
2148fn (t Tree) asm_clobbered(node ast.AsmClobbered) &Node {
2149 mut obj := create_object()
2150 obj.add_terse('ast_type', t.string_node('AsmClobbered'))
2151 obj.add_terse('reg', t.asm_register(node.reg))
2152 obj.add('comments', t.array_node_comment(node.comments))
2153 return obj
2154}
2155
2156fn (t Tree) asm_io(node ast.AsmIO) &Node {
2157 mut obj := create_object()
2158 obj.add_terse('ast_type', t.string_node('AsmIO'))
2159 obj.add_terse('alias', t.string_node(node.alias))
2160 obj.add_terse('constraint', t.string_node(node.constraint))
2161 obj.add_terse('expr', t.expr(node.expr))
2162 obj.add_terse('typ', t.type_node(node.typ))
2163 obj.add('comments', t.array_node_comment(node.comments))
2164 obj.add('pos', t.pos(node.pos))
2165 return obj
2166}
2167
2168// do not support yet by vlang
2169// fn (t Tree) array_node1[T](nodes []T, method_name string) &Node {
2170// mut arr := create_array()
2171
2172// // call method dynamically, V do not support yet
2173// // error: todo: not a string literal
2174
2175// // for node in nodes {
2176// // arr.add_item(t.$method_name(node))
2177// // }
2178
2179// // temp
2180// $for method in Tree.methods {
2181// if method.name == method_name {
2182// for node in nodes {
2183// res := t.$method(node)
2184// arr.add_item(res) // TODO,waiting for bug fixed
2185// }
2186// }
2187// }
2188// return arr
2189// }
2190
2191// do not support yet by vlang
2192// fn (t Tree) array_node2[T](nodes []T) &Node {
2193// mut arr := create_array()
2194
2195// for node in nodes {
2196// match node {
2197// string {
2198// arr.add_item(t.string_node(node))
2199// }
2200// ast.Comment {
2201// arr.add_item(t.comment(node))
2202// }
2203// ast.ConstField {
2204// arr.add_item(t.const_field(node))
2205// }
2206// else {
2207// panic('unknown array type')
2208// }
2209// }
2210// }
2211
2212// return arr
2213// }
2214
2215// list all the different type of array node,temporarily
2216fn (t Tree) array_node_string(nodes []string) &Node {
2217 mut arr := create_array()
2218 for node in nodes {
2219 arr.add_item(t.string_node(node))
2220 }
2221 return arr
2222}
2223
2224fn (t Tree) array_node_position(nodes []token.Pos) &Node {
2225 mut arr := create_array()
2226 for node in nodes {
2227 arr.add_item(t.pos(node))
2228 }
2229 return arr
2230}
2231
2232fn (t Tree) array_node_if_branch(nodes []ast.IfBranch) &Node {
2233 mut arr := create_array()
2234 for node in nodes {
2235 arr.add_item(t.if_branch(node))
2236 }
2237 return arr
2238}
2239
2240fn (t Tree) array_node_fn_decl(nodes []ast.FnDecl) &Node {
2241 mut arr := create_array()
2242 for node in nodes {
2243 arr.add_item(t.fn_decl(node))
2244 }
2245 return arr
2246}
2247
2248fn (t Tree) array_node_generic_fns(nodes []&ast.FnDecl) &Node {
2249 mut arr := create_array()
2250 for node in nodes {
2251 arr.add_item(t.fn_decl(node))
2252 }
2253 return arr
2254}
2255
2256fn (t Tree) array_node_embed_file(nodes []ast.EmbeddedFile) &Node {
2257 mut arr := create_array()
2258 for node in nodes {
2259 arr.add_item(t.embed_file(node))
2260 }
2261 return arr
2262}
2263
2264fn (t Tree) array_node_attr(nodes []ast.Attr) &Node {
2265 mut arr := create_array()
2266 for node in nodes {
2267 arr.add_item(t.attr(node))
2268 }
2269 return arr
2270}
2271
2272fn (t Tree) array_node_scope_struct_field(nodes map[string]ast.ScopeStructField) &Node {
2273 mut arr := create_array()
2274 for _, node in nodes {
2275 arr.add_item(t.scope_struct_field(node))
2276 }
2277 return arr
2278}
2279
2280fn (t Tree) array_node_type(nodes []ast.Type) &Node {
2281 mut arr := create_array()
2282 for node in nodes {
2283 arr.add_item(t.type_node(node))
2284 }
2285 return arr
2286}
2287
2288fn (t Tree) array_node_type_expr(nodes []ast.TypeNode) &Node {
2289 mut arr := create_array()
2290 for node in nodes {
2291 arr.add_item(t.type_expr(node))
2292 }
2293 return arr
2294}
2295
2296fn (t Tree) array_node_import_symbol(nodes []ast.ImportSymbol) &Node {
2297 mut arr := create_array()
2298 for node in nodes {
2299 arr.add_item(t.import_symbol(node))
2300 }
2301 return arr
2302}
2303
2304fn (t Tree) array_node_comment(nodes []ast.Comment) &Node {
2305 mut arr := create_array()
2306 for node in nodes {
2307 arr.add_item(t.comment(node))
2308 }
2309 return arr
2310}
2311
2312fn (t Tree) array_node_const_field(nodes []ast.ConstField) &Node {
2313 mut arr := create_array()
2314 for node in nodes {
2315 arr.add_item(t.const_field(node))
2316 }
2317 return arr
2318}
2319
2320fn (t Tree) array_node_arg(nodes []ast.Param) &Node {
2321 mut arr := create_array()
2322 for node in nodes {
2323 arr.add_item(t.arg(node))
2324 }
2325 return arr
2326}
2327
2328fn (t Tree) array_node_stmt(nodes []ast.Stmt) &Node {
2329 mut arr := create_array()
2330 for node in nodes {
2331 arr.add_item(t.stmt(node))
2332 }
2333 return arr
2334}
2335
2336fn (t Tree) array_node_defer_stmt(nodes []ast.DeferStmt) &Node {
2337 mut arr := create_array()
2338 for node in nodes {
2339 arr.add_item(t.defer_stmt(node))
2340 }
2341 return arr
2342}
2343
2344fn (t Tree) array_node_struct_field(nodes []ast.StructField) &Node {
2345 mut arr := create_array()
2346 for node in nodes {
2347 arr.add_item(t.struct_field(node))
2348 }
2349 return arr
2350}
2351
2352fn (t Tree) array_node_embed(nodes []ast.Embed) &Node {
2353 mut arr := create_array()
2354 for node in nodes {
2355 arr.add_item(t.embed(node))
2356 }
2357 return arr
2358}
2359
2360fn (t Tree) array_node_enum_field(nodes []ast.EnumField) &Node {
2361 mut arr := create_array()
2362 for node in nodes {
2363 arr.add_item(t.enum_field(node))
2364 }
2365 return arr
2366}
2367
2368fn (t Tree) array_node_global_field(nodes []ast.GlobalField) &Node {
2369 mut arr := create_array()
2370 for node in nodes {
2371 arr.add_item(t.global_field(node))
2372 }
2373 return arr
2374}
2375
2376fn (t Tree) array_node_expr(nodes []ast.Expr) &Node {
2377 mut arr := create_array()
2378 for node in nodes {
2379 arr.add_item(t.expr(node))
2380 }
2381 return arr
2382}
2383
2384fn (t Tree) array_node_call_arg(nodes []ast.CallArg) &Node {
2385 mut arr := create_array()
2386 for node in nodes {
2387 arr.add_item(t.call_arg(node))
2388 }
2389 return arr
2390}
2391
2392fn (t Tree) array_node_int(nodes []int) &Node {
2393 mut arr := create_array()
2394 for node in nodes {
2395 arr.add_item(t.number_node(node))
2396 }
2397 return arr
2398}
2399
2400fn (t Tree) array_node_u8(nodes []u8) &Node {
2401 mut arr := create_array()
2402 for node in nodes {
2403 arr.add_item(t.number_node(node))
2404 }
2405 return arr
2406}
2407
2408fn (t Tree) array_node_bool(nodes []bool) &Node {
2409 mut arr := create_array()
2410 for node in nodes {
2411 arr.add_item(t.bool_node(node))
2412 }
2413 return arr
2414}
2415
2416fn (t Tree) array_node_struct_init_field(nodes []ast.StructInitField) &Node {
2417 mut arr := create_array()
2418 for node in nodes {
2419 arr.add_item(t.struct_init_field(node))
2420 }
2421 return arr
2422}
2423
2424fn (t Tree) array_node_if_guard_var(nodes []ast.IfGuardVar) &Node {
2425 mut arr := create_array()
2426 for node in nodes {
2427 arr.add_item(t.if_guard_var(node))
2428 }
2429 return arr
2430}
2431
2432fn (t Tree) array_node_match_branch(nodes []ast.MatchBranch) &Node {
2433 mut arr := create_array()
2434 for node in nodes {
2435 arr.add_item(t.match_branch(node))
2436 }
2437 return arr
2438}
2439
2440fn (t Tree) array_node_ident(nodes []ast.Ident) &Node {
2441 mut arr := create_array()
2442 for node in nodes {
2443 arr.add_item(t.ident(node))
2444 }
2445 return arr
2446}
2447
2448fn (t Tree) array_node_select_branch(nodes []ast.SelectBranch) &Node {
2449 mut arr := create_array()
2450 for node in nodes {
2451 arr.add_item(t.select_branch(node))
2452 }
2453 return arr
2454}
2455
2456fn (t Tree) array_node_asm_clobbered(nodes []ast.AsmClobbered) &Node {
2457 mut arr := create_array()
2458 for node in nodes {
2459 arr.add_item(t.asm_clobbered(node))
2460 }
2461 return arr
2462}
2463
2464fn (t Tree) array_node_asm_template(nodes []ast.AsmTemplate) &Node {
2465 mut arr := create_array()
2466 for node in nodes {
2467 arr.add_item(t.asm_template(node))
2468 }
2469 return arr
2470}
2471
2472fn (t Tree) array_node_asm_io(nodes []ast.AsmIO) &Node {
2473 mut arr := create_array()
2474 for node in nodes {
2475 arr.add_item(t.asm_io(node))
2476 }
2477 return arr
2478}
2479
2480fn (t Tree) array_node_asm_arg(nodes []ast.AsmArg) &Node {
2481 mut arr := create_array()
2482 for node in nodes {
2483 arr.add_item(t.asm_arg(node))
2484 }
2485 return arr
2486}
2487
2488fn (t Tree) array_node_sql_stmt_line(nodes []ast.SqlStmtLine) &Node {
2489 mut arr := create_array()
2490 for node in nodes {
2491 arr.add_item(t.sql_stmt_line(node))
2492 }
2493 return arr
2494}
2495
2496fn (t Tree) array_node_interface_embedding(nodes []ast.InterfaceEmbedding) &Node {
2497 mut arr := create_array()
2498 for node in nodes {
2499 arr.add_item(t.interface_embedding(node))
2500 }
2501 return arr
2502}
2503