jaclang 0.3.3__py3-none-any.whl → 0.3.5__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.

@@ -16,6 +16,7 @@ class JacFormatPass(Pass):
16
16
  self.comments: list[ast.CommentToken] = []
17
17
  self.indent_size = 4
18
18
  self.indent_level = 0
19
+ self.MAX_LINE_LENGTH = 44
19
20
 
20
21
  def indent_str(self) -> str:
21
22
  """Return string for indent."""
@@ -65,6 +66,17 @@ class JacFormatPass(Pass):
65
66
  """
66
67
  self.comments = node.source.comments
67
68
 
69
+ def process_import_nodes(self, node: ast.Module) -> None:
70
+ """Process and rearrange import nodes."""
71
+ import_nodes = node.get_all_sub_nodes(typ=ast.Import)
72
+
73
+ # Separate include:jac and other imports
74
+ includes = [n for n in import_nodes if ":jac" in n.gen.jac]
75
+ other_imports = [n for n in import_nodes if ":jac" not in n.gen.jac]
76
+
77
+ # Rearrange imports with includes at the end
78
+ return other_imports + includes
79
+
68
80
  def exit_module(self, node: ast.Module) -> None:
69
81
  """Sub objects.
70
82
 
@@ -74,20 +86,36 @@ class JacFormatPass(Pass):
74
86
  body: Sequence[ElementStmt],
75
87
  is_imported: bool,
76
88
  """
89
+ segment = False
77
90
  for i in node.kid:
78
91
  if isinstance(i, ast.String):
79
92
  self.emit_ln(node, f" {i.gen.jac}")
93
+ self.emit_ln(node, "")
80
94
  elif isinstance(i, ast.CommentToken):
81
95
  if i.is_inline:
82
96
  self.emit(node, f" {i.gen.jac}")
83
97
  else:
98
+ self.emit_ln(node, "")
84
99
  self.emit_ln(node, i.gen.jac)
85
100
  elif isinstance(i, ast.Token):
86
101
  self.emit(node, i.value.strip("") + " ")
87
102
  elif isinstance(i, ast.SubTag):
88
103
  for j in i.kid:
89
104
  self.emit(node, j.gen.jac)
105
+ # Process sorted imports
106
+ sorted_imports = self.process_import_nodes(node)
107
+ if sorted_imports:
108
+ for imp in sorted_imports:
109
+ # Add a newline between other imports and includes
110
+ if ":jac" in imp.gen.jac and not segment:
111
+ self.emit_ln(node, "")
112
+ segment = True
113
+ self.emit_ln(node, imp.gen.jac)
114
+ self.emit_ln(node, "")
115
+ self.emit_ln(node, "")
90
116
  for i in node.body:
117
+ if isinstance(i, ast.Import):
118
+ continue
91
119
  self.emit_ln(node, i.gen.jac)
92
120
  self.emit_ln(node, "")
93
121
 
@@ -99,22 +127,27 @@ class JacFormatPass(Pass):
99
127
  is_frozen: bool,
100
128
  doc: Optional[String] = None,
101
129
  """
130
+ start = True
102
131
  for i in node.kid:
103
132
  if isinstance(i, ast.String):
104
- self.emit_ln(node, f" {i.gen.jac}")
133
+ self.emit_ln(node, f"{i.gen.jac}")
105
134
  elif isinstance(i, ast.CommentToken):
106
135
  if i.is_inline:
107
136
  self.emit(node, f" {i.gen.jac}")
108
137
  else:
109
138
  self.emit_ln(node, i.gen.jac)
110
- elif isinstance(i, ast.Token):
111
- if i.name == "SEMI":
112
- self.emit_ln(node, i.value + " ")
139
+ elif isinstance(i, ast.Semi):
140
+ self.emit(node, f"{i.gen.jac} ")
141
+ else:
142
+ if start:
143
+ self.emit(node, f"{i.gen.jac}")
144
+ start = False
113
145
  else:
