jaclang 0.2.5__py3-none-any.whl → 0.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of jaclang might be problematic. Click here for more details.

Files changed (72) hide show
  1. jaclang/__init__.py +3 -3
  2. jaclang/cli/__init__.py +0 -1
  3. jaclang/cli/__jac_gen__/cli.py +4 -4
  4. jaclang/cli/__jac_gen__/cmds.py +1 -1
  5. jaclang/cli/__jac_gen__/cmds_impl.py +1 -1
  6. jaclang/core/__init__.py +5 -11
  7. jaclang/core/__jac_gen__/corelib.py +289 -0
  8. jaclang/core/__jac_gen__/corelib_impl.py +220 -0
  9. jaclang/core/corelib.jac +21 -34
  10. jaclang/core/corelib_impl.jac +317 -0
  11. jaclang/jac/__init__.py +1 -0
  12. jaclang/jac/__jac_gen__/jac_parser.py +2 -2
  13. jaclang/jac/absyntree.py +28 -8
  14. jaclang/jac/constant.py +3 -7
  15. jaclang/jac/parser.py +13 -9
  16. jaclang/jac/passes/main/__init__.py +2 -0
  17. jaclang/jac/passes/main/def_use_pass.py +3 -2
  18. jaclang/jac/passes/main/pyast_gen_pass.py +99 -34
  19. jaclang/jac/passes/main/schedules.py +6 -0
  20. jaclang/jac/passes/main/sym_tab_build_pass.py +3 -5
  21. jaclang/jac/passes/main/tests/test_jac_format_pass.py +22 -4
  22. jaclang/jac/passes/main/tests/test_type_check_pass.py +42 -0
  23. jaclang/jac/passes/main/type_check_pass.py +103 -0
  24. jaclang/jac/passes/tool/fuse_comments_pass.py +57 -39
  25. jaclang/jac/passes/tool/jac_formatter_pass.py +419 -192
  26. jaclang/jac/passes/transform.py +0 -39
  27. jaclang/jac/passes/utils/__init__.py +1 -0
  28. jaclang/jac/passes/utils/mypy_ast_build.py +302 -0
  29. jaclang/jac/plugin/__init__.py +5 -2
  30. jaclang/jac/plugin/default.py +20 -4
  31. jaclang/jac/plugin/feature.py +15 -6
  32. jaclang/jac/plugin/spec.py +34 -6
  33. jaclang/jac/tests/test_workspace.py +45 -5
  34. jaclang/jac/transpiler.py +4 -9
  35. jaclang/utils/helpers.py +0 -33
  36. jaclang/utils/lang_tools.py +3 -0
  37. jaclang/utils/test.py +3 -1
  38. jaclang/vendor/lark/py.typed +0 -0
  39. jaclang/vendor/mypy/checker.py +19 -12
  40. jaclang/vendor/mypy/checkexpr.py +31 -10
  41. jaclang/vendor/mypy/constraints.py +56 -38
  42. jaclang/vendor/mypy/expandtype.py +1 -0
  43. jaclang/vendor/mypy/meet.py +10 -1
  44. jaclang/vendor/mypy/messages.py +16 -4
  45. jaclang/vendor/mypy/moduleinspect.py +10 -4
  46. jaclang/vendor/mypy/py.typed +1 -0
  47. jaclang/vendor/mypy/semanal.py +18 -17
  48. jaclang/vendor/mypy/semanal_enum.py +7 -4
  49. jaclang/vendor/mypy/semanal_namedtuple.py +11 -1
  50. jaclang/vendor/mypy/semanal_typeddict.py +25 -11
  51. jaclang/vendor/mypy/stubdoc.py +18 -4
  52. jaclang/vendor/mypy/stubgen.py +80 -1
  53. jaclang/vendor/mypy/stubgenc.py +47 -5
  54. jaclang/vendor/mypy/stubtest.py +53 -3
  55. jaclang/vendor/mypy/stubutil.py +9 -9
  56. jaclang/vendor/mypy/test/testipc.py +16 -7
  57. jaclang/vendor/mypy/test/teststubtest.py +20 -2
  58. jaclang/vendor/mypy/types.py +1 -1
  59. jaclang/vendor/mypyc/irbuild/prebuildvisitor.py +2 -1
  60. jaclang/vendor/mypyc/test/test_run.py +2 -4
  61. jaclang/vendor/pluggy/py.typed +0 -0
  62. {jaclang-0.2.5.dist-info → jaclang-0.3.0.dist-info}/METADATA +1 -1
  63. {jaclang-0.2.5.dist-info → jaclang-0.3.0.dist-info}/RECORD +67 -62
  64. {jaclang-0.2.5.dist-info → jaclang-0.3.0.dist-info}/WHEEL +1 -1
  65. {jaclang-0.2.5.dist-info → jaclang-0.3.0.dist-info}/entry_points.txt +3 -0
  66. jaclang/core/arch_impl.jac +0 -131
  67. jaclang/core/element_impl.jac +0 -109
  68. jaclang/core/exec_ctx_impl.jac +0 -14
  69. jaclang/core/memory_impl.jac +0 -57
  70. jaclang/jac/tests/fixtures/__jac_gen__/hello_world.py +0 -5
  71. /jaclang/{jac/tests/fixtures → core}/__jac_gen__/__init__.py +0 -0
  72. {jaclang-0.2.5.dist-info → jaclang-0.3.0.dist-info}/top_level.txt +0 -0
