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.
- jaclang/cli/__jac_gen__/cli.jbc +0 -0
- jaclang/cli/__jac_gen__/cli_impl.jbc +0 -0
- jaclang/cli/__jac_gen__/cmds.jbc +0 -0
- jaclang/cli/__jac_gen__/cmds_impl.jbc +0 -0
- jaclang/core/__jac_gen__/corelib.jbc +0 -0
- jaclang/jac/__jac_gen__/jac_parser.py +1 -1
- jaclang/jac/importer.py +1 -1
- jaclang/jac/passes/main/pyout_pass.py +1 -1
- jaclang/jac/passes/main/tests/test_jac_format_pass.py +10 -2
- jaclang/jac/passes/tool/jac_formatter_pass.py +283 -75
- jaclang/jac/plugin/feature.py +1 -2
- jaclang/jac/tests/fixtures/__jac_gen__/__init__.py +0 -0
- jaclang/jac/tests/fixtures/__jac_gen__/hello_world.jbc +0 -0
- jaclang/jac/tests/fixtures/__jac_gen__/hello_world.py +5 -0
- {jaclang-0.3.3.dist-info → jaclang-0.3.5.dist-info}/METADATA +1 -1
- {jaclang-0.3.3.dist-info → jaclang-0.3.5.dist-info}/RECORD +19 -11
- {jaclang-0.3.3.dist-info → jaclang-0.3.5.dist-info}/WHEEL +0 -0
- {jaclang-0.3.3.dist-info → jaclang-0.3.5.dist-info}/entry_points.txt +0 -0
- {jaclang-0.3.3.dist-info → jaclang-0.3.5.dist-info}/top_level.txt +0 -0
|
@@ -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"
|
|
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.
|
|
111
|
-
|
|
112
|
-
|
|
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.
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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.
|
|
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"
|
|
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
|
-
|
|
301
|
-
|
|
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],
|
|
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
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
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"
|
|
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],
|
|
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
|
|
426
|
-
|
|
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.
|
|
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
|
-
|
|
441
|
-
|
|
442
|
-
|
|
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
|
-
|
|
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],
|
|
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.
|
|
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(
|
|
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
|
-
|
|
590
|
-
|
|
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(
|
|
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(
|
|
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,
|
|
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(
|
|
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
|
-
|
|
780
|
-
|
|
781
|
-
|
|
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
|
-
|
|
829
|
-
|
|
830
|
-
|
|
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"
|
|
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.
|
|
1043
|
+
self.emit(node, f"{i.gen.jac} ")
|
|
849
1044
|
else:
|
|
850
1045
|
self.emit(node, i.gen.jac)
|
|
851
|
-
if isinstance(
|
|
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"
|
|
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
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
1368
|
-
|
|
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}")
|