114
- self.emit(node, i.value + " ")
115
- elif isinstance(i, ast.SubNodeList):
116
- self.emit(node, node.assignments.gen.jac)
117
- self.emit_ln(node, "")
146
+ self.emit(node, f" {i.gen.jac}")
147
+ if isinstance(
148
+ node.kid[-1], (ast.Semi, ast.CommentToken)
149
+ ) and not node.gen.jac.endswith("\n"):
150
+ self.emit_ln(node, "")
118
151
 
119
152
  def exit_module_code(self, node: ast.ModuleCode) -> None:
120
153
  """Sub objects.
@@ -146,7 +179,11 @@ class JacFormatPass(Pass):
146
179
  self.emit_ln(node, f"{stmt.gen.jac}")
147
180
  self.indent_level += 1
148
181
  continue
149
- if isinstance(stmt, ast.Token):
182
+ if prev_token and prev_token.gen.jac.endswith("}"):
183
+ self.emit_ln(node, "")
184
+ if isinstance(stmt, ast.Import):
185
+ continue
186
+ elif isinstance(stmt, ast.Token):
150
187
  if stmt.name == "LBRACE":
151
188
  if (
152
189
  isinstance(node.kid[i + 1], ast.CommentToken)
@@ -160,7 +197,6 @@ class JacFormatPass(Pass):
160
197
  self.indent_level -= 1
161
198
  if isinstance(stmt.parent.parent, (ast.ElseIf, ast.IfStmt)):
162
199
  self.emit(node, f"{stmt.value}")
163
-
164
200
  else:
165
201
  if i < (len(node.kid) - 1) and (
166
202
  isinstance(node.kid[i + 1], ast.CommentToken)
@@ -185,12 +221,15 @@ class JacFormatPass(Pass):
185
221
  else:
186
222
  self.emit(node, f"{stmt.gen.jac}")
187
223
  else:
188
- self.emit_ln(node, "")
224
+ if not node.gen.jac.endswith("\n"):
225
+ self.emit_ln(node, "")
189
226
  self.emit_ln(node, stmt.gen.jac)
227
+ elif stmt.value == "=":
228
+ self.emit(node, f" {stmt.value} ")
190
229
  else:
191
230
  self.emit(node, f"{stmt.value}")
192
231
  continue
193
- elif isinstance(stmt, (ast.Assignment, ast.Semi)):
232
+ elif isinstance(stmt, ast.Semi):
194
233
  self.emit(node, f"{stmt.gen.jac} ")
195
234
  else:
196
235
  self.emit(node, f"{stmt.gen.jac}")
@@ -201,8 +240,26 @@ class JacFormatPass(Pass):
201
240
 
202
241
  tag: T,
203
242
  """
243
+ start = True
204
244
  for i in node.kid:
205
- self.emit(node, i.gen.jac)
245
+ if isinstance(i, ast.CommentToken):
246
+ if i.is_inline:
247
+ self.emit(node, f" {i.gen.jac}")
248
+ elif not node.gen.jac.endswith("\n"):
249
+ self.emit_ln(node, "")
250
+ self.emit_ln(node, i.gen.jac)
251
+ else:
252
+ self.emit_ln(node, i.gen.jac)
253
+ elif isinstance(i, ast.Semi) or i.gen.jac == ",":
254
+ self.emit(node, f"{i.gen.jac} ")
255
+ else:
256
+ if start:
257
+ self.emit(node, f"{i.gen.jac}")
258
+ start = False
259
+ else:
260
+ self.emit(node, f" {i.gen.jac}")
261
+ if isinstance(node.kid[-1], ast.Semi) and not node.gen.jac.endswith("\n"):
262
+ self.emit_ln(node, "")
206
263
 
207
264
  def exit_func_call(self, node: ast.FuncCall) -> None:
208
265
  """Sub objects.
@@ -290,15 +347,35 @@ class JacFormatPass(Pass):
290
347
  doc: Optional[Constant] = None,
291
348
  decorators: Optional[SubNodeList[ExprType]] = None,
292
349
  """
350
+ start = True
351
+ prev_token = None
293
352
  for i in node.kid:
294
- if isinstance(i, ast.CommentToken):
353
+ if isinstance(i, ast.String):
354
+ self.emit_ln(node, f"{i.gen.jac}")
355
+ elif isinstance(i, ast.CommentToken):
295
356
  if i.is_inline:
296
- self.emit(node, f" {i.gen.jac}")
357
+ self.emit(node, f"{i.gen.jac}")
358
+ if isinstance(prev_token, ast.Semi):
359
+ self.emit_ln(node, "")
360
+ elif not node.gen.jac.endswith("\n"):
361
+ self.emit_ln(node, "")
362
+ self.emit_ln(node, i.gen.jac)
297
363
  else:
298
364
  self.emit_ln(node, i.gen.jac)
365
+ elif isinstance(i, ast.Semi):
366
+ self.emit(node, f"{i.gen.jac} ")
367
+ elif isinstance(i, ast.SubNodeList) and i.gen.jac.startswith("@"):
368
+ self.emit_ln(node, i.gen.jac)
299
369
  else:
300
- self.emit(node, i.gen.jac)
301
- if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
370
+ if start:
371
+ self.emit(node, f"{i.gen.jac}")
372
+ start = False
373
+ elif i.gen.jac.startswith(" "):
374
+ self.emit(node, f"{i.gen.jac}")
375
+ else:
376
+ self.emit(node, f" {i.gen.jac}")
377
+ prev_token = i
378
+ if isinstance(node.kid[-1], ast.Semi) and not node.gen.jac.endswith("\n"):
302
379
  self.emit_ln(node, "")
303
380
 
304
381
  def exit_event_signature(self, node: ast.EventSignature) -> None:
@@ -352,14 +429,12 @@ class JacFormatPass(Pass):
352
429
  elif i.gen.jac.startswith(":"):
353
430
  self.emit(node, f"{i.gen.jac}")
354
431
  else:
355
- if start:
432
+ if start or i.gen.jac == ",":
356
433
  self.emit(node, f"{i.gen.jac}")
357
434
  start = False
358
- elif i.gen.jac == ",":
359
- self.emit(node, f"{i.gen.jac} ")
360
435
  else:
361
436
  self.emit(node, f" {i.gen.jac}")
362
- if isinstance(node.kid[-1], (ast.Semi)) and not node.gen.jac.endswith("\n"):
437
+ if isinstance(node.kid[-1], ast.Semi) and not node.gen.jac.endswith("\n"):
363
438
  self.emit_ln(node, "")
364
439
 
365
440
  def exit_arch_def(self, node: ast.ArchDef) -> None:
@@ -370,10 +445,26 @@ class JacFormatPass(Pass):
370
445
  doc: Optional[Constant] = None,
371
446
  decorators: Optional[SubNodeList[ExprType]] = None,
372
447
  """
373
- doc = node.doc.value if node.doc else ""
374
- target = f"{node.target.gen.jac} "
375
- self.emit(node, f"{doc}\n{target}")
376
- self.emit(node, node.body.gen.jac)
448
+ start = True
449
+ for i in node.kid:
450
+ if isinstance(i, ast.CommentToken):
451
+ if i.is_inline:
452
+ self.emit(node, f" {i.gen.jac}")
453
+ elif not node.gen.jac.endswith("\n"):
454
+ self.emit_ln(node, "")
455
+ self.emit_ln(node, i.gen.jac)
456
+ else:
457
+ self.emit_ln(node, i.gen.jac)
458
+ elif isinstance(i, ast.Semi):
459
+ self.emit(node, f"{i.gen.jac} ")
460
+ else:
461
+ if start or i.gen.jac == "," or i.gen.jac.startswith(":"):
462
+ self.emit(node, f"{i.gen.jac}")
463
+ start = False
464
+ else:
465
+ self.emit(node, f" {i.gen.jac}")
466
+ if isinstance(node.kid[-1], ast.Semi) and not node.gen.jac.endswith("\n"):
467
+ self.emit_ln(node, "")
377
468
 
378
469
  def exit_ability(self, node: ast.Ability) -> None:
379
470
  """Sub objects.
@@ -393,13 +484,18 @@ class JacFormatPass(Pass):
393
484
  start = True
394
485
  prev_token = None
395
486
  for i in node.kid:
487
+ if not i.gen.jac:
488
+ continue
396
489
  if isinstance(i, ast.String):