@@ -16,7 +16,6 @@ class JacFormatPass(Pass):
16
16
  self.comments: list[ast.CommentToken] = []
17
17
  self.indent_size = 4
18
18
  self.indent_level = 0
19
- self.prev_brac = False
20
19
 
21
20
  def indent_str(self) -> str:
22
21
  """Return string for indent."""
@@ -75,9 +74,19 @@ class JacFormatPass(Pass):
75
74
  body: Sequence[ElementStmt],
76
75
  is_imported: bool,
77
76
  """
78
- if node.doc:
79
- self.emit_ln(node, node.doc.value)
80
- self.emit_ln(node, "")
77
+ for i in node.kid:
78
+ if isinstance(i, ast.String):
79
+ self.emit_ln(node, f" {i.gen.jac}")
80
+ elif isinstance(i, ast.CommentToken):
81
+ if i.is_inline:
82
+ self.emit(node, f" {i.gen.jac}")
83
+ else:
84
+ self.emit_ln(node, i.gen.jac)
85
+ elif isinstance(i, ast.Token):
86
+ self.emit(node, i.value.strip("") + " ")
87
+ elif isinstance(i, ast.SubTag):
88
+ for j in i.kid:
89
+ self.emit(node, j.gen.jac)
81
90
  for i in node.body:
82
91
  self.emit_ln(node, i.gen.jac)
83
92
  self.emit_ln(node, "")
@@ -90,11 +99,14 @@ class JacFormatPass(Pass):
90
99
  is_frozen: bool,
91
100
  doc: Optional[String] = None,
92
101
  """
93
- if node.doc:
94
- self.emit_ln(node, node.doc.value)
95
102
  for i in node.kid:
96
103
  if isinstance(i, ast.String):
97
- continue
104
+ self.emit_ln(node, f" {i.gen.jac}")
105
+ elif isinstance(i, ast.CommentToken):
106
+ if i.is_inline:
107
+ self.emit(node, f" {i.gen.jac}")
108
+ else:
109
+ self.emit_ln(node, i.gen.jac)
98
110
  elif isinstance(i, ast.Token):
99
111
  if i.name == "SEMI":
100
112
  self.emit_ln(node, i.value + " ")
@@ -111,12 +123,10 @@ class JacFormatPass(Pass):
111
123
  body: SubNodeList[CodeBlockStmt],
112
124
  doc: Optional[Constant] = None,
113
125
  """
114
- if node.doc:
115
- self.emit_ln(node, node.doc.value)
116
126
  for i in node.kid:
117
127
  if isinstance(i, ast.String):
118
- continue
119
- if isinstance(i, ast.Token):
128
+ self.emit_ln(node, f"{i.gen.jac}")
129
+ elif isinstance(i, ast.Token):
120
130
  self.emit(node, i.value.strip("") + " ")
121
131
  elif isinstance(i, ast.SubTag):
122
132
  for j in i.kid:
@@ -129,58 +139,62 @@ class JacFormatPass(Pass):
129
139
 
130
140
  items: list[T],
131
141
  """
132
- count = 0
133
- for stmt in node.kid:
142
+ prev_token = None
143
+ for i, stmt in enumerate(node.kid):
144
+ if isinstance(node.parent, (ast.EnumDef, ast.Enum)) and stmt.gen.jac == ",":
145
+ self.indent_level -= 1
146
+ self.emit_ln(node, f"{stmt.gen.jac}")
147
+ self.indent_level += 1
148
+ continue
134
149
  if isinstance(stmt, ast.Token):
135
150
  if stmt.name == "LBRACE":
136
151
  if (
137
- count + 1 < len(node.kid)
138
- and isinstance(node.kid[count + 1], ast.CommentToken)
139
- and node.kid[count + 1].is_inline
152
+ isinstance(node.kid[i + 1], ast.CommentToken)
153
+ and node.kid[i + 1].is_inline
140
154
  ):
141
- self.emit(node, f"{stmt.value}")
155
+ self.emit(node, f" {stmt.value}")
142
156
  else:
143
- self.emit_ln(node, f" {stmt.value}")
157
+ self.emit_ln(node, f" {stmt.value} ")
144
158
  self.indent_level += 1
145
- count += 1
146
159
  elif stmt.name == "RBRACE":
147
160
  self.indent_level -= 1
148
- if (
149
- isinstance(stmt.parent.parent, (ast.ElseIf, ast.IfStmt))
150
- and not self.prev_brac
151
- ):
161
+ if isinstance(stmt.parent.parent, (ast.ElseIf, ast.IfStmt)):
152
162
  self.emit(node, f"{stmt.value}")
153
- self.prev_brac = True
154
163
 
155
164
  else:
156
- if (
157
- count + 1 < len(node.kid)
158
- and isinstance(node.kid[count + 1], ast.CommentToken)
159
- and node.kid[count + 1].is_inline
165
+ if i < (len(node.kid) - 1) and (
166
+ isinstance(node.kid[i + 1], ast.CommentToken)
167
+ and node.kid[i + 1].is_inline
160
168
  ):
161
- self.emit(node, f"{stmt.value.lstrip()}")
162
- self.prev_brac = True
169
+ self.emit(node, f" {stmt.value}")
170
+ elif not (node.gen.jac).endswith("\n"):
171
+ self.emit_ln(node, "")
172
+ self.emit_ln(node, f"{stmt.value}")
163
173
  else:
164
174
  self.emit_ln(node, f"{stmt.value}")
165
- self.prev_brac = False
166
- count += 1
167
175
  elif isinstance(stmt, ast.CommentToken):
168
- self.emit_ln(node, f" {stmt.value}")
176
+ if stmt.is_inline:
177
+ if isinstance(prev_token, ast.Semi) or prev_token.name in [
178
+ "LBRACE",
179
+ "RBRACE",
180
+ ]:
181
+ self.indent_level -= 1
182
+ self.emit(node, f" {stmt.gen.jac}")
183
+ self.emit_ln(node, "")
184
+ self.indent_level += 1
185
+ else:
186
+ self.emit(node, f"{stmt.gen.jac}")
187
+ else:
188
+ self.emit_ln(node, "")
189
+ self.emit_ln(node, stmt.gen.jac)
169
190
  else:
170
191
  self.emit(node, f"{stmt.value}")
171
- count += 1
172
192
  continue
173
- elif isinstance(stmt, ast.Assignment):
174
- self.emit(node, f"{stmt.gen.jac}")
175
- count += 1
193
+ elif isinstance(stmt, (ast.Assignment, ast.Semi)):
194
+ self.emit(node, f"{stmt.gen.jac} ")
176
195
  else:
177
- if isinstance(stmt, ast.ExprStmt):
178
- self.emit(node, f"{stmt.gen.jac}")
179
- count += 1
180
- else:
181
- self.emit(node, f"{stmt.gen.jac}")
182
- count += 1
183
- continue
196
+ self.emit(node, f"{stmt.gen.jac}")
197
+ prev_token = stmt
184
198
 
185
199
  def exit_sub_tag(self, node: ast.SubTag) -> None:
186
200
  """Sub objects.
@@ -196,12 +210,12 @@ class JacFormatPass(Pass):
196
210
  target: AtomType,
197
211
  params: Optional[ParamList],
198
212
  """
199
- # node.print()
200
213
  for i in node.kid:
201
214
  if isinstance(i, ast.CommentToken):
202
215
  if i.is_inline:
203
216
  self.emit(node, f" {i.gen.jac}")
204
217
  else:
218
+ self.emit_ln(node, "")
205
219
  self.emit_ln(node, i.gen.jac)
206
220
  else:
207
221
  self.emit(node, i.gen.jac)
@@ -302,7 +316,7 @@ class JacFormatPass(Pass):
302
316
  else:
303
317
  self.emit_ln(node, i.gen.jac)
304
318
  elif isinstance(i, ast.Semi):
305
- self.emit(node, f"{i.gen.jac}")
319
+ self.emit(node, f"{i.gen.jac} ")
306
320
  else:
307
321
  if start:
308
322
  self.emit(node, f"{i.gen.jac}")
@@ -323,24 +337,30 @@ class JacFormatPass(Pass):
323
337
  doc: Optional[Constant] = None,
324
338
  sub_module: Optional[Module] = None,
325
339
  """
326
- if node.items:
327
- self.emit(
328
- node,
329
- f"import:{node.lang.tag.value} from {node.path.gen.jac}, {node.items.gen.jac};", # noqa
330
- )
331
- self.emit_ln(node, "")
332
- else:
333
- if node.is_absorb:
334
- self.emit_ln(
335
- node,
336
- f"include:{node.lang.tag.value} {node.path.gen.jac};",
337
- )
340
+ start = True
341
+ for i in node.kid:
342
+ if isinstance(i, ast.CommentToken):
343
+ if i.is_inline:
344
+ self.emit(node, f" {i.gen.jac}")
345
+ elif not node.gen.jac.endswith("\n"):
346
+ self.emit_ln(node, "")
347
+ self.emit_ln(node, i.gen.jac)
348
+ else:
349
+ self.emit_ln(node, i.gen.jac)
350
+ elif isinstance(i, ast.Semi):
351
+ self.emit(node, f"{i.gen.jac} ")
352
+ elif i.gen.jac.startswith(":"):
353
+ self.emit(node, f"{i.gen.jac}")
338
354
  else:
339
- self.emit(
340
- node,
341
- f"import:{node.lang.tag.value} {node.path.gen.jac};",
342
- )
343
- self.emit_ln(node, "")
355
+ if start:
356
+ self.emit(node, f"{i.gen.jac}")
357
+ start = False
358
+ elif i.gen.jac == ",":
359
+ self.emit(node, f"{i.gen.jac} ")
360
+ else:
361
+ self.emit(node, f" {i.gen.jac}")
362
+ if isinstance(node.kid[-1], (ast.Semi)) and not node.gen.jac.endswith("\n"):
363
+ self.emit_ln(node, "")
344
364
 
345
365
  def exit_arch_def(self, node: ast.ArchDef) -> None:
346
366
  """Sub objects.
@@ -370,17 +390,20 @@ class JacFormatPass(Pass):
370
390
  doc: Optional[Constant] = None,
371
391
  decorators: Optional[SubNodeList[ExprType]] = None,
372
392
  """
373
- if node.doc:
374
- self.emit_ln(node, node.doc.gen.jac)
375
393
  start = True
394
+ prev_token = None
376
395
  for i in node.kid:
377
- if isinstance(i, ast.CommentToken):
396
+ if isinstance(i, ast.String):
397
+ self.emit_ln(node, f"{i.gen.jac}")
398
+ elif isinstance(i, ast.CommentToken):
378
399
  if i.is_inline:
379
400
  self.emit(node, f" {i.gen.jac}")
401
+ if isinstance(prev_token, ast.Semi):
402
+ self.emit_ln(node, "")
380
403
  else:
381
404
  self.emit_ln(node, i.gen.jac)
382
405
  elif isinstance(i, ast.Semi):
383
- self.emit(node, f"{i.gen.jac}")
406
+ self.emit(node, f"{i.gen.jac} ")
384
407
  elif isinstance(i, ast.SubNodeList) and i.gen.jac.startswith("@"):
385
408
  self.emit_ln(node, i.gen.jac)
386
409
  else:
@@ -389,7 +412,8 @@ class JacFormatPass(Pass):
389
412
  start = False
390
413
  else:
391
414
  self.emit(node, f" {i.gen.jac}")
392
- if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
415
+ prev_token = i
416
+ if isinstance(node.kid[-1], (ast.Semi)):
393
417
  self.emit_ln(node, "")
394
418
 
395
419
  def exit_func_signature(self, node: ast.FuncSignature) -> None:
@@ -457,36 +481,26 @@ class JacFormatPass(Pass):
457
481
  base_classes: BaseClasses,
458
482
  body: Optional[EnumBlock],
459
483
  """
460
- if node.doc:
461
- self.emit_ln(node, node.doc.value)
462
- if node.decorators:
463
- self.emit_ln(node, node.decorators.gen.jac)
464
- if node.base_classes:
465
- self.emit(
466
- node,
467
- f"enum {node.name.gen.jac}({node.base_classes.gen.jac})", # noqa
468
- )
469
- else:
470
- self.emit(node, f"enum {node.name.value}")
471
- if node.body:
472
- for stmt in node.body.kid:
473
- if isinstance(stmt, ast.Token):
474
- if stmt.name == "LBRACE":
475
- self.emit_ln(node, f" {stmt.value}")
476
- self.indent_level += 1
477
- elif stmt.name == "RBRACE":
478
- self.emit_ln(node, "")
479
- self.indent_level -= 1
480
- self.emit_ln(node, f"{stmt.value}")
481
- # self.emit_ln(node, "")
482
- else:
483
- self.indent_level -= 1
484
- self.emit_ln(node, f"{stmt.value}")
485
- self.indent_level += 1
484
+ start = True
485
+ for i in node.kid:
486
+ if isinstance(i, ast.String):
487
+ self.emit(node, f"{i.gen.jac}")
488
+ elif isinstance(i, ast.CommentToken):
489
+ if i.is_inline:
490
+ self.emit(node, f" {i.gen.jac}")
486
491
  else:
487
- self.emit(node, f"{stmt.gen.jac}")
488
- else:
489
- self.emit(node, ";")
492
+ self.emit_ln(node, i.gen.jac)
493
+ elif isinstance(i, ast.Semi):
494
+ self.emit(node, f"{i.gen.jac} ")
495
+ elif isinstance(i, ast.SubNodeList) and i.gen.jac.startswith("@"):
496
+ self.emit_ln(node, i.gen.jac)
497
+ else:
498
+ if start:
499
+ self.emit(node, f"{i.gen.jac}")
500
+ start = False
501
+ else:
502
+ self.emit(node, f" {i.gen.jac}")
503
+ if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
490
504
  self.emit_ln(node, "")
491
505
 
492
506
  def exit_enum_def(self, node: ast.EnumDef) -> None:
@@ -620,7 +634,7 @@ class JacFormatPass(Pass):
620
634
  else:
621
635
  self.emit_ln(node, i.gen.jac)
622
636
  elif isinstance(i, ast.Semi):
623
- self.emit(node, f"{i.gen.jac}")
637
+ self.emit(node, f"{i.gen.jac} ")
624
638
  else:
625
639
  if start:
626
640
  self.emit(node, f"{i.gen.jac}")
@@ -635,11 +649,21 @@ class JacFormatPass(Pass):
635
649
 
636
650
  elseifs: list[IfStmt],
637
651
  """
638
- self.emit(node, f" elif {node.condition.gen.jac} ")
639
- self.emit(node, node.body.gen.jac)
640
-
641
- if node.else_body:
642
- self.emit(node, node.else_body.gen.jac)
652
+ start = True
653
+ for i in node.kid:
654
+ if isinstance(i, ast.CommentToken):
655
+ if i.is_inline:
656
+ self.emit(node, f" {i.gen.jac}")
657
+ else:
658
+ self.emit_ln(node, i.gen.jac)
659
+ elif isinstance(i, ast.Semi):
660
+ self.emit(node, f"{i.gen.jac} ")
661
+ else:
662
+ if start:
663
+ self.emit(node, f"{i.gen.jac}")
664
+ start = False
665
+ else:
666
+ self.emit(node, f" {i.gen.jac}")
643
667
 
644
668
  def exit_disengage_stmt(self, node: ast.DisengageStmt) -> None:
645
669
  """Sub objects."""
@@ -652,8 +676,21 @@ class JacFormatPass(Pass):
652
676
 
653
677
  body: CodeBlock,
654
678
  """
655
- self.emit(node, " else ")
656
- self.emit(node, node.body.gen.jac)
679
+ start = True
680
+ for i in node.kid:
681
+ if isinstance(i, ast.CommentToken):
682
+ if i.is_inline:
683
+ self.emit(node, f" {i.gen.jac}")
684
+ else:
685
+ self.emit_ln(node, i.gen.jac)
686
+ elif isinstance(i, ast.Semi):
687
+ self.emit(node, f"{i.gen.jac}")
688
+ else:
689
+ if start:
690
+ self.emit(node, f"{i.gen.jac}")
691
+ start = False
692
+ else:
693
+ self.emit(node, f" {i.gen.jac}")
657
694
 
658
695
  def exit_expr_stmt(self, node: ast.ExprStmt) -> None:
659
696
  """Sub objects.
@@ -666,6 +703,7 @@ class JacFormatPass(Pass):
666
703
  if i.is_inline:
667
704
  self.emit(node, f" {i.gen.jac}")
668
705
  else:
706
+ self.emit_ln(node, "")
669
707
  self.emit_ln(node, i.gen.jac)
670
708
  elif isinstance(i, ast.Semi):
671
709
  self.emit(node, f"{i.gen.jac}")
@@ -769,9 +807,18 @@ class JacFormatPass(Pass):
769
807
 
770
808
  target: SubNodeList[NameType],
771
809
  """
772
- self.emit(node, ":g:")
773
- self.comma_sep_node_list(node.target)
774
- self.emit_ln(node, f"{node.target.gen.jac}")
810
+ for i in node.kid:
811
+ if isinstance(i, ast.CommentToken):
812
+ if i.is_inline:
813
+ self.emit(node, f" {i.gen.jac}")
814
+ else:
815
+ self.emit_ln(node, i.gen.jac)
816
+ elif isinstance(i, ast.Semi):
817
+ self.emit_ln(node, i.gen.jac)
818
+ else:
819
+ self.emit(node, i.gen.jac)
820
+ if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
821
+ self.emit_ln(node, "")
775
822
 
776
823
  def exit_non_local_stmt(self, node: ast.GlobalStmt) -> None:
777
824
  """Sub objects.
@@ -815,28 +862,27 @@ class JacFormatPass(Pass):
815
862
  doc: Optional[Constant] = None,
816
863
  decorators: Optional[SubNodeList[ExprType]] = None,
817
864
  """
818
- self.emit_ln(node, "")
819
- if node.doc:
820
- self.emit_ln(node, node.doc.value)
821
- if node.decorators:
822
- self.emit_ln(node, node.decorators.gen.jac)
823
- if not node.base_classes:
824
- self.emit(
825
- node,
826
- f"{node.arch_type.value} {node.name.gen.jac} ",
827
- )
828
- else:
829
- self.sep_node_list(node.base_classes, delim=":")
830
- self.emit(
831
- node,
832
- f"{node.arch_type.value} {node.name.gen.jac}:{node.base_classes.gen.jac}: ", # noqa
833
- )
834
- body = node.body.body if isinstance(node.body, ast.ArchDef) else node.body
835
- if body:
836
- self.emit(node, body.gen.jac)
837
- else:
838
- self.decl_def_missing(node.name.gen.jac)
839
- self.emit_ln(node, "")
865
+ start = True
866
+ for i in node.kid:
867
+ if isinstance(i, ast.String):
868
+ self.emit_ln(node, f"{i.gen.jac}")
869
+ elif isinstance(i, ast.CommentToken):
870
+ if i.is_inline:
871
+ self.emit(node, f" {i.gen.jac}")
872
+ else:
873
+ self.emit_ln(node, i.gen.jac)
874
+ elif isinstance(i, ast.Semi):
875
+ self.emit(node, f"{i.gen.jac} ")
876
+ elif isinstance(i, ast.SubNodeList) and i.gen.jac.startswith("@"):
877
+ self.emit_ln(node, i.gen.jac)
878
+ else:
879
+ if start or i.gen.jac.startswith(":"):
880
+ self.emit(node, f"{i.gen.jac}")
881
+ start = False
882
+ else:
883
+ self.emit(node, f" {i.gen.jac}")
884
+ if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
885
+ self.emit_ln(node, "")
840
886
 
841
887
  def exit_f_string(self, node: ast.FString) -> None:
842
888
  """Sub objects.
@@ -911,10 +957,23 @@ class JacFormatPass(Pass):
911
957
 
912
958
  cause: Optional[ExprType],
913
959
  """
914
- if node.cause:
915
- node.gen.jac = f"raise {node.cause.gen.jac};"
916
- else:
917
- node.gen.jac = "raise;"
960
+ start = True
961
+ for i in node.kid:
962
+ if isinstance(i, ast.CommentToken):
963
+ if i.is_inline:
964
+ self.emit(node, f" {i.gen.jac}")
965
+ else:
966
+ self.emit_ln(node, i.gen.jac)
967
+ elif isinstance(i, ast.Semi):
968
+ self.emit(node, f"{i.gen.jac}")
969
+ else:
970
+ if start:
971
+ self.emit(node, f"{i.gen.jac}")
972
+ start = False
973
+ else:
974
+ self.emit(node, f" {i.gen.jac}")
975
+ if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
976
+ self.emit_ln(node, "")
918
977
 
919
978
  def exit_edge_op_ref(self, node: ast.EdgeOpRef) -> None:
920
979
  """Sub objects.
@@ -1145,16 +1204,23 @@ class JacFormatPass(Pass):
1145
1204
  condition: ExprType,
1146
1205
  error_msg: Optional[ExprType],
1147
1206
  """
1148
- if node.error_msg:
1149
- self.emit(
1150
- node,
1151
- f"assert {node.condition.gen.jac}, {node.error_msg.gen.jac}", # noqa
1152
- )
1153
- else:
1154
- self.emit(node, f"assert {node.condition.gen.jac}")
1155
-
1156
- if isinstance(node.kid[-1], ast.Token) and node.kid[-1].name == "SEMI":
1157
- self.emit_ln(node, node.kid[-1].value + " ")
1207
+ start = True
1208
+ for i in node.kid:
1209
+ if isinstance(i, ast.CommentToken):
1210
+ if i.is_inline:
1211
+ self.emit(node, f" {i.gen.jac}")
1212
+ else:
1213
+ self.emit_ln(node, i.gen.jac)
1214
+ elif isinstance(i, ast.Semi):
1215
+ self.emit(node, f"{i.gen.jac}")
1216
+ else:
1217
+ if start:
1218
+ self.emit(node, f"{i.gen.jac}")
1219
+ start = False
1220
+ else:
1221
+ self.emit(node, f" {i.gen.jac}")
1222
+ if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
1223
+ self.emit_ln(node, "")
1158
1224
 
1159
1225
  def exit_ctrl_stmt(self, node: ast.CtrlStmt) -> None:
1160
1226
  """Sub objects.
@@ -1254,16 +1320,27 @@ class JacFormatPass(Pass):
1254
1320
  doc: Optional[Token],
1255
1321
  body: CodeBlock,
1256
1322
  """
1257
- test_name = node.name.value
1258
- if test_name.startswith("test", 0, 4):
1259
- test_name = ""
1260
- if node.doc:
1261
- self.emit_ln(node, node.doc.gen.jac)
1262
- if test_name:
1263
- self.emit(node, f"test {test_name}")
1264
- else:
1265
- self.emit(node, "test")
1266
- self.emit(node, f"{node.body.gen.jac}")
1323
+ start = True
1324
+ for i in node.kid:
1325
+ if isinstance(i, ast.CommentToken):
1326
+ if i.is_inline:
1327
+ self.emit(node, f" {i.gen.jac}")
1328
+ else:
1329
+ self.emit_ln(node, "")
1330
+ self.emit_ln(node, i.gen.jac)
1331
+ elif isinstance(i, ast.Semi):
1332
+ self.emit(node, f"{i.gen.jac}")
1333
+ elif isinstance(i, ast.Name):
1334
+ if not i.value.startswith("test"):
1335
+ self.emit(node, f" {i.value} ")
1336
+ else:
1337
+ if start:
1338
+ self.emit(node, f"{i.gen.jac}")
1339
+ start = False
1340
+ else:
1341
+ self.emit(node, f" {i.gen.jac}")
1342
+ if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
1343
+ self.emit_ln(node, "")
1267
1344
 
1268
1345
  def exit_py_inline_code(self, node: ast.PyInlineCode) -> None:
1269
1346
  """Sub objects.
@@ -1277,14 +1354,21 @@ class JacFormatPass(Pass):
1277
1354
 
1278
1355
  archs: list[ArchRef],
1279
1356
  """
1357
+ start = True
1280
1358
  for i in node.kid:
1281
1359
  if isinstance(i, ast.CommentToken):
1282
1360
  if i.is_inline:
1283
1361
  self.emit(node, f" {i.gen.jac}")
1284
1362
  else:
1285
1363
  self.emit_ln(node, i.gen.jac)
1364
+ elif isinstance(i, ast.Semi):
1365
+ self.emit(node, f"{i.gen.jac}")
1286
1366
  else:
1287
- self.emit(node, i.gen.jac)
1367
+ if start:
1368
+ self.emit(node, f"{i.gen.jac}")
1369
+ start = False
1370
+ else:
1371
+ self.emit(node, f" {i.gen.jac}")
1288
1372
  if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
1289
1373
  self.emit_ln(node, "")
1290
1374
 
@@ -1301,12 +1385,24 @@ class JacFormatPass(Pass):
1301
1385
  target: ExprType
1302
1386
  cases: list[MatchCase],
1303
1387
  """
1304
- self.emit_ln(node, f"match {node.target.gen.jac} {{")
1305
- self.indent_level += 1
1306
- for case in node.cases:
1307
- self.emit_ln(node, case.gen.jac)
1308
- self.indent_level -= 1
1309
- self.emit_ln(node, "}")
1388
+ start = True
1389
+ for i in node.kid:
1390
+ if isinstance(i, ast.CommentToken):
1391
+ if i.is_inline:
1392
+ self.emit(node, f" {i.gen.jac}")
1393
+ else:
1394
+ self.emit_ln(node, "")
1395
+ self.emit_ln(node, i.gen.jac)
1396
+ elif isinstance(i, ast.Semi):
1397
+ self.emit(node, f"{i.gen.jac}")
1398
+ else:
1399
+ if start:
1400
+ self.emit(node, f"{i.gen.jac}")
1401
+ start = False
1402
+ else:
1403
+ self.emit(node, f" {i.gen.jac}")
1404
+ if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
1405
+ self.emit_ln(node, "")
1310
1406
 
1311
1407
  def exit_match_case(self, node: ast.MatchCase) -> None:
1312
1408
  """Sub objects.
@@ -1315,24 +1411,53 @@ class JacFormatPass(Pass):
1315
1411
  guard: Optional[ExprType],
1316
1412
  body: SubNodeList[CodeBlockStmt],
1317
1413
  """
1318
- if node.guard:
1319
- self.emit_ln(
1320
- node,
1321
- f"case {node.pattern.gen.jac} if {node.guard.gen.jac}:", # noqa
1322
- )
1323
- else:
1324
- self.emit(node, f"case {node.pattern.gen.jac}:")
1325
- self.indent_level += 1
1326
- self.nl_sep_node_list(node.body)
1327
- self.emit_ln(node, node.body.gen.jac)
1328
- self.indent_level -= 1
1414
+ start = True
1415
+ for i in node.kid:
1416
+ if isinstance(i, ast.CommentToken):
1417
+ if i.is_inline:
1418
+ self.emit(node, f" {i.gen.jac}")
1419
+ else:
1420
+ self.emit_ln(node, "")
1421
+ self.emit_ln(node, i.gen.jac)
1422
+ elif isinstance(i, ast.Semi):
1423
+ self.emit(node, f"{i.gen.jac}")
1424
+ elif isinstance(i, ast.Token) and i.value == ":":
1425
+ self.emit_ln(node, f"{i.gen.jac}")
1426
+ elif isinstance(i, ast.SubNodeList):
1427
+ self.indent_level += 1
1428
+ self.emit_ln(node, f"{i.gen.jac}")
1429
+ self.indent_level -= 1
1430
+ else:
1431
+ if start:
1432
+ self.emit(node, f"{i.gen.jac}")
1433
+ start = False
1434
+ else:
1435
+ self.emit(node, f" {i.gen.jac}")
1436
+ if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
1437
+ self.emit_ln(node, "")
1329
1438
 
1330
1439
  def exit_match_or(self, node: ast.MatchOr) -> None:
1331
1440
  """Sub objects.
1332
1441
 
1333
1442
  list[MatchPattern],
1334
1443
  """
1335
- self.emit(node, " | ".join([i.gen.jac for i in node.patterns]))
1444
+ start = True
1445
+ for i in node.kid:
1446
+ if isinstance(i, ast.CommentToken):
1447
+ if i.is_inline:
1448
+ self.emit(node, f" {i.gen.jac}")
1449
+ else:
1450
+ self.emit_ln(node, i.gen.jac)
1451
+ elif isinstance(i, ast.Semi):
1452
+ self.emit(node, f"{i.gen.jac}")
1453
+ else:
1454
+ if start:
1455
+ self.emit(node, f"{i.gen.jac}")
1456
+ start = False
1457
+ else:
1458
+ self.emit(node, f" {i.gen.jac}")
1459
+ if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
1460
+ self.emit_ln(node, "")
1336
1461
 
1337
1462
  def exit_match_as(self, node: ast.MatchAs) -> None:
1338
1463
  """Sub objects.
@@ -1340,21 +1465,69 @@ class JacFormatPass(Pass):
1340
1465
  name: NameType,
1341
1466
  pattern: MatchPattern,
1342
1467
  """
1343
- if node.pattern:
1344
- self.emit(node, f"{node.name.gen.jac} as {node.pattern.gen.jac}")
1345
- else:
1346
- self.emit(node, f"{node.name.gen.jac}")
1468
+ start = True
1469
+ for i in node.kid:
1470
+ if isinstance(i, ast.CommentToken):
1471
+ if i.is_inline:
1472
+ self.emit(node, f" {i.gen.jac}")
1473
+ else:
1474
+ self.emit_ln(node, "")
1475
+ self.emit_ln(node, i.gen.jac)
1476
+ elif isinstance(i, ast.Semi):
1477
+ self.emit(node, f"{i.gen.jac}")
1478
+ else:
1479
+ if start:
1480
+ self.emit(node, f"{i.gen.jac}")
1481
+ start = False
1482
+ else:
1483
+ self.emit(node, f" {i.gen.jac}")
1484
+ if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
1485
+ self.emit_ln(node, "")
1347
1486
 
1348
1487
  def exit_match_wild(self, node: ast.MatchWild) -> None:
1349
1488
  """Sub objects."""
1350
- self.emit(node, "_")
1489
+ start = True
1490
+ for i in node.kid:
1491
+ if isinstance(i, ast.CommentToken):
1492
+ if i.is_inline:
1493
+ self.emit(node, f" {i.gen.jac}")
1494
+ else:
1495
+ self.emit_ln(node, "")
1496
+ self.emit_ln(node, i.gen.jac)
1497
+ elif isinstance(i, ast.Semi):
1498
+ self.emit(node, f"{i.gen.jac}")
1499
+ else:
1500
+ if start:
1501
+ self.emit(node, f"{i.gen.jac}")
1502
+ start = False
1503
+ else:
1504
+ self.emit(node, f" {i.gen.jac}")
1505
+ if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
1506
+ self.emit_ln(node, "")
1351
1507
 
1352
1508
  def exit_match_value(self, node: ast.MatchValue) -> None:
1353
1509
  """Sub objects.
1354
1510
 
1355
1511
  value: ExprType,
1356
1512
  """
1357
- self.emit(node, node.value.gen.jac)
1513
+ start = True
1514
+ for i in node.kid:
1515
+ if isinstance(i, ast.CommentToken):
1516
+ if i.is_inline:
1517
+ self.emit(node, f" {i.gen.jac}")
1518
+ else:
1519
+ self.emit_ln(node, "")
1520
+ self.emit_ln(node, i.gen.jac)
1521
+ elif isinstance(i, ast.Semi):
1522
+ self.emit(node, f"{i.gen.jac}")
1523
+ else:
1524
+ if start:
1525
+ self.emit(node, f"{i.gen.jac}")
1526
+ start = False
1527
+ else:
1528
+ self.emit(node, f" {i.gen.jac}")
1529
+ if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
1530
+ self.emit_ln(node, "")
1358
1531
 
1359
1532
  def exit_match_singleton(self, node: ast.MatchSingleton) -> None:
1360
1533
  """Sub objects.
@@ -1368,14 +1541,44 @@ class JacFormatPass(Pass):
1368
1541
 
1369
1542
  values: list[MatchPattern],
1370
1543
  """
1371
- self.emit(node, f"[{', '.join([i.gen.jac for i in node.values])}]")
1544
+ for i in node.kid:
1545
+ if isinstance(i, ast.CommentToken):
1546
+ if i.is_inline:
1547
+ self.emit(node, f" {i.gen.jac}")
1548
+ else:
1549
+ self.emit_ln(node, "")
1550
+ self.emit_ln(node, i.gen.jac)
1551
+ elif isinstance(i, ast.Semi):
1552
+ self.emit(node, f"{i.gen.jac}")
1553
+ else:
1554
+ if i.gen.jac == ",":
1555
+ self.emit(node, f"{i.gen.jac} ")
1556
+ else:
1557
+ self.emit(node, f"{i.gen.jac}")
1558
+ if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
1559
+ self.emit_ln(node, "")
1372
1560
 
1373
1561
  def exit_match_mapping(self, node: ast.MatchMapping) -> None:
1374
1562
  """Sub objects.
1375
1563
 
1376
1564
  values: list[MatchKVPair | MatchStar],
1377
1565
  """
1378
- self.emit(node, f"{{{', '.join([i.gen.jac for i in node.values])}}}")
1566
+ for i in node.kid:
1567
+ if isinstance(i, ast.CommentToken):
1568
+ if i.is_inline:
1569
+ self.emit(node, f" {i.gen.jac}")
1570
+ else:
1571
+ self.emit_ln(node, "")
1572
+ self.emit_ln(node, i.gen.jac)
1573
+ elif isinstance(i, ast.Semi):
1574
+ self.emit(node, f"{i.gen.jac}")
1575
+ else:
1576
+ if i.gen.jac == ",":
1577
+ self.emit(node, f"{i.gen.jac} ")
1578
+ else:
1579
+ self.emit(node, f"{i.gen.jac}")
1580
+ if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
1581
+ self.emit_ln(node, "")
1379
1582
 
1380
1583
  def exit_match_k_v_pair(self, node: ast.MatchKVPair) -> None:
1381
1584
  """Sub objects.
@@ -1383,7 +1586,24 @@ class JacFormatPass(Pass):
1383
1586
  key: MatchPattern | NameType,
1384
1587
  value: MatchPattern,
1385
1588
  """
1386
- self.emit(node, f"{node.key.gen.jac}: {node.value.gen.jac}")
1589
+ start = True
1590
+ for i in node.kid:
1591
+ if isinstance(i, ast.CommentToken):
1592
+ if i.is_inline:
1593
+ self.emit(node, f" {i.gen.jac}")
1594
+ else:
1595
+ self.emit_ln(node, "")
1596
+ self.emit_ln(node, i.gen.jac)
1597
+ elif isinstance(i, ast.Semi):
1598
+ self.emit(node, f"{i.gen.jac}")
1599
+ else:
1600
+ if start:
1601
+ self.emit(node, f"{i.gen.jac}")
1602
+ start = False
1603
+ else:
1604
+ self.emit(node, f" {i.gen.jac}")
1605
+ if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
1606
+ self.emit_ln(node, "")
1387
1607
 
1388
1608
  def exit_match_star(self, node: ast.MatchStar) -> None:
1389
1609
  """Sub objects.
@@ -1400,16 +1620,22 @@ class JacFormatPass(Pass):
1400
1620
  arg_patterns: Optional[SubNodeList[MatchPattern]],
1401
1621
  kw_patterns: Optional[SubNodeList[MatchKVPair]],
1402
1622
  """
1403
- self.emit(node, node.name.gen.jac)
1404
- params = "("
1405
- if node.arg_patterns:
1406
- self.comma_sep_node_list(node.arg_patterns)
1407
- params += node.arg_patterns.gen.jac
1408
- if node.kw_patterns:
1409
- self.comma_sep_node_list(node.kw_patterns)
1410
- params += node.kw_patterns.gen.jac
1411
- params += ")"
1412
- self.emit(node, params)
1623
+ for i in node.kid:
1624
+ if isinstance(i, ast.CommentToken):
1625
+ if i.is_inline:
1626
+ self.emit(node, f" {i.gen.jac}")
1627
+ else:
1628
+ self.emit_ln(node, "")
1629
+ self.emit_ln(node, i.gen.jac)
1630
+ elif isinstance(i, ast.Semi):
1631
+ self.emit(node, f"{i.gen.jac}")
1632
+ else:
1633
+ if i.gen.jac == ",":
1634
+ self.emit(node, f"{i.gen.jac} ")
1635
+ else:
1636
+ self.emit(node, f"{i.gen.jac}")
1637
+ if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
1638
+ self.emit_ln(node, "")
1413
1639
 
1414
1640
  def exit_token(self, node: ast.Token) -> None:
1415
1641
  """Sub objects.
@@ -1517,4 +1743,5 @@ class JacFormatPass(Pass):
1517
1743
 
1518
1744
  def exit_comment_token(self, node: ast.CommentToken) -> None:
1519
1745
  """Sub objects."""
1746
+ # print(node.is_inline)
1520
1747
  self.emit(node, f"{node.value}")