v / vlib / v2 / ast_dump / ast_dump.v
2437 lines · 1980 sloc · 48.65 KB · ed1549f6808d68defe18fc93b8940ef1e8aaf004
Raw
1// Copyright (c) 2020-2024 Joe Conigliaro. All rights reserved.
2// Use of this source code is governed by an MIT license
3// that can be found in the LICENSE file.
4module ast_dump
5
6import strings
7import v2.ast
8import v2.token
9
10// JsonBuilder provides JSON string building with proper escaping
11struct JsonBuilder {
12mut:
13 sb strings.Builder
14 indent int
15}
16
17fn JsonBuilder.new() JsonBuilder {
18 return JsonBuilder{
19 sb: strings.new_builder(4096)
20 }
21}
22
23fn (mut jb JsonBuilder) write_indent() {
24 for _ in 0 .. jb.indent {
25 jb.sb.write_string(' ')
26 }
27}
28
29fn (mut jb JsonBuilder) write_string(s string) {
30 jb.sb.write_string('"')
31 for c in s {
32 match c {
33 `\\` { jb.sb.write_string('\\\\') }
34 `"` { jb.sb.write_string('\\"') }
35 `\n` { jb.sb.write_string('\\n') }
36 `\r` { jb.sb.write_string('\\r') }
37 `\t` { jb.sb.write_string('\\t') }
38 else { jb.sb.write_u8(c) }
39 }
40 }
41 jb.sb.write_string('"')
42}
43
44fn (mut jb JsonBuilder) str() string {
45 return jb.sb.str()
46}
47
48// dump_files serializes an array of AST files to JSON
49pub fn dump_files(files []ast.File) string {
50 mut jb := JsonBuilder.new()
51 jb.sb.write_string('[\n')
52 jb.indent++
53 for i, file in files {
54 jb.write_file(file)
55 if i < files.len - 1 {
56 jb.sb.write_string(',')
57 }
58 jb.sb.write_string('\n')
59 }
60 jb.indent--
61 jb.sb.write_string(']\n')
62 return jb.str()
63}
64
65fn (mut jb JsonBuilder) write_file(file ast.File) {
66 jb.write_indent()
67 jb.sb.write_string('{\n')
68 jb.indent++
69
70 jb.write_indent()
71 jb.sb.write_string('"type": "File",\n')
72
73 jb.write_indent()
74 jb.sb.write_string('"name": ')
75 jb.write_string(file.name)
76 jb.sb.write_string(',\n')
77
78 jb.write_indent()
79 jb.sb.write_string('"module": ')
80 jb.write_string(file.mod)
81 jb.sb.write_string(',\n')
82
83 jb.write_indent()
84 jb.sb.write_string('"attributes": ')
85 jb.write_attributes(file.attributes)
86 jb.sb.write_string(',\n')
87
88 jb.write_indent()
89 jb.sb.write_string('"imports": ')
90 jb.write_imports(file.imports)
91 jb.sb.write_string(',\n')
92
93 jb.write_indent()
94 jb.sb.write_string('"stmts": ')
95 jb.write_stmts(file.stmts)
96 jb.sb.write_string('\n')
97
98 jb.indent--
99 jb.write_indent()
100 jb.sb.write_string('}')
101}
102
103fn (mut jb JsonBuilder) write_imports(imports []ast.ImportStmt) {
104 jb.sb.write_string('[\n')
105 jb.indent++
106 for i, imp in imports {
107 jb.write_import(imp)
108 if i < imports.len - 1 {
109 jb.sb.write_string(',')
110 }
111 jb.sb.write_string('\n')
112 }
113 jb.indent--
114 jb.write_indent()
115 jb.sb.write_string(']')
116}
117
118fn (mut jb JsonBuilder) write_import(imp ast.ImportStmt) {
119 jb.write_indent()
120 jb.sb.write_string('{\n')
121 jb.indent++
122
123 jb.write_indent()
124 jb.sb.write_string('"type": "ImportStmt",\n')
125
126 jb.write_indent()
127 jb.sb.write_string('"name": ')
128 jb.write_string(imp.name)
129 jb.sb.write_string(',\n')
130
131 jb.write_indent()
132 jb.sb.write_string('"alias": ')
133 jb.write_string(imp.alias)
134 jb.sb.write_string(',\n')
135
136 jb.write_indent()
137 jb.sb.write_string('"is_aliased": ${imp.is_aliased},\n')
138
139 jb.write_indent()
140 jb.sb.write_string('"symbols": ')
141 jb.write_exprs(imp.symbols)
142 jb.sb.write_string('\n')
143
144 jb.indent--
145 jb.write_indent()
146 jb.sb.write_string('}')
147}
148
149fn (mut jb JsonBuilder) write_attributes(attrs []ast.Attribute) {
150 jb.sb.write_string('[\n')
151 jb.indent++
152 for i, attr in attrs {
153 jb.write_attribute(attr)
154 if i < attrs.len - 1 {
155 jb.sb.write_string(',')
156 }
157 jb.sb.write_string('\n')
158 }
159 jb.indent--
160 jb.write_indent()
161 jb.sb.write_string(']')
162}
163
164fn (mut jb JsonBuilder) write_attribute(attr ast.Attribute) {
165 jb.write_indent()
166 jb.sb.write_string('{\n')
167 jb.indent++
168
169 jb.write_indent()
170 jb.sb.write_string('"name": ')
171 jb.write_string(attr.name)
172 jb.sb.write_string(',\n')
173
174 jb.write_indent()
175 jb.sb.write_string('"value": ')
176 jb.write_expr(attr.value)
177 jb.sb.write_string('\n')
178
179 jb.indent--
180 jb.write_indent()
181 jb.sb.write_string('}')
182}
183
184fn (mut jb JsonBuilder) write_stmts(stmts []ast.Stmt) {
185 jb.sb.write_string('[\n')
186 jb.indent++
187 for i, stmt in stmts {
188 jb.write_stmt(stmt)
189 if i < stmts.len - 1 {
190 jb.sb.write_string(',')
191 }
192 jb.sb.write_string('\n')
193 }
194 jb.indent--
195 jb.write_indent()
196 jb.sb.write_string(']')
197}
198
199fn (mut jb JsonBuilder) write_stmt(stmt ast.Stmt) {
200 jb.write_indent()
201 match stmt {
202 ast.AssignStmt {
203 jb.write_assign_stmt(stmt)
204 }
205 ast.AssertStmt {
206 jb.write_assert_stmt(stmt)
207 }
208 ast.BlockStmt {
209 jb.write_block_stmt(stmt)
210 }
211 ast.ConstDecl {
212 jb.write_const_decl(stmt)
213 }
214 ast.DeferStmt {
215 jb.write_defer_stmt(stmt)
216 }
217 ast.Directive {
218 jb.write_directive(stmt)
219 }
220 ast.EnumDecl {
221 jb.write_enum_decl(stmt)
222 }
223 ast.ExprStmt {
224 jb.write_expr_stmt(stmt)
225 }
226 ast.FlowControlStmt {
227 jb.write_flow_control_stmt(stmt)
228 }
229 ast.FnDecl {
230 jb.write_fn_decl(stmt)
231 }
232 ast.ForStmt {
233 jb.write_for_stmt(stmt)
234 }
235 ast.ForInStmt {
236 jb.write_for_in_stmt(stmt)
237 }
238 ast.GlobalDecl {
239 jb.write_global_decl(stmt)
240 }
241 ast.ImportStmt {
242 jb.write_import(stmt)
243 }
244 ast.InterfaceDecl {
245 jb.write_interface_decl(stmt)
246 }
247 ast.LabelStmt {
248 jb.write_label_stmt(stmt)
249 }
250 ast.ModuleStmt {
251 jb.write_module_stmt(stmt)
252 }
253 ast.ReturnStmt {
254 jb.write_return_stmt(stmt)
255 }
256 ast.StructDecl {
257 jb.write_struct_decl(stmt)
258 }
259 ast.TypeDecl {
260 jb.write_type_decl(stmt)
261 }
262 ast.AsmStmt {
263 jb.sb.write_string('{"type": "AsmStmt"}')
264 }
265 ast.ComptimeStmt {
266 jb.write_comptime_stmt(stmt)
267 }
268 ast.EmptyStmt {
269 jb.sb.write_string('{"type": "EmptyStmt"}')
270 }
271 []ast.Attribute {
272 jb.sb.write_string('{"type": "Attributes", "attrs": ')
273 jb.write_attributes(stmt)
274 jb.sb.write_string('}')
275 }
276 }
277}
278
279fn (mut jb JsonBuilder) write_assign_stmt(stmt ast.AssignStmt) {
280 jb.sb.write_string('{\n')
281 jb.indent++
282
283 jb.write_indent()
284 jb.sb.write_string('"type": "AssignStmt",\n')
285
286 jb.write_indent()
287 jb.sb.write_string('"op": ')
288 jb.write_string(stmt.op.str())
289 jb.sb.write_string(',\n')
290
291 jb.write_indent()
292 jb.sb.write_string('"lhs": ')
293 jb.write_exprs(stmt.lhs)
294 jb.sb.write_string(',\n')
295
296 jb.write_indent()
297 jb.sb.write_string('"rhs": ')
298 jb.write_exprs(stmt.rhs)
299 jb.sb.write_string(',\n')
300
301 jb.write_indent()
302 jb.sb.write_string('"pos": ')
303 jb.write_pos(stmt.pos)
304 jb.sb.write_string('\n')
305
306 jb.indent--
307 jb.write_indent()
308 jb.sb.write_string('}')
309}
310
311fn (mut jb JsonBuilder) write_assert_stmt(stmt ast.AssertStmt) {
312 jb.sb.write_string('{\n')
313 jb.indent++
314
315 jb.write_indent()
316 jb.sb.write_string('"type": "AssertStmt",\n')
317
318 jb.write_indent()
319 jb.sb.write_string('"expr": ')
320 jb.write_expr(stmt.expr)
321 jb.sb.write_string(',\n')
322
323 jb.write_indent()
324 jb.sb.write_string('"extra": ')
325 jb.write_expr(stmt.extra)
326 jb.sb.write_string('\n')
327
328 jb.indent--
329 jb.write_indent()
330 jb.sb.write_string('}')
331}
332
333fn (mut jb JsonBuilder) write_block_stmt(stmt ast.BlockStmt) {
334 jb.sb.write_string('{\n')
335 jb.indent++
336
337 jb.write_indent()
338 jb.sb.write_string('"type": "BlockStmt",\n')
339
340 jb.write_indent()
341 jb.sb.write_string('"stmts": ')
342 jb.write_stmts(stmt.stmts)
343 jb.sb.write_string('\n')
344
345 jb.indent--
346 jb.write_indent()
347 jb.sb.write_string('}')
348}
349
350fn (mut jb JsonBuilder) write_const_decl(stmt ast.ConstDecl) {
351 jb.sb.write_string('{\n')
352 jb.indent++
353
354 jb.write_indent()
355 jb.sb.write_string('"type": "ConstDecl",\n')
356
357 jb.write_indent()
358 jb.sb.write_string('"is_public": ${stmt.is_public},\n')
359
360 jb.write_indent()
361 jb.sb.write_string('"fields": ')
362 jb.write_field_inits(stmt.fields)
363 jb.sb.write_string('\n')
364
365 jb.indent--
366 jb.write_indent()
367 jb.sb.write_string('}')
368}
369
370fn (mut jb JsonBuilder) write_defer_stmt(stmt ast.DeferStmt) {
371 jb.sb.write_string('{\n')
372 jb.indent++
373
374 jb.write_indent()
375 jb.sb.write_string('"type": "DeferStmt",\n')
376
377 jb.write_indent()
378 jb.sb.write_string('"mode": ')
379 jb.write_string(stmt.mode.str())
380 jb.sb.write_string(',\n')
381
382 jb.write_indent()
383 jb.sb.write_string('"stmts": ')
384 jb.write_stmts(stmt.stmts)
385 jb.sb.write_string('\n')
386
387 jb.indent--
388 jb.write_indent()
389 jb.sb.write_string('}')
390}
391
392fn (mut jb JsonBuilder) write_directive(stmt ast.Directive) {
393 jb.sb.write_string('{\n')
394 jb.indent++
395
396 jb.write_indent()
397 jb.sb.write_string('"type": "Directive",\n')
398
399 jb.write_indent()
400 jb.sb.write_string('"name": ')
401 jb.write_string(stmt.name)
402 jb.sb.write_string(',\n')
403
404 jb.write_indent()
405 jb.sb.write_string('"value": ')
406 jb.write_string(stmt.value)
407 if stmt.ct_cond.len > 0 {
408 jb.sb.write_string(',\n')
409 jb.write_indent()
410 jb.sb.write_string('"ct_cond": ')
411 jb.write_string(stmt.ct_cond)
412 }
413 jb.sb.write_string('\n')
414
415 jb.indent--
416 jb.write_indent()
417 jb.sb.write_string('}')
418}
419
420fn (mut jb JsonBuilder) write_enum_decl(stmt ast.EnumDecl) {
421 jb.sb.write_string('{\n')
422 jb.indent++
423
424 jb.write_indent()
425 jb.sb.write_string('"type": "EnumDecl",\n')
426
427 jb.write_indent()
428 jb.sb.write_string('"name": ')
429 jb.write_string(stmt.name)
430 jb.sb.write_string(',\n')
431
432 jb.write_indent()
433 jb.sb.write_string('"is_public": ${stmt.is_public},\n')
434
435 jb.write_indent()
436 jb.sb.write_string('"attributes": ')
437 jb.write_attributes(stmt.attributes)
438 jb.sb.write_string(',\n')
439
440 jb.write_indent()
441 jb.sb.write_string('"as_type": ')
442 jb.write_expr(stmt.as_type)
443 jb.sb.write_string(',\n')
444
445 jb.write_indent()
446 jb.sb.write_string('"fields": ')
447 jb.write_field_decls(stmt.fields)
448 jb.sb.write_string('\n')
449
450 jb.indent--
451 jb.write_indent()
452 jb.sb.write_string('}')
453}
454
455fn (mut jb JsonBuilder) write_expr_stmt(stmt ast.ExprStmt) {
456 jb.sb.write_string('{\n')
457 jb.indent++
458
459 jb.write_indent()
460 jb.sb.write_string('"type": "ExprStmt",\n')
461
462 jb.write_indent()
463 jb.sb.write_string('"expr": ')
464 jb.write_expr(stmt.expr)
465 jb.sb.write_string('\n')
466
467 jb.indent--
468 jb.write_indent()
469 jb.sb.write_string('}')
470}
471
472fn (mut jb JsonBuilder) write_flow_control_stmt(stmt ast.FlowControlStmt) {
473 jb.sb.write_string('{\n')
474 jb.indent++
475
476 jb.write_indent()
477 jb.sb.write_string('"type": "FlowControlStmt",\n')
478
479 jb.write_indent()
480 jb.sb.write_string('"op": ')
481 jb.write_string(stmt.op.str())
482 jb.sb.write_string(',\n')
483
484 jb.write_indent()
485 jb.sb.write_string('"label": ')
486 jb.write_string(stmt.label)
487 jb.sb.write_string('\n')
488
489 jb.indent--
490 jb.write_indent()
491 jb.sb.write_string('}')
492}
493
494fn (mut jb JsonBuilder) write_fn_decl(stmt ast.FnDecl) {
495 jb.sb.write_string('{\n')
496 jb.indent++
497
498 jb.write_indent()
499 jb.sb.write_string('"type": "FnDecl",\n')
500
501 jb.write_indent()
502 jb.sb.write_string('"name": ')
503 jb.write_string(stmt.name)
504 jb.sb.write_string(',\n')
505
506 jb.write_indent()
507 jb.sb.write_string('"is_public": ${stmt.is_public},\n')
508
509 jb.write_indent()
510 jb.sb.write_string('"is_method": ${stmt.is_method},\n')
511
512 jb.write_indent()
513 jb.sb.write_string('"is_static": ${stmt.is_static},\n')
514
515 jb.write_indent()
516 jb.sb.write_string('"language": ')
517 jb.write_string(stmt.language.str())
518 jb.sb.write_string(',\n')
519
520 jb.write_indent()
521 jb.sb.write_string('"attributes": ')
522 jb.write_attributes(stmt.attributes)
523 jb.sb.write_string(',\n')
524
525 if stmt.is_method {
526 jb.write_indent()
527 jb.sb.write_string('"receiver": ')
528 jb.write_parameter(stmt.receiver)
529 jb.sb.write_string(',\n')
530 }
531
532 jb.write_indent()
533 jb.sb.write_string('"fn_type": ')
534 jb.write_fn_type(stmt.typ)
535 jb.sb.write_string(',\n')
536
537 jb.write_indent()
538 jb.sb.write_string('"stmts": ')
539 jb.write_stmts(stmt.stmts)
540 jb.sb.write_string(',\n')
541
542 jb.write_indent()
543 jb.sb.write_string('"pos": ')
544 jb.write_pos(stmt.pos)
545 jb.sb.write_string('\n')
546
547 jb.indent--
548 jb.write_indent()
549 jb.sb.write_string('}')
550}
551
552fn (mut jb JsonBuilder) write_for_stmt(stmt ast.ForStmt) {
553 jb.sb.write_string('{\n')
554 jb.indent++
555
556 jb.write_indent()
557 jb.sb.write_string('"type": "ForStmt",\n')
558
559 jb.write_indent()
560 jb.sb.write_string('"init": ')
561 jb.write_stmt(stmt.init)
562 jb.sb.write_string(',\n')
563
564 jb.write_indent()
565 jb.sb.write_string('"cond": ')
566 jb.write_expr(stmt.cond)
567 jb.sb.write_string(',\n')
568
569 jb.write_indent()
570 jb.sb.write_string('"post": ')
571 jb.write_stmt(stmt.post)
572 jb.sb.write_string(',\n')
573
574 jb.write_indent()
575 jb.sb.write_string('"stmts": ')
576 jb.write_stmts(stmt.stmts)
577 jb.sb.write_string('\n')
578
579 jb.indent--
580 jb.write_indent()
581 jb.sb.write_string('}')
582}
583
584fn (mut jb JsonBuilder) write_for_in_stmt(stmt ast.ForInStmt) {
585 jb.sb.write_string('{\n')
586 jb.indent++
587
588 jb.write_indent()
589 jb.sb.write_string('"type": "ForInStmt",\n')
590
591 jb.write_indent()
592 jb.sb.write_string('"key": ')
593 jb.write_expr(stmt.key)
594 jb.sb.write_string(',\n')
595
596 jb.write_indent()
597 jb.sb.write_string('"value": ')
598 jb.write_expr(stmt.value)
599 jb.sb.write_string(',\n')
600
601 jb.write_indent()
602 jb.sb.write_string('"expr": ')
603 jb.write_expr(stmt.expr)
604 jb.sb.write_string('\n')
605
606 jb.indent--
607 jb.write_indent()
608 jb.sb.write_string('}')
609}
610
611fn (mut jb JsonBuilder) write_global_decl(stmt ast.GlobalDecl) {
612 jb.sb.write_string('{\n')
613 jb.indent++
614
615 jb.write_indent()
616 jb.sb.write_string('"type": "GlobalDecl",\n')
617
618 jb.write_indent()
619 jb.sb.write_string('"attributes": ')
620 jb.write_attributes(stmt.attributes)
621 jb.sb.write_string(',\n')
622
623 jb.write_indent()
624 jb.sb.write_string('"is_public": ${stmt.is_public},\n')
625
626 jb.write_indent()
627 jb.sb.write_string('"fields": ')
628 jb.write_field_decls(stmt.fields)
629 jb.sb.write_string('\n')
630
631 jb.indent--
632 jb.write_indent()
633 jb.sb.write_string('}')
634}
635
636fn (mut jb JsonBuilder) write_interface_decl(stmt ast.InterfaceDecl) {
637 jb.sb.write_string('{\n')
638 jb.indent++
639
640 jb.write_indent()
641 jb.sb.write_string('"type": "InterfaceDecl",\n')
642
643 jb.write_indent()
644 jb.sb.write_string('"name": ')
645 jb.write_string(stmt.name)
646 jb.sb.write_string(',\n')
647
648 jb.write_indent()
649 jb.sb.write_string('"is_public": ${stmt.is_public},\n')
650
651 jb.write_indent()
652 jb.sb.write_string('"attributes": ')
653 jb.write_attributes(stmt.attributes)
654 jb.sb.write_string(',\n')
655
656 jb.write_indent()
657 jb.sb.write_string('"generic_params": ')
658 jb.write_exprs(stmt.generic_params)
659 jb.sb.write_string(',\n')
660
661 jb.write_indent()
662 jb.sb.write_string('"embedded": ')
663 jb.write_exprs(stmt.embedded)
664 jb.sb.write_string(',\n')
665
666 jb.write_indent()
667 jb.sb.write_string('"fields": ')
668 jb.write_field_decls(stmt.fields)
669 jb.sb.write_string('\n')
670
671 jb.indent--
672 jb.write_indent()
673 jb.sb.write_string('}')
674}
675
676fn (mut jb JsonBuilder) write_label_stmt(stmt ast.LabelStmt) {
677 jb.sb.write_string('{\n')
678 jb.indent++
679
680 jb.write_indent()
681 jb.sb.write_string('"type": "LabelStmt",\n')
682
683 jb.write_indent()
684 jb.sb.write_string('"name": ')
685 jb.write_string(stmt.name)
686 jb.sb.write_string(',\n')
687
688 jb.write_indent()
689 jb.sb.write_string('"stmt": ')
690 jb.write_stmt(stmt.stmt)
691 jb.sb.write_string('\n')
692
693 jb.indent--
694 jb.write_indent()
695 jb.sb.write_string('}')
696}
697
698fn (mut jb JsonBuilder) write_module_stmt(stmt ast.ModuleStmt) {
699 jb.sb.write_string('{\n')
700 jb.indent++
701
702 jb.write_indent()
703 jb.sb.write_string('"type": "ModuleStmt",\n')
704
705 jb.write_indent()
706 jb.sb.write_string('"name": ')
707 jb.write_string(stmt.name)
708 jb.sb.write_string('\n')
709
710 jb.indent--
711 jb.write_indent()
712 jb.sb.write_string('}')
713}
714
715fn (mut jb JsonBuilder) write_return_stmt(stmt ast.ReturnStmt) {
716 jb.sb.write_string('{\n')
717 jb.indent++
718
719 jb.write_indent()
720 jb.sb.write_string('"type": "ReturnStmt",\n')
721
722 jb.write_indent()
723 jb.sb.write_string('"exprs": ')
724 jb.write_exprs(stmt.exprs)
725 jb.sb.write_string('\n')
726
727 jb.indent--
728 jb.write_indent()
729 jb.sb.write_string('}')
730}
731
732fn (mut jb JsonBuilder) write_struct_decl(stmt ast.StructDecl) {
733 jb.sb.write_string('{\n')
734 jb.indent++
735
736 jb.write_indent()
737 jb.sb.write_string('"type": "StructDecl",\n')
738
739 jb.write_indent()
740 jb.sb.write_string('"name": ')
741 jb.write_string(stmt.name)
742 jb.sb.write_string(',\n')
743
744 jb.write_indent()
745 jb.sb.write_string('"is_public": ${stmt.is_public},\n')
746
747 jb.write_indent()
748 jb.sb.write_string('"is_union": ${stmt.is_union},\n')
749
750 jb.write_indent()
751 jb.sb.write_string('"language": ')
752 jb.write_string(stmt.language.str())
753 jb.sb.write_string(',\n')
754
755 jb.write_indent()
756 jb.sb.write_string('"attributes": ')
757 jb.write_attributes(stmt.attributes)
758 jb.sb.write_string(',\n')
759
760 jb.write_indent()
761 jb.sb.write_string('"generic_params": ')
762 jb.write_exprs(stmt.generic_params)
763 jb.sb.write_string(',\n')
764
765 jb.write_indent()
766 jb.sb.write_string('"embedded": ')
767 jb.write_exprs(stmt.embedded)
768 jb.sb.write_string(',\n')
769
770 jb.write_indent()
771 jb.sb.write_string('"fields": ')
772 jb.write_field_decls(stmt.fields)
773 jb.sb.write_string(',\n')
774
775 jb.write_indent()
776 jb.sb.write_string('"pos": ')
777 jb.write_pos(stmt.pos)
778 jb.sb.write_string('\n')
779
780 jb.indent--
781 jb.write_indent()
782 jb.sb.write_string('}')
783}
784
785fn (mut jb JsonBuilder) write_type_decl(stmt ast.TypeDecl) {
786 jb.sb.write_string('{\n')
787 jb.indent++
788
789 jb.write_indent()
790 jb.sb.write_string('"type": "TypeDecl",\n')
791
792 jb.write_indent()
793 jb.sb.write_string('"name": ')
794 jb.write_string(stmt.name)
795 jb.sb.write_string(',\n')
796
797 jb.write_indent()
798 jb.sb.write_string('"is_public": ${stmt.is_public},\n')
799
800 jb.write_indent()
801 jb.sb.write_string('"language": ')
802 jb.write_string(stmt.language.str())
803 jb.sb.write_string(',\n')
804
805 jb.write_indent()
806 jb.sb.write_string('"generic_params": ')
807 jb.write_exprs(stmt.generic_params)
808 jb.sb.write_string(',\n')
809
810 jb.write_indent()
811 jb.sb.write_string('"base_type": ')
812 jb.write_expr(stmt.base_type)
813 jb.sb.write_string(',\n')
814
815 jb.write_indent()
816 jb.sb.write_string('"variants": ')
817 jb.write_exprs(stmt.variants)
818 jb.sb.write_string('\n')
819
820 jb.indent--
821 jb.write_indent()
822 jb.sb.write_string('}')
823}
824
825fn (mut jb JsonBuilder) write_comptime_stmt(stmt ast.ComptimeStmt) {
826 jb.sb.write_string('{\n')
827 jb.indent++
828
829 jb.write_indent()
830 jb.sb.write_string('"type": "ComptimeStmt",\n')
831
832 jb.write_indent()
833 jb.sb.write_string('"stmt": ')
834 jb.write_stmt(stmt.stmt)
835 jb.sb.write_string('\n')
836
837 jb.indent--
838 jb.write_indent()
839 jb.sb.write_string('}')
840}
841
842fn (mut jb JsonBuilder) write_exprs(exprs []ast.Expr) {
843 jb.sb.write_string('[\n')
844 jb.indent++
845 for i, expr in exprs {
846 jb.write_indent()
847 jb.write_expr(expr)
848 if i < exprs.len - 1 {
849 jb.sb.write_string(',')
850 }
851 jb.sb.write_string('\n')
852 }
853 jb.indent--
854 jb.write_indent()
855 jb.sb.write_string(']')
856}
857
858fn (mut jb JsonBuilder) write_expr(expr ast.Expr) {
859 match expr {
860 ast.ArrayInitExpr {
861 jb.write_array_init_expr(expr)
862 }
863 ast.AsCastExpr {
864 jb.write_as_cast_expr(expr)
865 }
866 ast.AssocExpr {
867 jb.write_assoc_expr(expr)
868 }
869 ast.BasicLiteral {
870 jb.write_basic_literal(expr)
871 }
872 ast.CallExpr {
873 jb.write_call_expr(expr)
874 }
875 ast.CallOrCastExpr {
876 jb.write_call_or_cast_expr(expr)
877 }
878 ast.CastExpr {
879 jb.write_cast_expr(expr)
880 }
881 ast.ComptimeExpr {
882 jb.write_comptime_expr(expr)
883 }
884 ast.EmptyExpr {
885 jb.sb.write_string('{"type": "EmptyExpr"}')
886 }
887 ast.FieldInit {
888 jb.write_field_init(expr)
889 }
890 ast.FnLiteral {
891 jb.write_fn_literal(expr)
892 }
893 ast.GenericArgOrIndexExpr {
894 jb.write_generic_arg_or_index_expr(expr)
895 }
896 ast.GenericArgs {
897 jb.write_generic_args(expr)
898 }
899 ast.Ident {
900 jb.write_ident(expr)
901 }
902 ast.IfExpr {
903 jb.write_if_expr(expr)
904 }
905 ast.IfGuardExpr {
906 jb.write_if_guard_expr(expr)
907 }
908 ast.IndexExpr {
909 jb.write_index_expr(expr)
910 }
911 ast.InfixExpr {
912 jb.write_infix_expr(expr)
913 }
914 ast.InitExpr {
915 jb.write_init_expr(expr)
916 }
917 ast.Keyword {
918 jb.write_keyword(expr)
919 }
920 ast.KeywordOperator {
921 jb.write_keyword_operator(expr)
922 }
923 ast.LambdaExpr {
924 jb.write_lambda_expr(expr)
925 }
926 ast.LifetimeExpr {
927 jb.write_lifetime_expr(expr)
928 }
929 ast.LockExpr {
930 jb.write_lock_expr(expr)
931 }
932 ast.MapInitExpr {
933 jb.write_map_init_expr(expr)
934 }
935 ast.MatchExpr {
936 jb.write_match_expr(expr)
937 }
938 ast.ModifierExpr {
939 jb.write_modifier_expr(expr)
940 }
941 ast.OrExpr {
942 jb.write_or_expr(expr)
943 }
944 ast.ParenExpr {
945 jb.write_paren_expr(expr)
946 }
947 ast.PostfixExpr {
948 jb.write_postfix_expr(expr)
949 }
950 ast.PrefixExpr {
951 jb.write_prefix_expr(expr)
952 }
953 ast.RangeExpr {
954 jb.write_range_expr(expr)
955 }
956 ast.SelectExpr {
957 jb.write_select_expr(expr)
958 }
959 ast.SelectorExpr {
960 jb.write_selector_expr(expr)
961 }
962 ast.SqlExpr {
963 jb.sb.write_string('{"type": "SqlExpr"}')
964 }
965 ast.StringInterLiteral {
966 jb.write_string_inter_literal(expr)
967 }
968 ast.StringLiteral {
969 jb.write_string_literal(expr)
970 }
971 ast.Tuple {
972 jb.write_tuple(expr)
973 }
974 ast.Type {
975 jb.write_type_expr(expr)
976 }
977 ast.UnsafeExpr {
978 jb.write_unsafe_expr(expr)
979 }
980 }
981}
982
983fn (mut jb JsonBuilder) write_array_init_expr(expr ast.ArrayInitExpr) {
984 jb.sb.write_string('{\n')
985 jb.indent++
986
987 jb.write_indent()
988 jb.sb.write_string('"type": "ArrayInitExpr",\n')
989
990 jb.write_indent()
991 jb.sb.write_string('"elem_type": ')
992 jb.write_expr(expr.typ)
993 jb.sb.write_string(',\n')
994
995 jb.write_indent()
996 jb.sb.write_string('"exprs": ')
997 jb.write_exprs(expr.exprs)
998 jb.sb.write_string(',\n')
999
1000 jb.write_indent()
1001 jb.sb.write_string('"init": ')
1002 jb.write_expr(expr.init)
1003 jb.sb.write_string(',\n')
1004
1005 jb.write_indent()
1006 jb.sb.write_string('"cap": ')
1007 jb.write_expr(expr.cap)
1008 jb.sb.write_string(',\n')
1009
1010 jb.write_indent()
1011 jb.sb.write_string('"len": ')
1012 jb.write_expr(expr.len)
1013 jb.sb.write_string(',\n')
1014
1015 jb.write_indent()
1016 jb.sb.write_string('"update_expr": ')
1017 jb.write_expr(expr.update_expr)
1018 jb.sb.write_string(',\n')
1019
1020 jb.write_indent()
1021 jb.sb.write_string('"pos": ')
1022 jb.write_pos(expr.pos)
1023 jb.sb.write_string('\n')
1024
1025 jb.indent--
1026 jb.write_indent()
1027 jb.sb.write_string('}')
1028}
1029
1030fn (mut jb JsonBuilder) write_as_cast_expr(expr ast.AsCastExpr) {
1031 jb.sb.write_string('{\n')
1032 jb.indent++
1033
1034 jb.write_indent()
1035 jb.sb.write_string('"type": "AsCastExpr",\n')
1036
1037 jb.write_indent()
1038 jb.sb.write_string('"expr": ')
1039 jb.write_expr(expr.expr)
1040 jb.sb.write_string(',\n')
1041
1042 jb.write_indent()
1043 jb.sb.write_string('"cast_type": ')
1044 jb.write_expr(expr.typ)
1045 jb.sb.write_string(',\n')
1046
1047 jb.write_indent()
1048 jb.sb.write_string('"pos": ')
1049 jb.write_pos(expr.pos)
1050 jb.sb.write_string('\n')
1051
1052 jb.indent--
1053 jb.write_indent()
1054 jb.sb.write_string('}')
1055}
1056
1057fn (mut jb JsonBuilder) write_assoc_expr(expr ast.AssocExpr) {
1058 jb.sb.write_string('{\n')
1059 jb.indent++
1060
1061 jb.write_indent()
1062 jb.sb.write_string('"type": "AssocExpr",\n')
1063
1064 jb.write_indent()
1065 jb.sb.write_string('"assoc_type": ')
1066 jb.write_expr(expr.typ)
1067 jb.sb.write_string(',\n')
1068
1069 jb.write_indent()
1070 jb.sb.write_string('"expr": ')
1071 jb.write_expr(expr.expr)
1072 jb.sb.write_string(',\n')
1073
1074 jb.write_indent()
1075 jb.sb.write_string('"fields": ')
1076 jb.write_field_inits(expr.fields)
1077 jb.sb.write_string('\n')
1078
1079 jb.indent--
1080 jb.write_indent()
1081 jb.sb.write_string('}')
1082}
1083
1084fn (mut jb JsonBuilder) write_basic_literal(expr ast.BasicLiteral) {
1085 jb.sb.write_string('{\n')
1086 jb.indent++
1087
1088 jb.write_indent()
1089 jb.sb.write_string('"type": "BasicLiteral",\n')
1090
1091 jb.write_indent()
1092 jb.sb.write_string('"kind": ')
1093 jb.write_string(expr.kind.str())
1094 jb.sb.write_string(',\n')
1095
1096 jb.write_indent()
1097 jb.sb.write_string('"value": ')
1098 jb.write_string(expr.value)
1099 jb.sb.write_string('\n')
1100
1101 jb.indent--
1102 jb.write_indent()
1103 jb.sb.write_string('}')
1104}
1105
1106fn (mut jb JsonBuilder) write_call_expr(expr ast.CallExpr) {
1107 jb.sb.write_string('{\n')
1108 jb.indent++
1109
1110 jb.write_indent()
1111 jb.sb.write_string('"type": "CallExpr",\n')
1112
1113 jb.write_indent()
1114 jb.sb.write_string('"lhs": ')
1115 jb.write_expr(expr.lhs)
1116 jb.sb.write_string(',\n')
1117
1118 jb.write_indent()
1119 jb.sb.write_string('"args": ')
1120 jb.write_exprs(expr.args)
1121 jb.sb.write_string(',\n')
1122
1123 jb.write_indent()
1124 jb.sb.write_string('"pos": ')
1125 jb.write_pos(expr.pos)
1126 jb.sb.write_string('\n')
1127
1128 jb.indent--
1129 jb.write_indent()
1130 jb.sb.write_string('}')
1131}
1132
1133fn (mut jb JsonBuilder) write_call_or_cast_expr(expr ast.CallOrCastExpr) {
1134 jb.sb.write_string('{\n')
1135 jb.indent++
1136
1137 jb.write_indent()
1138 jb.sb.write_string('"type": "CallOrCastExpr",\n')
1139
1140 jb.write_indent()
1141 jb.sb.write_string('"lhs": ')
1142 jb.write_expr(expr.lhs)
1143 jb.sb.write_string(',\n')
1144
1145 jb.write_indent()
1146 jb.sb.write_string('"expr": ')
1147 jb.write_expr(expr.expr)
1148 jb.sb.write_string(',\n')
1149
1150 jb.write_indent()
1151 jb.sb.write_string('"pos": ')
1152 jb.write_pos(expr.pos)
1153 jb.sb.write_string('\n')
1154
1155 jb.indent--
1156 jb.write_indent()
1157 jb.sb.write_string('}')
1158}
1159
1160fn (mut jb JsonBuilder) write_cast_expr(expr ast.CastExpr) {
1161 jb.sb.write_string('{\n')
1162 jb.indent++
1163
1164 jb.write_indent()
1165 jb.sb.write_string('"type": "CastExpr",\n')
1166
1167 jb.write_indent()
1168 jb.sb.write_string('"cast_type": ')
1169 jb.write_expr(expr.typ)
1170 jb.sb.write_string(',\n')
1171
1172 jb.write_indent()
1173 jb.sb.write_string('"expr": ')
1174 jb.write_expr(expr.expr)
1175 jb.sb.write_string(',\n')
1176
1177 jb.write_indent()
1178 jb.sb.write_string('"pos": ')
1179 jb.write_pos(expr.pos)
1180 jb.sb.write_string('\n')
1181
1182 jb.indent--
1183 jb.write_indent()
1184 jb.sb.write_string('}')
1185}
1186
1187fn (mut jb JsonBuilder) write_comptime_expr(expr ast.ComptimeExpr) {
1188 jb.sb.write_string('{\n')
1189 jb.indent++
1190
1191 jb.write_indent()
1192 jb.sb.write_string('"type": "ComptimeExpr",\n')
1193
1194 jb.write_indent()
1195 jb.sb.write_string('"expr": ')
1196 jb.write_expr(expr.expr)
1197 jb.sb.write_string(',\n')
1198
1199 jb.write_indent()
1200 jb.sb.write_string('"pos": ')
1201 jb.write_pos(expr.pos)
1202 jb.sb.write_string('\n')
1203
1204 jb.indent--
1205 jb.write_indent()
1206 jb.sb.write_string('}')
1207}
1208
1209fn (mut jb JsonBuilder) write_field_init(expr ast.FieldInit) {
1210 jb.sb.write_string('{\n')
1211 jb.indent++
1212
1213 jb.write_indent()
1214 jb.sb.write_string('"type": "FieldInit",\n')
1215
1216 jb.write_indent()
1217 jb.sb.write_string('"name": ')
1218 jb.write_string(expr.name)
1219 jb.sb.write_string(',\n')
1220
1221 jb.write_indent()
1222 jb.sb.write_string('"value": ')
1223 jb.write_expr(expr.value)
1224 jb.sb.write_string('\n')
1225
1226 jb.indent--
1227 jb.write_indent()
1228 jb.sb.write_string('}')
1229}
1230
1231fn (mut jb JsonBuilder) write_field_inits(fields []ast.FieldInit) {
1232 jb.sb.write_string('[\n')
1233 jb.indent++
1234 for i, field in fields {
1235 jb.write_indent()
1236 jb.write_field_init(field)
1237 if i < fields.len - 1 {
1238 jb.sb.write_string(',')
1239 }
1240 jb.sb.write_string('\n')
1241 }
1242 jb.indent--
1243 jb.write_indent()
1244 jb.sb.write_string(']')
1245}
1246
1247fn (mut jb JsonBuilder) write_field_decls(fields []ast.FieldDecl) {
1248 jb.sb.write_string('[\n')
1249 jb.indent++
1250 for i, field in fields {
1251 jb.write_indent()
1252 jb.write_field_decl(field)
1253 if i < fields.len - 1 {
1254 jb.sb.write_string(',')
1255 }
1256 jb.sb.write_string('\n')
1257 }
1258 jb.indent--
1259 jb.write_indent()
1260 jb.sb.write_string(']')
1261}
1262
1263fn (mut jb JsonBuilder) write_field_decl(field ast.FieldDecl) {
1264 jb.sb.write_string('{\n')
1265 jb.indent++
1266
1267 jb.write_indent()
1268 jb.sb.write_string('"name": ')
1269 jb.write_string(field.name)
1270 jb.sb.write_string(',\n')
1271
1272 jb.write_indent()
1273 jb.sb.write_string('"field_type": ')
1274 jb.write_expr(field.typ)
1275 jb.sb.write_string(',\n')
1276
1277 jb.write_indent()
1278 jb.sb.write_string('"value": ')
1279 jb.write_expr(field.value)
1280 jb.sb.write_string(',\n')
1281
1282 jb.write_indent()
1283 jb.sb.write_string('"attributes": ')
1284 jb.write_attributes(field.attributes)
1285 jb.sb.write_string(',\n')
1286
1287 jb.write_indent()
1288 jb.sb.write_string('"is_public": ${field.is_public},\n')
1289
1290 jb.write_indent()
1291 jb.sb.write_string('"is_mut": ${field.is_mut}')
1292 jb.sb.write_string('\n')
1293
1294 jb.indent--
1295 jb.write_indent()
1296 jb.sb.write_string('}')
1297}
1298
1299fn (mut jb JsonBuilder) write_fn_literal(expr ast.FnLiteral) {
1300 jb.sb.write_string('{\n')
1301 jb.indent++
1302
1303 jb.write_indent()
1304 jb.sb.write_string('"type": "FnLiteral",\n')
1305
1306 jb.write_indent()
1307 jb.sb.write_string('"fn_type": ')
1308 jb.write_fn_type(expr.typ)
1309 jb.sb.write_string(',\n')
1310
1311 jb.write_indent()
1312 jb.sb.write_string('"captured_vars": ')
1313 jb.write_exprs(expr.captured_vars)
1314 jb.sb.write_string(',\n')
1315
1316 jb.write_indent()
1317 jb.sb.write_string('"stmts": ')
1318 jb.write_stmts(expr.stmts)
1319 jb.sb.write_string('\n')
1320
1321 jb.indent--
1322 jb.write_indent()
1323 jb.sb.write_string('}')
1324}
1325
1326fn (mut jb JsonBuilder) write_generic_arg_or_index_expr(expr ast.GenericArgOrIndexExpr) {
1327 jb.sb.write_string('{\n')
1328 jb.indent++
1329
1330 jb.write_indent()
1331 jb.sb.write_string('"type": "GenericArgOrIndexExpr",\n')
1332
1333 jb.write_indent()
1334 jb.sb.write_string('"lhs": ')
1335 jb.write_expr(expr.lhs)
1336 jb.sb.write_string(',\n')
1337
1338 jb.write_indent()
1339 jb.sb.write_string('"expr": ')
1340 jb.write_expr(expr.expr)
1341 jb.sb.write_string('\n')
1342
1343 jb.indent--
1344 jb.write_indent()
1345 jb.sb.write_string('}')
1346}
1347
1348fn (mut jb JsonBuilder) write_generic_args(expr ast.GenericArgs) {
1349 jb.sb.write_string('{\n')
1350 jb.indent++
1351
1352 jb.write_indent()
1353 jb.sb.write_string('"type": "GenericArgs",\n')
1354
1355 jb.write_indent()
1356 jb.sb.write_string('"lhs": ')
1357 jb.write_expr(expr.lhs)
1358 jb.sb.write_string(',\n')
1359
1360 jb.write_indent()
1361 jb.sb.write_string('"args": ')
1362 jb.write_exprs(expr.args)
1363 jb.sb.write_string('\n')
1364
1365 jb.indent--
1366 jb.write_indent()
1367 jb.sb.write_string('}')
1368}
1369
1370fn (mut jb JsonBuilder) write_ident(expr ast.Ident) {
1371 jb.sb.write_string('{\n')
1372 jb.indent++
1373
1374 jb.write_indent()
1375 jb.sb.write_string('"type": "Ident",\n')
1376
1377 jb.write_indent()
1378 jb.sb.write_string('"name": ')
1379 jb.write_string(expr.name)
1380 jb.sb.write_string(',\n')
1381
1382 jb.write_indent()
1383 jb.sb.write_string('"pos": ')
1384 jb.write_pos(expr.pos)
1385 jb.sb.write_string('\n')
1386
1387 jb.indent--
1388 jb.write_indent()
1389 jb.sb.write_string('}')
1390}
1391
1392fn (mut jb JsonBuilder) write_idents(idents []ast.Ident) {
1393 jb.sb.write_string('[\n')
1394 jb.indent++
1395 for i, ident in idents {
1396 jb.write_indent()
1397 jb.write_ident(ident)
1398 if i < idents.len - 1 {
1399 jb.sb.write_string(',')
1400 }
1401 jb.sb.write_string('\n')
1402 }
1403 jb.indent--
1404 jb.write_indent()
1405 jb.sb.write_string(']')
1406}
1407
1408fn (mut jb JsonBuilder) write_if_expr(expr ast.IfExpr) {
1409 jb.sb.write_string('{\n')
1410 jb.indent++
1411
1412 jb.write_indent()
1413 jb.sb.write_string('"type": "IfExpr",\n')
1414
1415 jb.write_indent()
1416 jb.sb.write_string('"cond": ')
1417 jb.write_expr(expr.cond)
1418 jb.sb.write_string(',\n')
1419
1420 jb.write_indent()
1421 jb.sb.write_string('"stmts": ')
1422 jb.write_stmts(expr.stmts)
1423 jb.sb.write_string(',\n')
1424
1425 jb.write_indent()
1426 jb.sb.write_string('"else_expr": ')
1427 jb.write_expr(expr.else_expr)
1428 jb.sb.write_string('\n')
1429
1430 jb.indent--
1431 jb.write_indent()
1432 jb.sb.write_string('}')
1433}
1434
1435fn (mut jb JsonBuilder) write_if_guard_expr(expr ast.IfGuardExpr) {
1436 jb.sb.write_string('{\n')
1437 jb.indent++
1438
1439 jb.write_indent()
1440 jb.sb.write_string('"type": "IfGuardExpr",\n')
1441
1442 jb.write_indent()
1443 jb.sb.write_string('"stmt": ')
1444 jb.write_assign_stmt(expr.stmt)
1445 jb.sb.write_string('\n')
1446
1447 jb.indent--
1448 jb.write_indent()
1449 jb.sb.write_string('}')
1450}
1451
1452fn (mut jb JsonBuilder) write_index_expr(expr ast.IndexExpr) {
1453 jb.sb.write_string('{\n')
1454 jb.indent++
1455
1456 jb.write_indent()
1457 jb.sb.write_string('"type": "IndexExpr",\n')
1458
1459 jb.write_indent()
1460 jb.sb.write_string('"lhs": ')
1461 jb.write_expr(expr.lhs)
1462 jb.sb.write_string(',\n')
1463
1464 jb.write_indent()
1465 jb.sb.write_string('"expr": ')
1466 jb.write_expr(expr.expr)
1467 jb.sb.write_string(',\n')
1468
1469 jb.write_indent()
1470 jb.sb.write_string('"is_gated": ${expr.is_gated}\n')
1471
1472 jb.indent--
1473 jb.write_indent()
1474 jb.sb.write_string('}')
1475}
1476
1477fn (mut jb JsonBuilder) write_infix_expr(expr ast.InfixExpr) {
1478 jb.sb.write_string('{\n')
1479 jb.indent++
1480
1481 jb.write_indent()
1482 jb.sb.write_string('"type": "InfixExpr",\n')
1483
1484 jb.write_indent()
1485 jb.sb.write_string('"op": ')
1486 jb.write_string(expr.op.str())
1487 jb.sb.write_string(',\n')
1488
1489 jb.write_indent()
1490 jb.sb.write_string('"lhs": ')
1491 jb.write_expr(expr.lhs)
1492 jb.sb.write_string(',\n')
1493
1494 jb.write_indent()
1495 jb.sb.write_string('"rhs": ')
1496 jb.write_expr(expr.rhs)
1497 jb.sb.write_string(',\n')
1498
1499 jb.write_indent()
1500 jb.sb.write_string('"pos": ')
1501 jb.write_pos(expr.pos)
1502 jb.sb.write_string('\n')
1503
1504 jb.indent--
1505 jb.write_indent()
1506 jb.sb.write_string('}')
1507}
1508
1509fn (mut jb JsonBuilder) write_init_expr(expr ast.InitExpr) {
1510 jb.sb.write_string('{\n')
1511 jb.indent++
1512
1513 jb.write_indent()
1514 jb.sb.write_string('"type": "InitExpr",\n')
1515
1516 jb.write_indent()
1517 jb.sb.write_string('"init_type": ')
1518 jb.write_expr(expr.typ)
1519 jb.sb.write_string(',\n')
1520
1521 jb.write_indent()
1522 jb.sb.write_string('"fields": ')
1523 jb.write_field_inits(expr.fields)
1524 jb.sb.write_string('\n')
1525
1526 jb.indent--
1527 jb.write_indent()
1528 jb.sb.write_string('}')
1529}
1530
1531fn (mut jb JsonBuilder) write_keyword(expr ast.Keyword) {
1532 jb.sb.write_string('{\n')
1533 jb.indent++
1534
1535 jb.write_indent()
1536 jb.sb.write_string('"type": "Keyword",\n')
1537
1538 jb.write_indent()
1539 jb.sb.write_string('"tok": ')
1540 jb.write_string(expr.tok.str())
1541 jb.sb.write_string('\n')
1542
1543 jb.indent--
1544 jb.write_indent()
1545 jb.sb.write_string('}')
1546}
1547
1548fn (mut jb JsonBuilder) write_keyword_operator(expr ast.KeywordOperator) {
1549 jb.sb.write_string('{\n')
1550 jb.indent++
1551
1552 jb.write_indent()
1553 jb.sb.write_string('"type": "KeywordOperator",\n')
1554
1555 jb.write_indent()
1556 jb.sb.write_string('"op": ')
1557 jb.write_string(expr.op.str())
1558 jb.sb.write_string(',\n')
1559
1560 jb.write_indent()
1561 jb.sb.write_string('"exprs": ')
1562 jb.write_exprs(expr.exprs)
1563 jb.sb.write_string('\n')
1564
1565 jb.indent--
1566 jb.write_indent()
1567 jb.sb.write_string('}')
1568}
1569
1570fn (mut jb JsonBuilder) write_lambda_expr(expr ast.LambdaExpr) {
1571 jb.sb.write_string('{\n')
1572 jb.indent++
1573
1574 jb.write_indent()
1575 jb.sb.write_string('"type": "LambdaExpr",\n')
1576
1577 jb.write_indent()
1578 jb.sb.write_string('"args": ')
1579 jb.write_idents(expr.args)
1580 jb.sb.write_string(',\n')
1581
1582 jb.write_indent()
1583 jb.sb.write_string('"expr": ')
1584 jb.write_expr(expr.expr)
1585 jb.sb.write_string('\n')
1586
1587 jb.indent--
1588 jb.write_indent()
1589 jb.sb.write_string('}')
1590}
1591
1592fn (mut jb JsonBuilder) write_lifetime_expr(expr ast.LifetimeExpr) {
1593 jb.sb.write_string('{\n')
1594 jb.indent++
1595
1596 jb.write_indent()
1597 jb.sb.write_string('"type": "LifetimeExpr",\n')
1598
1599 jb.write_indent()
1600 jb.sb.write_string('"name": ')
1601 jb.write_string(expr.name)
1602 jb.sb.write_string(',\n')
1603
1604 jb.write_indent()
1605 jb.sb.write_string('"pos": ')
1606 jb.write_pos(expr.pos)
1607 jb.sb.write_string('\n')
1608
1609 jb.indent--
1610 jb.write_indent()
1611 jb.sb.write_string('}')
1612}
1613
1614fn (mut jb JsonBuilder) write_lock_expr(expr ast.LockExpr) {
1615 jb.sb.write_string('{\n')
1616 jb.indent++
1617
1618 jb.write_indent()
1619 jb.sb.write_string('"type": "LockExpr",\n')
1620
1621 jb.write_indent()
1622 jb.sb.write_string('"lock_exprs": ')
1623 jb.write_exprs(expr.lock_exprs)
1624 jb.sb.write_string(',\n')
1625
1626 jb.write_indent()
1627 jb.sb.write_string('"rlock_exprs": ')
1628 jb.write_exprs(expr.rlock_exprs)
1629 jb.sb.write_string(',\n')
1630
1631 jb.write_indent()
1632 jb.sb.write_string('"stmts": ')
1633 jb.write_stmts(expr.stmts)
1634 jb.sb.write_string('\n')
1635
1636 jb.indent--
1637 jb.write_indent()
1638 jb.sb.write_string('}')
1639}
1640
1641fn (mut jb JsonBuilder) write_map_init_expr(expr ast.MapInitExpr) {
1642 jb.sb.write_string('{\n')
1643 jb.indent++
1644
1645 jb.write_indent()
1646 jb.sb.write_string('"type": "MapInitExpr",\n')
1647
1648 jb.write_indent()
1649 jb.sb.write_string('"map_type": ')
1650 jb.write_expr(expr.typ)
1651 jb.sb.write_string(',\n')
1652
1653 jb.write_indent()
1654 jb.sb.write_string('"keys": ')
1655 jb.write_exprs(expr.keys)
1656 jb.sb.write_string(',\n')
1657
1658 jb.write_indent()
1659 jb.sb.write_string('"vals": ')
1660 jb.write_exprs(expr.vals)
1661 jb.sb.write_string(',\n')
1662
1663 jb.write_indent()
1664 jb.sb.write_string('"pos": ')
1665 jb.write_pos(expr.pos)
1666 jb.sb.write_string('\n')
1667
1668 jb.indent--
1669 jb.write_indent()
1670 jb.sb.write_string('}')
1671}
1672
1673fn (mut jb JsonBuilder) write_match_expr(expr ast.MatchExpr) {
1674 jb.sb.write_string('{\n')
1675 jb.indent++
1676
1677 jb.write_indent()
1678 jb.sb.write_string('"type": "MatchExpr",\n')
1679
1680 jb.write_indent()
1681 jb.sb.write_string('"expr": ')
1682 jb.write_expr(expr.expr)
1683 jb.sb.write_string(',\n')
1684
1685 jb.write_indent()
1686 jb.sb.write_string('"branches": ')
1687 jb.write_match_branches(expr.branches)
1688 jb.sb.write_string(',\n')
1689
1690 jb.write_indent()
1691 jb.sb.write_string('"pos": ')
1692 jb.write_pos(expr.pos)
1693 jb.sb.write_string('\n')
1694
1695 jb.indent--
1696 jb.write_indent()
1697 jb.sb.write_string('}')
1698}
1699
1700fn (mut jb JsonBuilder) write_match_branches(branches []ast.MatchBranch) {
1701 jb.sb.write_string('[\n')
1702 jb.indent++
1703 for i, branch in branches {
1704 jb.write_indent()
1705 jb.write_match_branch(branch)
1706 if i < branches.len - 1 {
1707 jb.sb.write_string(',')
1708 }
1709 jb.sb.write_string('\n')
1710 }
1711 jb.indent--
1712 jb.write_indent()
1713 jb.sb.write_string(']')
1714}
1715
1716fn (mut jb JsonBuilder) write_match_branch(branch ast.MatchBranch) {
1717 jb.sb.write_string('{\n')
1718 jb.indent++
1719
1720 jb.write_indent()
1721 jb.sb.write_string('"cond": ')
1722 jb.write_exprs(branch.cond)
1723 jb.sb.write_string(',\n')
1724
1725 jb.write_indent()
1726 jb.sb.write_string('"stmts": ')
1727 jb.write_stmts(branch.stmts)
1728 jb.sb.write_string(',\n')
1729
1730 jb.write_indent()
1731 jb.sb.write_string('"pos": ')
1732 jb.write_pos(branch.pos)
1733 jb.sb.write_string('\n')
1734
1735 jb.indent--
1736 jb.write_indent()
1737 jb.sb.write_string('}')
1738}
1739
1740fn (mut jb JsonBuilder) write_modifier_expr(expr ast.ModifierExpr) {
1741 jb.sb.write_string('{\n')
1742 jb.indent++
1743
1744 jb.write_indent()
1745 jb.sb.write_string('"type": "ModifierExpr",\n')
1746
1747 jb.write_indent()
1748 jb.sb.write_string('"kind": ')
1749 jb.write_string(expr.kind.str())
1750 jb.sb.write_string(',\n')
1751
1752 jb.write_indent()
1753 jb.sb.write_string('"expr": ')
1754 jb.write_expr(expr.expr)
1755 jb.sb.write_string('\n')
1756
1757 jb.indent--
1758 jb.write_indent()
1759 jb.sb.write_string('}')
1760}
1761
1762fn (mut jb JsonBuilder) write_or_expr(expr ast.OrExpr) {
1763 jb.sb.write_string('{\n')
1764 jb.indent++
1765
1766 jb.write_indent()
1767 jb.sb.write_string('"type": "OrExpr",\n')
1768
1769 jb.write_indent()
1770 jb.sb.write_string('"expr": ')
1771 jb.write_expr(expr.expr)
1772 jb.sb.write_string(',\n')
1773
1774 jb.write_indent()
1775 jb.sb.write_string('"stmts": ')
1776 jb.write_stmts(expr.stmts)
1777 jb.sb.write_string(',\n')
1778
1779 jb.write_indent()
1780 jb.sb.write_string('"pos": ')
1781 jb.write_pos(expr.pos)
1782 jb.sb.write_string('\n')
1783
1784 jb.indent--
1785 jb.write_indent()
1786 jb.sb.write_string('}')
1787}
1788
1789fn (mut jb JsonBuilder) write_paren_expr(expr ast.ParenExpr) {
1790 jb.sb.write_string('{\n')
1791 jb.indent++
1792
1793 jb.write_indent()
1794 jb.sb.write_string('"type": "ParenExpr",\n')
1795
1796 jb.write_indent()
1797 jb.sb.write_string('"expr": ')
1798 jb.write_expr(expr.expr)
1799 jb.sb.write_string('\n')
1800
1801 jb.indent--
1802 jb.write_indent()
1803 jb.sb.write_string('}')
1804}
1805
1806fn (mut jb JsonBuilder) write_postfix_expr(expr ast.PostfixExpr) {
1807 jb.sb.write_string('{\n')
1808 jb.indent++
1809
1810 jb.write_indent()
1811 jb.sb.write_string('"type": "PostfixExpr",\n')
1812
1813 jb.write_indent()
1814 jb.sb.write_string('"op": ')
1815 jb.write_string(expr.op.str())
1816 jb.sb.write_string(',\n')
1817
1818 jb.write_indent()
1819 jb.sb.write_string('"expr": ')
1820 jb.write_expr(expr.expr)
1821 jb.sb.write_string('\n')
1822
1823 jb.indent--
1824 jb.write_indent()
1825 jb.sb.write_string('}')
1826}
1827
1828fn (mut jb JsonBuilder) write_prefix_expr(expr ast.PrefixExpr) {
1829 jb.sb.write_string('{\n')
1830 jb.indent++
1831
1832 jb.write_indent()
1833 jb.sb.write_string('"type": "PrefixExpr",\n')
1834
1835 jb.write_indent()
1836 jb.sb.write_string('"op": ')
1837 jb.write_string(expr.op.str())
1838 jb.sb.write_string(',\n')
1839
1840 jb.write_indent()
1841 jb.sb.write_string('"expr": ')
1842 jb.write_expr(expr.expr)
1843 jb.sb.write_string(',\n')
1844
1845 jb.write_indent()
1846 jb.sb.write_string('"pos": ')
1847 jb.write_pos(expr.pos)
1848 jb.sb.write_string('\n')
1849
1850 jb.indent--
1851 jb.write_indent()
1852 jb.sb.write_string('}')
1853}
1854
1855fn (mut jb JsonBuilder) write_range_expr(expr ast.RangeExpr) {
1856 jb.sb.write_string('{\n')
1857 jb.indent++
1858
1859 jb.write_indent()
1860 jb.sb.write_string('"type": "RangeExpr",\n')
1861
1862 jb.write_indent()
1863 jb.sb.write_string('"op": ')
1864 jb.write_string(expr.op.str())
1865 jb.sb.write_string(',\n')
1866
1867 jb.write_indent()
1868 jb.sb.write_string('"start": ')
1869 jb.write_expr(expr.start)
1870 jb.sb.write_string(',\n')
1871
1872 jb.write_indent()
1873 jb.sb.write_string('"end": ')
1874 jb.write_expr(expr.end)
1875 jb.sb.write_string('\n')
1876
1877 jb.indent--
1878 jb.write_indent()
1879 jb.sb.write_string('}')
1880}
1881
1882fn (mut jb JsonBuilder) write_select_expr(expr ast.SelectExpr) {
1883 jb.sb.write_string('{\n')
1884 jb.indent++
1885
1886 jb.write_indent()
1887 jb.sb.write_string('"type": "SelectExpr",\n')
1888
1889 jb.write_indent()
1890 jb.sb.write_string('"stmt": ')
1891 jb.write_stmt(expr.stmt)
1892 jb.sb.write_string(',\n')
1893
1894 jb.write_indent()
1895 jb.sb.write_string('"stmts": ')
1896 jb.write_stmts(expr.stmts)
1897 jb.sb.write_string(',\n')
1898
1899 jb.write_indent()
1900 jb.sb.write_string('"next": ')
1901 jb.write_expr(expr.next)
1902 jb.sb.write_string(',\n')
1903
1904 jb.write_indent()
1905 jb.sb.write_string('"pos": ')
1906 jb.write_pos(expr.pos)
1907 jb.sb.write_string('\n')
1908
1909 jb.indent--
1910 jb.write_indent()
1911 jb.sb.write_string('}')
1912}
1913
1914fn (mut jb JsonBuilder) write_selector_expr(expr ast.SelectorExpr) {
1915 jb.sb.write_string('{\n')
1916 jb.indent++
1917
1918 jb.write_indent()
1919 jb.sb.write_string('"type": "SelectorExpr",\n')
1920
1921 jb.write_indent()
1922 jb.sb.write_string('"lhs": ')
1923 jb.write_expr(expr.lhs)
1924 jb.sb.write_string(',\n')
1925
1926 jb.write_indent()
1927 jb.sb.write_string('"rhs": ')
1928 jb.write_ident(expr.rhs)
1929 jb.sb.write_string(',\n')
1930
1931 jb.write_indent()
1932 jb.sb.write_string('"pos": ')
1933 jb.write_pos(expr.pos)
1934 jb.sb.write_string('\n')
1935
1936 jb.indent--
1937 jb.write_indent()
1938 jb.sb.write_string('}')
1939}
1940
1941fn (mut jb JsonBuilder) write_string_inter_literal(expr ast.StringInterLiteral) {
1942 jb.sb.write_string('{\n')
1943 jb.indent++
1944
1945 jb.write_indent()
1946 jb.sb.write_string('"type": "StringInterLiteral",\n')
1947
1948 jb.write_indent()
1949 jb.sb.write_string('"kind": ')
1950 jb.write_string(expr.kind.str())
1951 jb.sb.write_string(',\n')
1952
1953 jb.write_indent()
1954 jb.sb.write_string('"values": [\n')
1955 jb.indent++
1956 for i, val in expr.values {
1957 jb.write_indent()
1958 jb.write_string(val)
1959 if i < expr.values.len - 1 {
1960 jb.sb.write_string(',')
1961 }
1962 jb.sb.write_string('\n')
1963 }
1964 jb.indent--
1965 jb.write_indent()
1966 jb.sb.write_string('],\n')
1967
1968 jb.write_indent()
1969 jb.sb.write_string('"inters": ')
1970 jb.write_string_inters(expr.inters)
1971 jb.sb.write_string('\n')
1972
1973 jb.indent--
1974 jb.write_indent()
1975 jb.sb.write_string('}')
1976}
1977
1978fn (mut jb JsonBuilder) write_string_inters(inters []ast.StringInter) {
1979 jb.sb.write_string('[\n')
1980 jb.indent++
1981 for i, inter in inters {
1982 jb.write_indent()
1983 jb.write_string_inter(inter)
1984 if i < inters.len - 1 {
1985 jb.sb.write_string(',')
1986 }
1987 jb.sb.write_string('\n')
1988 }
1989 jb.indent--
1990 jb.write_indent()
1991 jb.sb.write_string(']')
1992}
1993
1994fn (mut jb JsonBuilder) write_string_inter(inter ast.StringInter) {
1995 jb.sb.write_string('{\n')
1996 jb.indent++
1997
1998 jb.write_indent()
1999 jb.sb.write_string('"format": ')
2000 jb.write_string(inter.format.str())
2001 jb.sb.write_string(',\n')
2002
2003 jb.write_indent()
2004 jb.sb.write_string('"width": ${inter.width},\n')
2005
2006 jb.write_indent()
2007 jb.sb.write_string('"precision": ${inter.precision},\n')
2008
2009 jb.write_indent()
2010 jb.sb.write_string('"expr": ')
2011 jb.write_expr(inter.expr)
2012 jb.sb.write_string(',\n')
2013
2014 jb.write_indent()
2015 jb.sb.write_string('"format_expr": ')
2016 jb.write_expr(inter.format_expr)
2017 jb.sb.write_string('\n')
2018
2019 jb.indent--
2020 jb.write_indent()
2021 jb.sb.write_string('}')
2022}
2023
2024fn (mut jb JsonBuilder) write_string_literal(expr ast.StringLiteral) {
2025 jb.sb.write_string('{\n')
2026 jb.indent++
2027
2028 jb.write_indent()
2029 jb.sb.write_string('"type": "StringLiteral",\n')
2030
2031 jb.write_indent()
2032 jb.sb.write_string('"kind": ')
2033 jb.write_string(expr.kind.str())
2034 jb.sb.write_string(',\n')
2035
2036 jb.write_indent()
2037 jb.sb.write_string('"value": ')
2038 jb.write_string(expr.value)
2039 jb.sb.write_string('\n')
2040
2041 jb.indent--
2042 jb.write_indent()
2043 jb.sb.write_string('}')
2044}
2045
2046fn (mut jb JsonBuilder) write_tuple(expr ast.Tuple) {
2047 jb.sb.write_string('{\n')
2048 jb.indent++
2049
2050 jb.write_indent()
2051 jb.sb.write_string('"type": "Tuple",\n')
2052
2053 jb.write_indent()
2054 jb.sb.write_string('"exprs": ')
2055 jb.write_exprs(expr.exprs)
2056 jb.sb.write_string('\n')
2057
2058 jb.indent--
2059 jb.write_indent()
2060 jb.sb.write_string('}')
2061}
2062
2063fn (mut jb JsonBuilder) write_type_expr(expr ast.Type) {
2064 match expr {
2065 ast.ArrayType {
2066 jb.write_array_type(expr)
2067 }
2068 ast.ArrayFixedType {
2069 jb.write_array_fixed_type(expr)
2070 }
2071 ast.ChannelType {
2072 jb.write_channel_type(expr)
2073 }
2074 ast.FnType {
2075 jb.write_fn_type(expr)
2076 }
2077 ast.GenericType {
2078 jb.write_generic_type(expr)
2079 }
2080 ast.MapType {
2081 jb.write_map_type(expr)
2082 }
2083 ast.NilType {
2084 jb.sb.write_string('{"type": "NilType"}')
2085 }
2086 ast.NoneType {
2087 jb.sb.write_string('{"type": "NoneType"}')
2088 }
2089 ast.OptionType {
2090 jb.write_option_type(expr)
2091 }
2092 ast.PointerType {
2093 jb.write_pointer_type(expr)
2094 }
2095 ast.ResultType {
2096 jb.write_result_type(expr)
2097 }
2098 ast.ThreadType {
2099 jb.write_thread_type(expr)
2100 }
2101 ast.TupleType {
2102 jb.write_tuple_type(expr)
2103 }
2104 ast.AnonStructType {
2105 jb.write_anon_struct_type(expr)
2106 }
2107 }
2108}
2109
2110fn (mut jb JsonBuilder) write_array_type(typ ast.ArrayType) {
2111 jb.sb.write_string('{\n')
2112 jb.indent++
2113
2114 jb.write_indent()
2115 jb.sb.write_string('"type": "ArrayType",\n')
2116
2117 jb.write_indent()
2118 jb.sb.write_string('"elem_type": ')
2119 jb.write_expr(typ.elem_type)
2120 jb.sb.write_string('\n')
2121
2122 jb.indent--
2123 jb.write_indent()
2124 jb.sb.write_string('}')
2125}
2126
2127fn (mut jb JsonBuilder) write_array_fixed_type(typ ast.ArrayFixedType) {
2128 jb.sb.write_string('{\n')
2129 jb.indent++
2130
2131 jb.write_indent()
2132 jb.sb.write_string('"type": "ArrayFixedType",\n')
2133
2134 jb.write_indent()
2135 jb.sb.write_string('"elem_type": ')
2136 jb.write_expr(typ.elem_type)
2137 jb.sb.write_string(',\n')
2138
2139 jb.write_indent()
2140 jb.sb.write_string('"len": ')
2141 jb.write_expr(typ.len)
2142 jb.sb.write_string('\n')
2143
2144 jb.indent--
2145 jb.write_indent()
2146 jb.sb.write_string('}')
2147}
2148
2149fn (mut jb JsonBuilder) write_channel_type(typ ast.ChannelType) {
2150 jb.sb.write_string('{\n')
2151 jb.indent++
2152
2153 jb.write_indent()
2154 jb.sb.write_string('"type": "ChannelType",\n')
2155
2156 jb.write_indent()
2157 jb.sb.write_string('"elem_type": ')
2158 jb.write_expr(typ.elem_type)
2159 jb.sb.write_string(',\n')
2160
2161 jb.write_indent()
2162 jb.sb.write_string('"cap": ')
2163 jb.write_expr(typ.cap)
2164 jb.sb.write_string('\n')
2165
2166 jb.indent--
2167 jb.write_indent()
2168 jb.sb.write_string('}')
2169}
2170
2171fn (mut jb JsonBuilder) write_fn_type(typ ast.FnType) {
2172 jb.sb.write_string('{\n')
2173 jb.indent++
2174
2175 jb.write_indent()
2176 jb.sb.write_string('"type": "FnType",\n')
2177
2178 jb.write_indent()
2179 jb.sb.write_string('"generic_params": ')
2180 jb.write_exprs(typ.generic_params)
2181 jb.sb.write_string(',\n')
2182
2183 jb.write_indent()
2184 jb.sb.write_string('"params": ')
2185 jb.write_parameters(typ.params)
2186 jb.sb.write_string(',\n')
2187
2188 jb.write_indent()
2189 jb.sb.write_string('"return_type": ')
2190 jb.write_expr(typ.return_type)
2191 jb.sb.write_string('\n')
2192
2193 jb.indent--
2194 jb.write_indent()
2195 jb.sb.write_string('}')
2196}
2197
2198fn (mut jb JsonBuilder) write_generic_type(typ ast.GenericType) {
2199 jb.sb.write_string('{\n')
2200 jb.indent++
2201
2202 jb.write_indent()
2203 jb.sb.write_string('"type": "GenericType",\n')
2204
2205 jb.write_indent()
2206 jb.sb.write_string('"name": ')
2207 jb.write_expr(typ.name)
2208 jb.sb.write_string(',\n')
2209
2210 jb.write_indent()
2211 jb.sb.write_string('"params": ')
2212 jb.write_exprs(typ.params)
2213 jb.sb.write_string('\n')
2214
2215 jb.indent--
2216 jb.write_indent()
2217 jb.sb.write_string('}')
2218}
2219
2220fn (mut jb JsonBuilder) write_map_type(typ ast.MapType) {
2221 jb.sb.write_string('{\n')
2222 jb.indent++
2223
2224 jb.write_indent()
2225 jb.sb.write_string('"type": "MapType",\n')
2226
2227 jb.write_indent()
2228 jb.sb.write_string('"key_type": ')
2229 jb.write_expr(typ.key_type)
2230 jb.sb.write_string(',\n')
2231
2232 jb.write_indent()
2233 jb.sb.write_string('"value_type": ')
2234 jb.write_expr(typ.value_type)
2235 jb.sb.write_string('\n')
2236
2237 jb.indent--
2238 jb.write_indent()
2239 jb.sb.write_string('}')
2240}
2241
2242fn (mut jb JsonBuilder) write_option_type(typ ast.OptionType) {
2243 jb.sb.write_string('{\n')
2244 jb.indent++
2245
2246 jb.write_indent()
2247 jb.sb.write_string('"type": "OptionType",\n')
2248
2249 jb.write_indent()
2250 jb.sb.write_string('"base_type": ')
2251 jb.write_expr(typ.base_type)
2252 jb.sb.write_string('\n')
2253
2254 jb.indent--
2255 jb.write_indent()
2256 jb.sb.write_string('}')
2257}
2258
2259fn (mut jb JsonBuilder) write_pointer_type(typ ast.PointerType) {
2260 jb.sb.write_string('{\n')
2261 jb.indent++
2262
2263 jb.write_indent()
2264 jb.sb.write_string('"type": "PointerType",\n')
2265
2266 jb.write_indent()
2267 jb.sb.write_string('"base_type": ')
2268 jb.write_expr(typ.base_type)
2269 jb.sb.write_string(',\n')
2270
2271 jb.write_indent()
2272 jb.sb.write_string('"lifetime": ')
2273 jb.write_string(typ.lifetime)
2274 jb.sb.write_string('\n')
2275
2276 jb.indent--
2277 jb.write_indent()
2278 jb.sb.write_string('}')
2279}
2280
2281fn (mut jb JsonBuilder) write_result_type(typ ast.ResultType) {
2282 jb.sb.write_string('{\n')
2283 jb.indent++
2284
2285 jb.write_indent()
2286 jb.sb.write_string('"type": "ResultType",\n')
2287
2288 jb.write_indent()
2289 jb.sb.write_string('"base_type": ')
2290 jb.write_expr(typ.base_type)
2291 jb.sb.write_string('\n')
2292
2293 jb.indent--
2294 jb.write_indent()
2295 jb.sb.write_string('}')
2296}
2297
2298fn (mut jb JsonBuilder) write_thread_type(typ ast.ThreadType) {
2299 jb.sb.write_string('{\n')
2300 jb.indent++
2301
2302 jb.write_indent()
2303 jb.sb.write_string('"type": "ThreadType",\n')
2304
2305 jb.write_indent()
2306 jb.sb.write_string('"elem_type": ')
2307 jb.write_expr(typ.elem_type)
2308 jb.sb.write_string('\n')
2309
2310 jb.indent--
2311 jb.write_indent()
2312 jb.sb.write_string('}')
2313}
2314
2315fn (mut jb JsonBuilder) write_tuple_type(typ ast.TupleType) {
2316 jb.sb.write_string('{\n')
2317 jb.indent++
2318
2319 jb.write_indent()
2320 jb.sb.write_string('"type": "TupleType",\n')
2321
2322 jb.write_indent()
2323 jb.sb.write_string('"types": ')
2324 jb.write_exprs(typ.types)
2325 jb.sb.write_string('\n')
2326
2327 jb.indent--
2328 jb.write_indent()
2329 jb.sb.write_string('}')
2330}
2331
2332fn (mut jb JsonBuilder) write_anon_struct_type(typ ast.AnonStructType) {
2333 jb.sb.write_string('{\n')
2334 jb.indent++
2335
2336 jb.write_indent()
2337 jb.sb.write_string('"type": "AnonStructType",\n')
2338
2339 jb.write_indent()
2340 jb.sb.write_string('"generic_params": ')
2341 jb.write_exprs(typ.generic_params)
2342 jb.sb.write_string(',\n')
2343
2344 jb.write_indent()
2345 jb.sb.write_string('"embedded": ')
2346 jb.write_exprs(typ.embedded)
2347 jb.sb.write_string(',\n')
2348
2349 jb.write_indent()
2350 jb.sb.write_string('"fields": ')
2351 jb.write_field_decls(typ.fields)
2352 jb.sb.write_string('\n')
2353
2354 jb.indent--
2355 jb.write_indent()
2356 jb.sb.write_string('}')
2357}
2358
2359fn (mut jb JsonBuilder) write_unsafe_expr(expr ast.UnsafeExpr) {
2360 jb.sb.write_string('{\n')
2361 jb.indent++
2362
2363 jb.write_indent()
2364 jb.sb.write_string('"type": "UnsafeExpr",\n')
2365
2366 jb.write_indent()
2367 jb.sb.write_string('"stmts": ')
2368 jb.write_stmts(expr.stmts)
2369 jb.sb.write_string('\n')
2370
2371 jb.indent--
2372 jb.write_indent()
2373 jb.sb.write_string('}')
2374}
2375
2376fn (mut jb JsonBuilder) write_parameters(params []ast.Parameter) {
2377 jb.sb.write_string('[\n')
2378 jb.indent++
2379 for i, param in params {
2380 jb.write_indent()
2381 jb.write_parameter(param)
2382 if i < params.len - 1 {
2383 jb.sb.write_string(',')
2384 }
2385 jb.sb.write_string('\n')
2386 }
2387 jb.indent--
2388 jb.write_indent()
2389 jb.sb.write_string(']')
2390}
2391
2392fn (mut jb JsonBuilder) write_parameter(param ast.Parameter) {
2393 jb.sb.write_string('{\n')
2394 jb.indent++
2395
2396 jb.write_indent()
2397 jb.sb.write_string('"name": ')
2398 jb.write_string(param.name)
2399 jb.sb.write_string(',\n')
2400
2401 jb.write_indent()
2402 jb.sb.write_string('"param_type": ')
2403 jb.write_expr(param.typ)
2404 jb.sb.write_string(',\n')
2405
2406 jb.write_indent()
2407 jb.sb.write_string('"is_mut": ${param.is_mut},\n')
2408
2409 jb.write_indent()
2410 jb.sb.write_string('"pos": ')
2411 jb.write_pos(param.pos)
2412 jb.sb.write_string('\n')
2413
2414 jb.indent--
2415 jb.write_indent()
2416 jb.sb.write_string('}')
2417}
2418
2419fn (mut jb JsonBuilder) write_fn_decls(decls []ast.FnDecl) {
2420 jb.sb.write_string('[\n')
2421 jb.indent++
2422 for i, decl in decls {
2423 jb.write_indent()
2424 jb.write_fn_decl(decl)
2425 if i < decls.len - 1 {
2426 jb.sb.write_string(',')
2427 }
2428 jb.sb.write_string('\n')
2429 }
2430 jb.indent--
2431 jb.write_indent()
2432 jb.sb.write_string(']')
2433}
2434
2435fn (mut jb JsonBuilder) write_pos(pos token.Pos) {
2436 jb.sb.write_string('${pos.offset}')
2437}
2438