397
490
  self.emit_ln(node, f"{i.gen.jac}")
398
491
  elif isinstance(i, ast.CommentToken):
399
492
  if i.is_inline:
400
- self.emit(node, f" {i.gen.jac}")
493
+ self.emit(node, f"{i.gen.jac}")
401
494
  if isinstance(prev_token, ast.Semi):
402
495
  self.emit_ln(node, "")
496
+ elif not node.gen.jac.endswith("\n"):
497
+ self.emit_ln(node, "")
498
+ self.emit_ln(node, i.gen.jac)
403
499
  else:
404
500
  self.emit_ln(node, i.gen.jac)
405
501
  elif isinstance(i, ast.Semi):
@@ -410,10 +506,12 @@ class JacFormatPass(Pass):
410
506
  if start:
411
507
  self.emit(node, f"{i.gen.jac}")
412
508
  start = False
509
+ elif i.gen.jac.startswith(" "):
510
+ self.emit(node, f"{i.gen.jac}")
413
511
  else:
414
512
  self.emit(node, f" {i.gen.jac}")
415
513
  prev_token = i
416
- if isinstance(node.kid[-1], (ast.Semi)):
514
+ if isinstance(node.kid[-1], ast.Semi) and not node.gen.jac.endswith("\n"):
417
515
  self.emit_ln(node, "")
418
516
 
419
517
  def exit_func_signature(self, node: ast.FuncSignature) -> None:
@@ -422,8 +520,18 @@ class JacFormatPass(Pass):
422
520
  params: Optional[SubNodeList[ParamVar]],
423
521
  return_type: Optional[SubNodeList[TypeSpec]],
424
522
  """
425
- for kid in node.kid:
426
- self.emit(node, f"{kid.gen.jac}")
523
+ for i in node.kid:
524
+ if isinstance(i, ast.SubTag):
525
+ for j in i.kid:
526
+ self.emit(node, f" {j.gen.jac}")
527
+ elif isinstance(i, ast.SubNodeList):
528
+ for j in i.kid:
529
+ if j.gen.jac == ",":
530
+ self.emit(node, f"{j.gen.jac.strip()} ")
531
+ else:
532
+ self.emit(node, f"{j.gen.jac.strip()}")
533
+ else:
534
+ self.emit(node, f"{i.gen.jac}")
427
535
 
428
536
  def exit_arch_has(self, node: ast.ArchHas) -> None:
429
537
  """Sub objects.
@@ -434,15 +542,41 @@ class JacFormatPass(Pass):
434
542
  vars: "HasVarList",
435
543
  is_frozen: bool,
436
544
  """
545
+ indented = False
546
+ indent_val = 1
437
547
  for i in node.kid:
438
- if isinstance(i, ast.SubTag):
548
+ if isinstance(i, ast.CommentToken):
549
+ if i.is_inline:
550
+ self.emit(node, f" {i.gen.jac}")
551
+ elif not node.gen.jac.endswith("\n"):
552
+ self.emit_ln(node, "")
553
+ self.emit_ln(node, i.gen.jac)
554
+ else:
555
+ self.emit_ln(node, i.gen.jac)
556
+ elif isinstance(i, ast.Semi):
557
+ self.emit(node, f"{i.gen.jac.strip()} ")
558
+ elif isinstance(i, ast.SubNodeList):
439
559
  for j in i.kid:
440
- self.emit(node, j.gen.jac)
441
- elif isinstance(i, ast.CommentToken):
442
- self.emit(node, f" {i.gen.jac}")
560
+ if j.gen.jac == ",":
561
+ if not indented:
562
+ self.emit_ln(node, j.gen.jac.strip())
563
+ self.indent_level += indent_val
564
+ indented = True
565
+ else:
566
+ self.indent_level -= indent_val
567
+ self.emit_ln(node, j.gen.jac.strip())
568
+ self.indent_level += indent_val
569
+ indented = True
570
+ else:
571
+ self.emit(node, f"{j.gen.jac.strip()}")
572
+ if indented:
573
+ self.indent_level -= indent_val
443
574
  else:
444
- self.emit(node, i.gen.jac)
445
- self.emit_ln(node, "")
575
+ self.emit(node, f"{i.gen.jac} ")
576
+ if i.gen.jac == "static":
577
+ indent_val = indent_val * 3
578
+ if isinstance(node.kid[-1], ast.Semi) and not node.gen.jac.endswith("\n"):
579
+ self.emit_ln(node, "")
446
580
 
447
581
  def exit_arch_ref(self, node: ast.ArchRef) -> None:
448
582
  """Sub objects.
@@ -453,11 +587,16 @@ class JacFormatPass(Pass):
453
587
  if isinstance(i, ast.CommentToken):
454
588
  if i.is_inline:
455
589
  self.emit(node, f" {i.gen.jac}")
590
+ elif not node.gen.jac.endswith("\n"):
591
+ self.emit_ln(node, "")
592
+ self.emit_ln(node, i.gen.jac)
456
593
  else:
457
594
  self.emit_ln(node, i.gen.jac)
595
+ elif isinstance(i, ast.Semi) or i.gen.jac == ",":
596
+ self.emit(node, f"{i.gen.jac} ")
458
597
  else:
459
- self.emit(node, i.gen.jac)
460
- if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
598
+ self.emit(node, f"{i.gen.jac}")
599
+ if isinstance(node.kid[-1], ast.Semi) and not node.gen.jac.endswith("\n"):
461
600
  self.emit_ln(node, "")
462
601
 
463
602
  def exit_param_var(self, node: ast.ParamVar) -> None:
@@ -484,7 +623,7 @@ class JacFormatPass(Pass):
484
623
  start = True
485
624
  for i in node.kid:
486
625
  if isinstance(i, ast.String):
487
- self.emit(node, f"{i.gen.jac}")
626
+ self.emit_ln(node, f"{i.gen.jac}")
488
627
  elif isinstance(i, ast.CommentToken):
489
628
  if i.is_inline:
490
629
  self.emit(node, f" {i.gen.jac}")
@@ -500,7 +639,9 @@ class JacFormatPass(Pass):
500
639
  start = False
501
640
  else:
502
641
  self.emit(node, f" {i.gen.jac}")
503
- if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
642
+ if isinstance(
643
+ node.kid[-1], (ast.Semi, ast.CommentToken)
644
+ ) and not node.gen.jac.endswith("\n"):
504
645
  self.emit_ln(node, "")
505
646
 
506
647
  def exit_enum_def(self, node: ast.EnumDef) -> None:
@@ -524,7 +665,7 @@ class JacFormatPass(Pass):
524
665
  null_ok: bool,
525
666
  """
526
667
  for i in node.kid:
527
- self.emit(node, i.gen.jac)
668
+ self.emit(node, f"{i.gen.jac}")
528
669
 
529
670
  def exit_atom_unit(self, node: ast.AtomUnit) -> None:
530
671
  """Sub objects.
@@ -533,7 +674,7 @@ class JacFormatPass(Pass):
533
674
  is_paren: bool,
534
675
  is_null_ok: bool,
535
676
  """
536
- self.emit(node, f"({node.value.gen.jac})")
677
+ self.emit(node, f"( {node.value.gen.jac} )")
537
678
 
538
679
  def exit_yield_expr(self, node: ast.YieldExpr) -> None:
539
680
  """Sub objects.
@@ -549,6 +690,10 @@ class JacFormatPass(Pass):
549
690
  if isinstance(node.kid[-1], ast.Token) and node.kid[-1].name == "SEMI":
550
691
  self.emit_ln(node, node.kid[-1].value + " ")
551
692
 
693
+ def is_line_break_needed(self, content: str) -> bool:
694
+ """Check if the length of the current generated code exceeds the max line length."""
695
+ return len(content) > self.MAX_LINE_LENGTH
696
+
552
697
  def exit_binary_expr(self, node: ast.BinaryExpr) -> None:
553
698
  """Sub objects.
554
699
 
@@ -586,10 +731,20 @@ class JacFormatPass(Pass):
586
731
  and isinstance(node.right, ast.TupleVal)
587
732
  )
588
733
  ):
589
- self.emit(
590
- node,
591
- f"{node.left.gen.jac} {node.op.value} {node.right.gen.jac}",
592
- )
734
+ # Check if line break is needed
735
+ if node.op.value in ["and", "or"] and self.is_line_break_needed(
736
+ f"{node.left.gen.jac} {node.op.value} {node.right.gen.jac}"
737
+ ):
738
+ self.emit_ln(node, f"{node.left.gen.jac}")
739
+ self.emit(
740
+ node,
741
+ f" {node.op.value} {node.right.gen.jac}",
742
+ )
743
+ else:
744
+ self.emit(
745
+ node,
746
+ f"{node.left.gen.jac} {node.op.value} {node.right.gen.jac}",
747
+ )
593
748
  elif node.op.name == Tok.ELVIS_OP:
594
749
  self.emit(
595
750
  node,
@@ -601,7 +756,9 @@ class JacFormatPass(Pass):
601
756
  self.error(
602
757
  f"Binary operator {node.op.value} not supported in bootstrap Jac"
603
758
  )
604
- if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
759
+ if isinstance(
760
+ node.kid[-1], (ast.Semi, ast.CommentToken)
761
+ ) and not node.gen.jac.endswith("\n"):
605
762
  self.emit_ln(node, node.kid[-1].value)
606
763
 
607
764
  def exit_has_var(self, node: ast.HasVar) -> None:
@@ -641,7 +798,9 @@ class JacFormatPass(Pass):
641
798
  start = False
642
799
  else:
643
800
  self.emit(node, f" {i.gen.jac}")
644
- if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
801
+ if isinstance(
802
+ node.kid[-1], (ast.Semi, ast.CommentToken)
803
+ ) and not node.gen.jac.endswith("\n"):
645
804
  self.emit_ln(node, "")
646
805
 
647
806
  def exit_else_if(self, node: ast.ElseIf) -> None:
@@ -704,7 +863,8 @@ class JacFormatPass(Pass):
704
863
  self.emit(node, f" {i.gen.jac}")
705
864
  else:
706
865
  self.emit_ln(node, "")
707
- self.emit_ln(node, i.gen.jac)
866
+ self.emit_ln(node, "")
867
+ self.emit(node, i.gen.jac)
708
868
  elif isinstance(i, ast.Semi):
709
869
  self.emit(node, f"{i.gen.jac}")
710
870
  else:
@@ -713,7 +873,9 @@ class JacFormatPass(Pass):
713
873
  start = False
714
874
  else:
715
875
  self.emit(node, f" {i.gen.jac}")
716
- if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
876
+ if isinstance(
877
+ node.kid[-1], (ast.Semi, ast.CommentToken)
878
+ ): # and not node.gen.jac.endswith("\n"):
717
879
  self.emit_ln(node, "")
718
880
 
719
881
  def exit_iter_for_stmt(self, node: ast.IterForStmt) -> None:
@@ -776,9 +938,28 @@ class JacFormatPass(Pass):
776
938
  condition: ExprType,
777
939
  body: CodeBlock,
778
940
  """
779
- self.emit(node, f"while {node.condition.gen.jac}")
780
-
781
- self.emit(node, node.body.gen.jac)
941
+ start = True
942
+ for i in node.kid:
943
+ if isinstance(i, ast.CommentToken):
944
+ if i.is_inline:
945
+ self.emit(node, f" {i.gen.jac}")
946
+ else:
947
+ if not node.gen.jac.endswith("\n"):
948
+ self.emit_ln(node, "")
949
+ self.emit_ln(node, "")
950
+ self.emit(node, i.gen.jac)
951
+ elif isinstance(i, ast.Semi):
952
+ self.emit(node, f"{i.gen.jac}")
953
+ else:
954
+ if start:
955
+ self.emit(node, f"{i.gen.jac}")
956
+ start = False
957
+ else:
958
+ self.emit(node, f" {i.gen.jac}")
959
+ if isinstance(
960
+ node.kid[-1], (ast.Semi, ast.CommentToken)
961
+ ) and not node.gen.jac.endswith("\n"):
962
+ self.emit_ln(node, "")
782
963
 
783
964
  def exit_with_stmt(self, node: ast.WithStmt) -> None:
784
965
  """Sub objects.
@@ -813,10 +994,11 @@ class JacFormatPass(Pass):
813
994
  self.emit(node, f" {i.gen.jac}")
814
995
  else:
815
996
  self.emit_ln(node, i.gen.jac)
997
+ self.emit_ln(node, "")
816
998
  elif isinstance(i, ast.Semi):
817
999
  self.emit_ln(node, i.gen.jac)
818
1000
  else:
819
- self.emit(node, i.gen.jac)
1001
+ self.emit(node, f"{i.gen.jac} ")
820
1002
  if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
821
1003
  self.emit_ln(node, "")
822
1004
 
@@ -825,9 +1007,19 @@ class JacFormatPass(Pass):
825
1007
 
826
1008
  target: SubNodeList[NameType],
827
1009
  """
828
- self.emit(node, ":nl:")
829
- self.comma_sep_node_list(node.target)
830
- self.emit_ln(node, f"{node.target.gen.jac}")
1010
+ for i in node.kid:
1011
+ if isinstance(i, ast.CommentToken):
1012
+ if i.is_inline:
1013
+ self.emit(node, f" {i.gen.jac}")
1014
+ else:
1015
+ self.emit_ln(node, i.gen.jac)
1016
+ self.emit_ln(node, "")
1017
+ elif isinstance(i, ast.Semi):
1018
+ self.emit_ln(node, i.gen.jac)
1019
+ else:
1020
+ self.emit(node, f"{i.gen.jac} ")
1021
+ if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
1022
+ self.emit_ln(node, "")
831
1023
 
832
1024
  def exit_assignment(self, node: ast.Assignment) -> None:
833
1025
  """Sub objects.
@@ -841,14 +1033,19 @@ class JacFormatPass(Pass):
841
1033
  for i in node.kid:
842
1034
  if isinstance(i, ast.CommentToken):
843
1035
  if i.is_inline:
844
- self.emit(node, f" {i.gen.jac}")
1036
+ self.emit(node, f"{i.gen.jac}")
845
1037
  else:
1038
+ self.emit_ln(node, "")
1039
+ self.emit_ln(node, "")
846
1040
  self.emit_ln(node, i.gen.jac)
1041
+ # self.emit_ln(node, "")
847
1042
  elif isinstance(i, ast.Semi):
848
- self.emit_ln(node, i.gen.jac)
1043
+ self.emit(node, f"{i.gen.jac} ")
849
1044
  else:
850
1045
  self.emit(node, i.gen.jac)
851
- if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
1046
+ if isinstance(
1047
+ node.kid[-1], (ast.Semi, ast.CommentToken)
1048
+ ) and not node.gen.jac.endswith("\n"):
852
1049
  self.emit_ln(node, "")
853
1050
 
854
1051
  def exit_architype(self, node: ast.Architype) -> None:
@@ -863,25 +1060,32 @@ class JacFormatPass(Pass):
863
1060
  decorators: Optional[SubNodeList[ExprType]] = None,
864
1061
  """
865
1062
  start = True
1063
+ prev_token = None
866
1064
  for i in node.kid:
867
1065
  if isinstance(i, ast.String):
868
1066
  self.emit_ln(node, f"{i.gen.jac}")
869
1067
  elif isinstance(i, ast.CommentToken):
870
1068
  if i.is_inline:
871
- self.emit(node, f" {i.gen.jac}")
1069
+ self.emit(node, f"{i.gen.jac}")
1070
+ if isinstance(prev_token, ast.Semi):
1071
+ self.emit_ln(node, "")
872
1072
  else:
873
1073
  self.emit_ln(node, i.gen.jac)
874
1074
  elif isinstance(i, ast.Semi):
1075
+ self.emit(node, node.gen.jac.rstrip())
875
1076
  self.emit(node, f"{i.gen.jac} ")
876
1077
  elif isinstance(i, ast.SubNodeList) and i.gen.jac.startswith("@"):
877
1078
  self.emit_ln(node, i.gen.jac)
878
1079
  else:
879
- if start or i.gen.jac.startswith(":"):
1080
+ if start:
880
1081
  self.emit(node, f"{i.gen.jac}")
881
1082
  start = False
1083
+ elif i.gen.jac.startswith(" "):
1084
+ self.emit(node, f"{i.gen.jac}")
882
1085
  else:
883
1086
  self.emit(node, f" {i.gen.jac}")
884
- if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
1087
+ prev_token = i
1088
+ if isinstance(node.kid[-1], ast.Semi) and not node.gen.jac.endswith("\n"):
885
1089
  self.emit_ln(node, "")
886
1090
 
887
1091
  def exit_f_string(self, node: ast.FString) -> None:
@@ -1210,7 +1414,9 @@ class JacFormatPass(Pass):
1210
1414
  if i.is_inline:
1211
1415
  self.emit(node, f" {i.gen.jac}")
1212
1416
  else:
1213
- self.emit_ln(node, i.gen.jac)
1417
+ self.emit_ln(node, "")
1418
+ self.emit_ln(node, "")
1419
+ self.emit(node, i.gen.jac)
1214
1420
  elif isinstance(i, ast.Semi):
1215
1421
  self.emit(node, f"{i.gen.jac}")
1216
1422
  else:
@@ -1233,7 +1439,9 @@ class JacFormatPass(Pass):
1233
1439
  if i.is_inline:
1234
1440
  self.emit(node, f" {i.gen.jac}")
1235
1441
  else:
1236
- self.emit_ln(node, i.gen.jac)
1442
+ self.emit_ln(node, "")
1443
+ self.emit_ln(node, "")
1444
+ self.emit(node, i.gen.jac)
1237
1445
  elif isinstance(i, ast.Semi):
1238
1446
  self.emit(node, f"{i.gen.jac}")
1239
1447
  else:
@@ -1256,7 +1464,10 @@ class JacFormatPass(Pass):
1256
1464
  if i.is_inline:
1257
1465
  self.emit(node, f" {i.gen.jac}")
1258
1466
  else:
1259
- self.emit_ln(node, i.gen.jac)
1467
+ if not node.gen.jac.endswith("\n"):
1468
+ self.emit_ln(node, "")
1469
+ self.emit_ln(node, "")
1470
+ self.emit(node, i.gen.jac)
1260
1471
  elif isinstance(i, ast.Semi):
1261
1472
  self.emit(node, f"{i.gen.jac}")
1262
1473
  else:
@@ -1354,22 +1565,20 @@ class JacFormatPass(Pass):
1354
1565
 
1355
1566
  archs: list[ArchRef],
1356
1567
  """
1357
- start = True
1358
1568
  for i in node.kid:
1359
1569
  if isinstance(i, ast.CommentToken):
1360
1570
  if i.is_inline:
1361
1571
  self.emit(node, f" {i.gen.jac}")
1572
+ elif not node.gen.jac.endswith("\n"):
1573
+ self.emit_ln(node, "")
1574
+ self.emit_ln(node, i.gen.jac)
1362
1575
  else:
1363
1576
  self.emit_ln(node, i.gen.jac)
1364
- elif isinstance(i, ast.Semi):
1365
- self.emit(node, f"{i.gen.jac}")
1577
+ elif isinstance(i, ast.Semi) or i.gen.jac == ",":
1578
+ self.emit(node, f"{i.gen.jac} ")
1366
1579
  else:
1367
- if start:
1368
- self.emit(node, f"{i.gen.jac}")
1369
- start = False
1370
- else:
1371
- self.emit(node, f" {i.gen.jac}")
1372
- if isinstance(node.kid[-1], (ast.Semi, ast.CommentToken)):
1580
+ self.emit(node, f"{i.gen.jac}")
1581
+ if isinstance(node.kid[-1], ast.Semi) and not node.gen.jac.endswith("\n"):
1373
1582
  self.emit_ln(node, "")
1374
1583
 
1375
1584
  def exit_typed_ctx_block(self, node: ast.TypedCtxBlock) -> None:
@@ -1743,5 +1952,4 @@ class JacFormatPass(Pass):
1743
1952
 
1744
1953
  def exit_comment_token(self, node: ast.CommentToken) -> None:
1745
1954
  """Sub objects."""
1746
- # print(node.is_inline)
1747
1955
  self.emit(node, f"{node.value}")