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

@@ -17,6 +17,7 @@ from jaclang.compiler.symtable import (
17
17
  SymbolTable,
18
18
  SymbolType,
19
19
  )
20
+ from jaclang.core.registry import SemRegistry
20
21
  from jaclang.utils.treeprinter import dotgen_ast_tree, print_ast_tree
21
22
 
22
23
 
@@ -109,6 +110,12 @@ class AstNode:
109
110
 
110
111
  return Pass.get_all_sub_nodes(node=self, typ=typ, brute_force=brute_force)
111
112
 
113
+ def has_parent_of_type(self, typ: Type[T]) -> Optional[T]:
114
+ """Get parent of type."""
115
+ from jaclang.compiler.passes import Pass
116
+
117
+ return Pass.has_parent_of_type(node=self, typ=typ)
118
+
112
119
  def format(self) -> str:
113
120
  """Get all sub nodes of type."""
114
121
  from jaclang.compiler.passes.tool import JacFormatPass
@@ -320,7 +327,7 @@ class SubTag(AstNode, Generic[T]):
320
327
  def normalize(self, deep: bool = False) -> bool:
321
328
  """Normalize sub tag node."""
322
329
  res = self.tag.normalize() if deep else True
323
- AstNode.__init__(self, kid=[self.gen_token(Tok.COLON), self.tag])
330
+ AstNode.set_kids(self, nodes=[self.gen_token(Tok.COLON), self.tag])
324
331
  return res
325
332
 
326
333
 
@@ -363,7 +370,7 @@ class SubNodeList(AstNode, Generic[T]):
363
370
  new_kid.pop()
364
371
  if self.right_enc:
365
372
  new_kid.append(self.right_enc)
366
- AstNode.__init__(self, kid=new_kid if len(new_kid) else [EmptyToken()])
373
+ AstNode.set_kids(self, nodes=new_kid if len(new_kid) else [EmptyToken()])
367
374
  return res
368
375
 
369
376
 
@@ -382,6 +389,7 @@ class Module(AstDocNode):
382
389
  kid: Sequence[AstNode],
383
390
  impl_mod: Optional[Module] = None,
384
391
  test_mod: Optional[Module] = None,
392
+ registry: Optional[SemRegistry] = None,
385
393
  ) -> None:
386
394
  """Initialize whole program node."""
387
395
  self.name = name
@@ -391,6 +399,7 @@ class Module(AstDocNode):
391
399
  self.impl_mod = impl_mod
392
400
  self.test_mod = test_mod
393
401
  self.mod_deps: dict[str, Module] = {}
402
+ self.registry = registry
394
403
  AstNode.__init__(self, kid=kid)
395
404
  AstDocNode.__init__(self, doc=doc)
396
405
 
@@ -405,7 +414,7 @@ class Module(AstDocNode):
405
414
  if self.doc:
406
415
  new_kid.append(self.doc)
407
416
  new_kid.extend(self.body)
408
- AstNode.__init__(self, kid=new_kid)
417
+ AstNode.set_kids(self, nodes=new_kid)
409
418
  return res
410
419
 
411
420
  def unparse(self) -> str:
@@ -440,17 +449,16 @@ class GlobalVars(ElementStmt, AstAccessNode):
440
449
  res = res and self.assignments.normalize(deep)
441
450
  res = res and self.doc.normalize(deep) if self.doc else res
442
451
  new_kid: list[AstNode] = []
452
+ if self.doc:
453
+ new_kid.append(self.doc)
443
454
  if self.is_frozen:
444
455
  new_kid.append(self.gen_token(Tok.KW_LET))
445
456
  else:
446
457
  new_kid.append(self.gen_token(Tok.KW_GLOBAL))
447
- if self.doc:
448
- new_kid.append(self.doc)
449
458
  if self.access:
450
459
  new_kid.append(self.access)
451
460
  new_kid.append(self.assignments)
452
- new_kid.append(self.gen_token(Tok.SEMI))
453
- AstNode.__init__(self, kid=new_kid)
461
+ AstNode.set_kids(self, nodes=new_kid)
454
462
  return res
455
463
 
456
464
 
@@ -508,10 +516,8 @@ class Test(AstSymbolNode, ElementStmt):
508
516
  new_kid.append(self.doc)
509
517
  new_kid.append(self.gen_token(Tok.KW_TEST))
510
518
  new_kid.append(self.name)
511
-
512
519
  new_kid.append(self.body)
513
-
514
- AstNode.__init__(self, kid=new_kid)
520
+ AstNode.set_kids(self, nodes=new_kid)
515
521
  return res
516
522
 
517
523
 
@@ -545,10 +551,8 @@ class ModuleCode(ElementStmt, ArchBlockStmt, EnumBlockStmt):
545
551
  new_kid.append(self.gen_token(Tok.KW_ENTRY))
546
552
  if self.name:
547
553
  new_kid.append(self.name)
548
-
549
554
  new_kid.append(self.body)
550
-
551
- AstNode.__init__(self, kid=new_kid)
555
+ AstNode.set_kids(self, nodes=new_kid)
552
556
  return res
553
557
 
554
558
 
@@ -578,7 +582,7 @@ class PyInlineCode(ElementStmt, ArchBlockStmt, EnumBlockStmt, CodeBlockStmt):
578
582
  new_kid.append(self.gen_token(Tok.PYNLINE))
579
583
  new_kid.append(self.code)
580
584
  new_kid.append(self.gen_token(Tok.PYNLINE))
581
- AstNode.__init__(self, kid=new_kid)
585
+ AstNode.set_kids(self, nodes=new_kid)
582
586
  return res
583
587
 
584
588
 
@@ -629,7 +633,7 @@ class Import(ElementStmt, CodeBlockStmt):
629
633
  new_kid.append(self.gen_token(Tok.COMMA))
630
634
  new_kid.append(self.items)
631
635
  new_kid.append(self.gen_token(Tok.SEMI))
632
- AstNode.__init__(self, kid=new_kid)
636
+ AstNode.set_kids(self, nodes=new_kid)
633
637
  return res
634
638
 
635
639
 
@@ -667,8 +671,8 @@ class ModulePath(AstSymbolNode):
667
671
  res = res and p.normalize(deep)
668
672
  res = res and self.alias.normalize(deep) if self.alias else res
669
673
  new_kid: list[AstNode] = []
670
- for _ in range(self.level):
671
- new_kid.append(self.gen_token(Tok.DOT))
674
+ # for _ in range(self.level):
675
+ # new_kid.append(self.gen_token(Tok.DOT))
672
676
  if self.path:
673
677
  for p in self.path:
674
678
  res = res and p.normalize(deep)
@@ -678,7 +682,7 @@ class ModulePath(AstSymbolNode):
678
682
  if self.alias:
679
683
  res = res and self.alias.normalize(deep)
680
684
  new_kid.append(self.alias)
681
- AstNode.__init__(self, kid=new_kid)
685
+ AstNode.set_kids(self, nodes=new_kid)
682
686
  return res
683
687
 
684
688
  @property
@@ -719,7 +723,7 @@ class ModuleItem(AstSymbolNode):
719
723
  if self.alias:
720
724
  new_kid.append(self.gen_token(Tok.KW_AS))
721
725
  new_kid.append(self.alias)
722
- AstNode.__init__(self, kid=new_kid)
726
+ AstNode.set_kids(self, nodes=new_kid)
723
727
  return res
724
728
 
725
729
 
@@ -798,9 +802,14 @@ class Architype(ArchSpec, AstAccessNode, ArchBlockStmt, AstImplNeedingNode):
798
802
  new_kid: list[AstNode] = []
799
803
  if self.doc:
800
804
  new_kid.append(self.doc)
805
+ if self.decorators:
806
+ new_kid.append(self.gen_token(Tok.DECOR_OP))
807
+ new_kid.append(self.decorators)
801
808
  new_kid.append(self.arch_type)
802
809
  if self.access:
803
810
  new_kid.append(self.access)
811
+ if self.semstr:
812
+ new_kid.append(self.semstr)
804
813
  new_kid.append(self.name)
805
814
  if self.base_classes:
806
815
  new_kid.append(self.gen_token(Tok.COLON))
@@ -808,12 +817,12 @@ class Architype(ArchSpec, AstAccessNode, ArchBlockStmt, AstImplNeedingNode):
808
817
  new_kid.append(self.gen_token(Tok.COLON))
809
818
  if self.body:
810
819
  if isinstance(self.body, AstImplOnlyNode):
811
- new_kid.append(self.body.body)
820
+ new_kid.append(self.gen_token(Tok.SEMI))
812
821
  else:
813
822
  new_kid.append(self.body)
814
823
  else:
815
824
  new_kid.append(self.gen_token(Tok.SEMI))
816
- AstNode.__init__(self, kid=new_kid)
825
+ AstNode.set_kids(self, nodes=new_kid)
817
826
  return res
818
827
 
819
828
 
@@ -854,14 +863,12 @@ class ArchDef(ArchSpec, AstImplOnlyNode):
854
863
  if self.doc:
855
864
  new_kid.append(self.doc)
856
865
  new_kid.append(self.target)
857
-
858
866
  new_kid.append(self.body)
859
-
860
- AstNode.__init__(self, kid=new_kid)
867
+ AstNode.set_kids(self, nodes=new_kid)
861
868
  return res
862
869
 
863
870
 
864
- class Enum(ArchSpec, AstAccessNode, AstImplNeedingNode):
871
+ class Enum(ArchSpec, AstAccessNode, AstImplNeedingNode, ArchBlockStmt):
865
872
  """Enum node type for Jac Ast."""
866
873
 
867
874
  def __init__(
@@ -910,6 +917,8 @@ class Enum(ArchSpec, AstAccessNode, AstImplNeedingNode):
910
917
  new_kid.append(self.gen_token(Tok.KW_ENUM))
911
918
  if self.access:
912
919
  new_kid.append(self.access)
920
+ if self.semstr:
921
+ new_kid.append(self.semstr)
913
922
  new_kid.append(self.name)
914
923
  if self.base_classes:
915
924
  new_kid.append(self.gen_token(Tok.COLON))
@@ -917,12 +926,14 @@ class Enum(ArchSpec, AstAccessNode, AstImplNeedingNode):
917
926
  new_kid.append(self.gen_token(Tok.COLON))
918
927
  if self.body:
919
928
  if isinstance(self.body, AstImplOnlyNode):
920
- new_kid.append(self.body.body)
929
+ new_kid.append(self.gen_token(Tok.SEMI))
921
930
  else:
931
+ new_kid.append(self.gen_token(Tok.LBRACE))
922
932
  new_kid.append(self.body)
933
+ new_kid.append(self.gen_token(Tok.RBRACE))
923
934
  else:
924
935
  new_kid.append(self.gen_token(Tok.SEMI))
925
- AstNode.__init__(self, kid=new_kid)
936
+ AstNode.set_kids(self, nodes=new_kid)
926
937
  return res
927
938
 
928
939
 
@@ -963,10 +974,10 @@ class EnumDef(ArchSpec, AstImplOnlyNode):
963
974
  if self.doc:
964
975
  new_kid.append(self.doc)
965
976
  new_kid.append(self.target)
966
-
977
+ new_kid.append(self.gen_token(Tok.LBRACE))
967
978
  new_kid.append(self.body)
968
-
969
- AstNode.__init__(self, kid=new_kid)
979
+ new_kid.append(self.gen_token(Tok.RBRACE))
980
+ AstNode.set_kids(self, nodes=new_kid)
970
981
  return res
971
982
 
972
983
 
@@ -1059,6 +1070,10 @@ class Ability(
1059
1070
  new_kid: list[AstNode] = []
1060
1071
  if self.doc:
1061
1072
  new_kid.append(self.doc)
1073
+ if self.decorators:
1074
+ new_kid.append(self.gen_token(Tok.DECOR_OP))
1075
+ new_kid.append(self.decorators)
1076
+ new_kid.append(self.gen_token(Tok.WS))
1062
1077
  if self.is_async:
1063
1078
  new_kid.append(self.gen_token(Tok.KW_ASYNC))
1064
1079
  if self.is_override:
@@ -1073,16 +1088,20 @@ class Ability(
1073
1088
  new_kid.append(self.name_ref)
1074
1089
  if self.signature:
1075
1090
  new_kid.append(self.signature)
1091
+ if self.is_genai_ability:
1092
+ new_kid.append(self.gen_token(Tok.KW_BY))
1093
+ if self.is_abstract:
1094
+ new_kid.append(self.gen_token(Tok.KW_ABSTRACT))
1076
1095
  if self.body:
1077
1096
  if isinstance(self.body, AstImplOnlyNode):
1078
- new_kid.append(self.body.body)
1097
+ new_kid.append(self.gen_token(Tok.SEMI))
1079
1098
  else:
1080
- new_kid.append(self.gen_token(Tok.LBRACE))
1081
1099
  new_kid.append(self.body)
1082
- new_kid.append(self.gen_token(Tok.RBRACE))
1100
+ if self.is_genai_ability:
1101
+ new_kid.append(self.gen_token(Tok.SEMI))
1083
1102
  else:
1084
1103
  new_kid.append(self.gen_token(Tok.SEMI))
1085
- AstNode.__init__(self, kid=new_kid)
1104
+ AstNode.set_kids(self, nodes=new_kid)
1086
1105
  return res
1087
1106
 
1088
1107
 
@@ -1130,7 +1149,7 @@ class AbilityDef(AstSymbolNode, ElementStmt, AstImplOnlyNode, CodeBlockStmt):
1130
1149
 
1131
1150
  new_kid.append(self.body)
1132
1151
 
1133
- AstNode.__init__(self, kid=new_kid)
1152
+ AstNode.set_kids(self, nodes=new_kid)
1134
1153
  return res
1135
1154
 
1136
1155
  @property
@@ -1171,8 +1190,11 @@ class FuncSignature(AstSemStrNode):
1171
1190
  new_kid.append(self.gen_token(Tok.RPAREN))
1172
1191
  if self.return_type:
1173
1192
  new_kid.append(self.gen_token(Tok.RETURN_HINT))
1193
+ if self.semstr:
1194
+ new_kid.append(self.semstr)
1195
+ new_kid.append(self.gen_token(Tok.COLON))
1174
1196
  new_kid.append(self.return_type)
1175
- AstNode.__init__(self, kid=new_kid)
1197
+ AstNode.set_kids(self, nodes=new_kid)
1176
1198
  return res
1177
1199
 
1178
1200
  @property
@@ -1231,7 +1253,7 @@ class EventSignature(AstSemStrNode):
1231
1253
  new_kid.append(self.semstr)
1232
1254
  new_kid.append(self.gen_token(Tok.RETURN_HINT))
1233
1255
  new_kid.append(self.return_type)
1234
- AstNode.__init__(self, kid=new_kid)
1256
+ AstNode.set_kids(self, nodes=new_kid)
1235
1257
  return res
1236
1258
 
1237
1259
  @property
@@ -1267,7 +1289,7 @@ class ArchRefChain(AstNode):
1267
1289
  new_kid: list[AstNode] = []
1268
1290
  for a in self.archs:
1269
1291
  new_kid.append(a)
1270
- AstNode.__init__(self, kid=new_kid)
1292
+ AstNode.set_kids(self, nodes=new_kid)
1271
1293
  return res
1272
1294
 
1273
1295
  def py_resolve_name(self) -> str:
@@ -1328,12 +1350,15 @@ class ParamVar(AstSymbolNode, AstTypedVarNode, AstSemStrNode):
1328
1350
  if self.unpack:
1329
1351
  new_kid.append(self.unpack)
1330
1352
  new_kid.append(self.name)
1353
+ if self.semstr:
1354
+ new_kid.append(self.gen_token(Tok.COLON))
1355
+ new_kid.append(self.semstr)
1331
1356
  if self.type_tag:
1332
1357
  new_kid.append(self.type_tag)
1333
1358
  if self.value:
1334
1359
  new_kid.append(self.gen_token(Tok.EQ))
1335
1360
  new_kid.append(self.value)
1336
- AstNode.__init__(self, kid=new_kid)
1361
+ AstNode.set_kids(self, nodes=new_kid)
1337
1362
  return res
1338
1363
 
1339
1364
 
@@ -1378,7 +1403,7 @@ class ArchHas(AstAccessNode, AstDocNode, ArchBlockStmt):
1378
1403
  new_kid.append(self.access)
1379
1404
  new_kid.append(self.vars)
1380
1405
  new_kid.append(self.gen_token(Tok.SEMI))
1381
- AstNode.__init__(self, kid=new_kid)
1406
+ AstNode.set_kids(self, nodes=new_kid)
1382
1407
  return res
1383
1408
 
1384
1409
 
@@ -1428,7 +1453,7 @@ class HasVar(AstSymbolNode, AstTypedVarNode, AstSemStrNode):
1428
1453
  if self.defer:
1429
1454
  new_kid.append(self.gen_token(Tok.KW_BY))
1430
1455
  new_kid.append(self.gen_token(Tok.KW_POST_INIT))
1431
- AstNode.__init__(self, kid=new_kid)
1456
+ AstNode.set_kids(self, nodes=new_kid)
1432
1457
  return res
1433
1458
 
1434
1459
 
@@ -1457,7 +1482,7 @@ class TypedCtxBlock(CodeBlockStmt):
1457
1482
  self.type_ctx,
1458
1483
  self.body,
1459
1484
  ]
1460
- AstNode.__init__(self, kid=new_kid)
1485
+ AstNode.set_kids(self, nodes=new_kid)
1461
1486
  return res
1462
1487
 
1463
1488
 
@@ -1487,13 +1512,11 @@ class IfStmt(CodeBlockStmt, AstElseBodyNode):
1487
1512
  new_kid: list[AstNode] = [
1488
1513
  self.gen_token(Tok.KW_IF),
1489
1514
  self.condition,
1490
- self.gen_token(Tok.LBRACE),
1491
1515
  self.body,
1492
- self.gen_token(Tok.RBRACE),
1493
1516
  ]
1494
1517
  if self.else_body:
1495
1518
  new_kid.append(self.else_body)
1496
- AstNode.__init__(self, kid=new_kid)
1519
+ AstNode.set_kids(self, nodes=new_kid)
1497
1520
  return res
1498
1521
 
1499
1522
 
@@ -1510,13 +1533,11 @@ class ElseIf(IfStmt):
1510
1533
  new_kid: list[AstNode] = [
1511
1534
  self.gen_token(Tok.KW_ELIF),
1512
1535
  self.condition,
1513
- self.gen_token(Tok.LBRACE),
1514
1536
  self.body,
1515
- self.gen_token(Tok.RBRACE),
1516
1537
  ]
1517
1538
  if self.else_body:
1518
1539
  new_kid.append(self.else_body)
1519
- AstNode.__init__(self, kid=new_kid)
1540
+ AstNode.set_kids(self, nodes=new_kid)
1520
1541
  return res
1521
1542
 
1522
1543
 
@@ -1539,11 +1560,9 @@ class ElseStmt(AstNode):
1539
1560
  res = self.body.normalize(deep)
1540
1561
  new_kid: list[AstNode] = [
1541
1562
  self.gen_token(Tok.KW_ELSE),
1542
- self.gen_token(Tok.LBRACE),
1543
1563
  self.body,
1544
- self.gen_token(Tok.RBRACE),
1545
1564
  ]
1546
- AstNode.__init__(self, kid=new_kid)
1565
+ AstNode.set_kids(self, nodes=new_kid)
1547
1566
  return res
1548
1567
 
1549
1568
 
@@ -1565,14 +1584,13 @@ class ExprStmt(CodeBlockStmt):
1565
1584
  """Normalize ast node."""
1566
1585
  if deep:
1567
1586
  res = self.expr.normalize(deep)
1568
- AstNode.__init__(
1569
- self,
1570
- kid=(
1571
- [self.expr, self.gen_token(Tok.SEMI)]
1572
- if not self.in_fstring
1573
- else [self.expr]
1574
- ),
1575
- )
1587
+ new_kid: list[AstNode] = []
1588
+ if self.in_fstring:
1589
+ new_kid.append(self.expr)
1590
+ else:
1591
+ new_kid.append(self.expr)
1592
+ new_kid.append(self.gen_token(Tok.SEMI))
1593
+ AstNode.set_kids(self, nodes=new_kid)
1576
1594
  return res and self.expr is not None
1577
1595
 
1578
1596
 
@@ -1607,16 +1625,14 @@ class TryStmt(AstElseBodyNode, CodeBlockStmt):
1607
1625
  new_kid: list[AstNode] = [
1608
1626
  self.gen_token(Tok.KW_TRY),
1609
1627
  ]
1610
- new_kid.append(self.gen_token(Tok.LBRACE))
1611
1628
  new_kid.append(self.body)
1612
- new_kid.append(self.gen_token(Tok.RBRACE))
1613
1629
  if self.excepts:
1614
1630
  new_kid.append(self.excepts)
1615
1631
  if self.else_body:
1616
1632
  new_kid.append(self.else_body)
1617
1633
  if self.finally_body:
1618
1634
  new_kid.append(self.finally_body)
1619
- AstNode.__init__(self, kid=new_kid)
1635
+ AstNode.set_kids(self, nodes=new_kid)
1620
1636
  return res
1621
1637
 
1622
1638
 
@@ -1650,10 +1666,8 @@ class Except(CodeBlockStmt):
1650
1666
  if self.name:
1651
1667
  new_kid.append(self.gen_token(Tok.KW_AS))
1652
1668
  new_kid.append(self.name)
1653
- new_kid.append(self.gen_token(Tok.LBRACE))
1654
1669
  new_kid.append(self.body)
1655
- new_kid.append(self.gen_token(Tok.RBRACE))
1656
- AstNode.__init__(self, kid=new_kid)
1670
+ AstNode.set_kids(self, nodes=new_kid)
1657
1671
  return res
1658
1672
 
1659
1673
 
@@ -1677,10 +1691,8 @@ class FinallyStmt(CodeBlockStmt):
1677
1691
  new_kid: list[AstNode] = [
1678
1692
  self.gen_token(Tok.KW_FINALLY),
1679
1693
  ]
1680
- new_kid.append(self.gen_token(Tok.LBRACE))
1681
1694
  new_kid.append(self.body)
1682
- new_kid.append(self.gen_token(Tok.RBRACE))
1683
- AstNode.__init__(self, kid=new_kid)
1695
+ AstNode.set_kids(self, nodes=new_kid)
1684
1696
  return res
1685
1697
 
1686
1698
 
@@ -1724,12 +1736,10 @@ class IterForStmt(AstAsyncNode, AstElseBodyNode, CodeBlockStmt):
1724
1736
  new_kid.append(self.condition)
1725
1737
  new_kid.append(self.gen_token(Tok.KW_BY))
1726
1738
  new_kid.append(self.count_by)
1727
- new_kid.append(self.gen_token(Tok.LBRACE))
1728
1739
  new_kid.append(self.body)
1729
- new_kid.append(self.gen_token(Tok.RBRACE))
1730
1740
  if self.else_body:
1731
1741
  new_kid.append(self.else_body)
1732
- AstNode.__init__(self, kid=new_kid)
1742
+ AstNode.set_kids(self, nodes=new_kid)
1733
1743
  return res
1734
1744
 
1735
1745
 
@@ -1770,13 +1780,10 @@ class InForStmt(AstAsyncNode, AstElseBodyNode, CodeBlockStmt):
1770
1780
  new_kid.append(self.collection)
1771
1781
 
1772
1782
  if self.body:
1773
- new_kid.append(self.gen_token(Tok.LBRACE))
1774
1783
  new_kid.append(self.body)
1775
- new_kid.append(self.gen_token(Tok.RBRACE))
1776
-
1777
1784
  if self.else_body:
1778
1785
  new_kid.append(self.else_body)
1779
- AstNode.__init__(self, kid=new_kid)
1786
+ AstNode.set_kids(self, nodes=new_kid)
1780
1787
  return res
1781
1788
 
1782
1789
 
@@ -1805,11 +1812,8 @@ class WhileStmt(CodeBlockStmt):
1805
1812
  self.condition,
1806
1813
  ]
1807
1814
  if self.body:
1808
- new_kid.append(self.gen_token(Tok.LBRACE))
1809
1815
  new_kid.append(self.body)
1810
- new_kid.append(self.gen_token(Tok.RBRACE))
1811
-
1812
- AstNode.__init__(self, kid=new_kid)
1816
+ AstNode.set_kids(self, nodes=new_kid)
1813
1817
  return res
1814
1818
 
1815
1819
 
@@ -1840,12 +1844,11 @@ class WithStmt(AstAsyncNode, CodeBlockStmt):
1840
1844
  new_kid.append(self.gen_token(Tok.KW_ASYNC))
1841
1845
  new_kid.append(self.gen_token(Tok.KW_WITH))
1842
1846
  new_kid.append(self.exprs)
1843
-
1844
1847
  new_kid.append(self.gen_token(Tok.LBRACE))
1845
1848
  new_kid.append(self.body)
1846
1849
  new_kid.append(self.gen_token(Tok.RBRACE))
1847
1850
 
1848
- AstNode.__init__(self, kid=new_kid)
1851
+ AstNode.set_kids(self, nodes=new_kid)
1849
1852
  return res
1850
1853
 
1851
1854
 
@@ -1873,7 +1876,7 @@ class ExprAsItem(AstNode):
1873
1876
  if self.alias:
1874
1877
  new_kid.append(self.gen_token(Tok.KW_AS))
1875
1878
  new_kid.append(self.alias)
1876
- AstNode.__init__(self, kid=new_kid)
1879
+ AstNode.set_kids(self, nodes=new_kid)
1877
1880
  return res
1878
1881
 
1879
1882
 
@@ -1904,7 +1907,7 @@ class RaiseStmt(CodeBlockStmt):
1904
1907
  new_kid.append(self.gen_token(Tok.KW_FROM))
1905
1908
  new_kid.append(self.from_target)
1906
1909
  new_kid.append(self.gen_token(Tok.SEMI))
1907
- AstNode.__init__(self, kid=new_kid)
1910
+ AstNode.set_kids(self, nodes=new_kid)
1908
1911
  return res
1909
1912
 
1910
1913
 
@@ -1936,7 +1939,7 @@ class AssertStmt(CodeBlockStmt):
1936
1939
  new_kid.append(self.gen_token(Tok.COMMA))
1937
1940
  new_kid.append(self.error_msg)
1938
1941
  new_kid.append(self.gen_token(Tok.SEMI))
1939
- AstNode.__init__(self, kid=new_kid)
1942
+ AstNode.set_kids(self, nodes=new_kid)
1940
1943
  return res
1941
1944
 
1942
1945
 
@@ -1958,7 +1961,7 @@ class CtrlStmt(CodeBlockStmt):
1958
1961
  if deep:
1959
1962
  res = self.ctrl.normalize(deep)
1960
1963
  new_kid: list[AstNode] = [self.ctrl, self.gen_token(Tok.SEMI)]
1961
- AstNode.__init__(self, kid=new_kid)
1964
+ AstNode.set_kids(self, nodes=new_kid)
1962
1965
  return res
1963
1966
 
1964
1967
 
@@ -1984,7 +1987,7 @@ class DeleteStmt(CodeBlockStmt):
1984
1987
  self.target,
1985
1988
  self.gen_token(Tok.SEMI),
1986
1989
  ]
1987
- AstNode.__init__(self, kid=new_kid)
1990
+ AstNode.set_kids(self, nodes=new_kid)
1988
1991
  return res
1989
1992
 
1990
1993
 
@@ -2010,7 +2013,7 @@ class ReportStmt(CodeBlockStmt):
2010
2013
  self.expr,
2011
2014
  self.gen_token(Tok.SEMI),
2012
2015
  ]
2013
- AstNode.__init__(self, kid=new_kid)
2016
+ AstNode.set_kids(self, nodes=new_kid)
2014
2017
  return res
2015
2018
 
2016
2019
 
@@ -2037,7 +2040,7 @@ class ReturnStmt(CodeBlockStmt):
2037
2040
  if self.expr:
2038
2041
  new_kid.append(self.expr)
2039
2042
  new_kid.append(self.gen_token(Tok.SEMI))
2040
- AstNode.__init__(self, kid=new_kid)
2043
+ AstNode.set_kids(self, nodes=new_kid)
2041
2044
  return res
2042
2045
 
2043
2046
 
@@ -2064,7 +2067,7 @@ class IgnoreStmt(WalkerStmtOnlyNode, CodeBlockStmt):
2064
2067
  self.target,
2065
2068
  self.gen_token(Tok.SEMI),
2066
2069
  ]
2067
- AstNode.__init__(self, kid=new_kid)
2070
+ AstNode.set_kids(self, nodes=new_kid)
2068
2071
  return res
2069
2072
 
2070
2073
 
@@ -2099,10 +2102,11 @@ class VisitStmt(WalkerStmtOnlyNode, AstElseBodyNode, CodeBlockStmt):
2099
2102
  new_kid.append(self.vis_type)
2100
2103
  new_kid.append(self.gen_token(Tok.COLON))
2101
2104
  new_kid.append(self.target)
2102
- new_kid.append(self.gen_token(Tok.SEMI))
2103
2105
  if self.else_body:
2104
2106
  new_kid.append(self.else_body)
2105
- AstNode.__init__(self, kid=new_kid)
2107
+ else:
2108
+ new_kid.append(self.gen_token(Tok.SEMI))
2109
+ AstNode.set_kids(self, nodes=new_kid)
2106
2110
  return res
2107
2111
 
2108
2112
 
@@ -2133,7 +2137,7 @@ class RevisitStmt(WalkerStmtOnlyNode, AstElseBodyNode, CodeBlockStmt):
2133
2137
  if self.else_body:
2134
2138
  new_kid.append(self.else_body)
2135
2139
  new_kid.append(self.gen_token(Tok.SEMI))
2136
- AstNode.__init__(self, kid=new_kid)
2140
+ AstNode.set_kids(self, nodes=new_kid)
2137
2141
  return res
2138
2142
 
2139
2143
 
@@ -2154,7 +2158,7 @@ class DisengageStmt(WalkerStmtOnlyNode, CodeBlockStmt):
2154
2158
  self.gen_token(Tok.KW_DISENGAGE),
2155
2159
  self.gen_token(Tok.SEMI),
2156
2160
  ]
2157
- AstNode.__init__(self, kid=new_kid)
2161
+ AstNode.set_kids(self, nodes=new_kid)
2158
2162
  return True
2159
2163
 
2160
2164
 
@@ -2179,7 +2183,7 @@ class AwaitExpr(Expr):
2179
2183
  self.gen_token(Tok.KW_AWAIT),
2180
2184
  self.target,
2181
2185
  ]
2182
- AstNode.__init__(self, kid=new_kid)
2186
+ AstNode.set_kids(self, nodes=new_kid)
2183
2187
  return res
2184
2188
 
2185
2189
 
@@ -2205,7 +2209,7 @@ class GlobalStmt(CodeBlockStmt):
2205
2209
  self.target,
2206
2210
  self.gen_token(Tok.SEMI),
2207
2211
  ]
2208
- AstNode.__init__(self, kid=new_kid)
2212
+ AstNode.set_kids(self, nodes=new_kid)
2209
2213
  return res
2210
2214
 
2211
2215
 
@@ -2222,7 +2226,7 @@ class NonLocalStmt(GlobalStmt):
2222
2226
  self.target,
2223
2227
  self.gen_token(Tok.SEMI),
2224
2228
  ]
2225
- AstNode.__init__(self, kid=new_kid)
2229
+ AstNode.set_kids(self, nodes=new_kid)
2226
2230
  return res
2227
2231
 
2228
2232
 
@@ -2260,18 +2264,25 @@ class Assignment(AstSemStrNode, AstTypedVarNode, EnumBlockStmt, CodeBlockStmt):
2260
2264
  res = res and self.aug_op.normalize(deep) if self.aug_op else res
2261
2265
  new_kid: list[AstNode] = []
2262
2266
  new_kid.append(self.target)
2267
+ if self.semstr:
2268
+ new_kid.append(self.gen_token(Tok.COLON))
2269
+ new_kid.append(self.semstr)
2263
2270
  if self.type_tag:
2264
2271
  new_kid.append(self.type_tag)
2265
2272
  if self.aug_op:
2266
2273
  new_kid.append(self.aug_op)
2267
- new_kid.append(self.gen_token(Tok.EQ))
2268
- else:
2269
- new_kid.append(self.gen_token(Tok.EQ))
2270
2274
  if self.value:
2275
+ if not self.aug_op:
2276
+ new_kid.append(self.gen_token(Tok.EQ))
2271
2277
  new_kid.append(self.value)
2272
- if not isinstance(self.parent, (GlobalVars)):
2278
+ if isinstance(self.parent, SubNodeList) and isinstance(
2279
+ self.parent.parent, GlobalVars
2280
+ ):
2281
+ if self.parent.kid.index(self) == len(self.parent.kid) - 1:
2282
+ new_kid.append(self.gen_token(Tok.SEMI))
2283
+ elif (not self.is_enum_stmt) and not isinstance(self.parent, IterForStmt):
2273
2284
  new_kid.append(self.gen_token(Tok.SEMI))
2274
- AstNode.__init__(self, kid=new_kid)
2285
+ AstNode.set_kids(self, nodes=new_kid)
2275
2286
  return res
2276
2287
 
2277
2288
 
@@ -2305,7 +2316,7 @@ class BinaryExpr(Expr):
2305
2316
  self.right,
2306
2317
  self.gen_token(Tok.RPAREN),
2307
2318
  ]
2308
- AstNode.__init__(self, kid=new_kid)
2319
+ AstNode.set_kids(self, nodes=new_kid)
2309
2320
  return res
2310
2321
 
2311
2322
 
@@ -2338,7 +2349,7 @@ class CompareExpr(Expr):
2338
2349
  for i, right in enumerate(self.rights):
2339
2350
  new_kid.append(self.ops[i])
2340
2351
  new_kid.append(right)
2341
- AstNode.__init__(self, kid=new_kid)
2352
+ AstNode.set_kids(self, nodes=new_kid)
2342
2353
  return res
2343
2354
 
2344
2355
 
@@ -2368,7 +2379,7 @@ class BoolExpr(Expr):
2368
2379
  if i > 0:
2369
2380
  new_kid.append(self.op)
2370
2381
  new_kid.append(value)
2371
- AstNode.__init__(self, kid=new_kid)
2382
+ AstNode.set_kids(self, nodes=new_kid)
2372
2383
  return res
2373
2384
 
2374
2385
 
@@ -2399,7 +2410,7 @@ class LambdaExpr(Expr):
2399
2410
  self.body,
2400
2411
  self.gen_token(Tok.SEMI),
2401
2412
  ]
2402
- AstNode.__init__(self, kid=new_kid)
2413
+ AstNode.set_kids(self, nodes=new_kid)
2403
2414
  return res
2404
2415
 
2405
2416
 
@@ -2424,7 +2435,7 @@ class UnaryExpr(Expr):
2424
2435
  res = self.operand.normalize(deep)
2425
2436
  res = res and self.op.normalize(deep) if self.op else res
2426
2437
  new_kid: list[AstNode] = [self.op, self.operand]
2427
- AstNode.__init__(self, kid=new_kid)
2438
+ AstNode.set_kids(self, nodes=new_kid)
2428
2439
  return res
2429
2440
 
2430
2441
 
@@ -2458,7 +2469,7 @@ class IfElseExpr(Expr):
2458
2469
  self.gen_token(Tok.KW_ELSE),
2459
2470
  self.else_value,
2460
2471
  ]
2461
- AstNode.__init__(self, kid=new_kid)
2472
+ AstNode.set_kids(self, nodes=new_kid)
2462
2473
  return res
2463
2474
 
2464
2475
 
@@ -2489,7 +2500,7 @@ class MultiString(AtomExpr):
2489
2500
  new_kid: list[AstNode] = []
2490
2501
  for string in self.strings:
2491
2502
  new_kid.append(string)
2492
- AstNode.__init__(self, kid=new_kid)
2503
+ AstNode.set_kids(self, nodes=new_kid)
2493
2504
  return res
2494
2505
 
2495
2506
 
@@ -2518,8 +2529,13 @@ class FString(AtomExpr):
2518
2529
  res = self.parts.normalize(deep) if self.parts else res
2519
2530
  new_kid: list[AstNode] = []
2520
2531
  if self.parts:
2532
+ for i in self.parts.items:
2533
+ if isinstance(i, String):
2534
+ i.value = (
2535
+ "{{" if i.value == "{" else "}}" if i.value == "}" else i.value
2536
+ )
2521
2537
  new_kid.append(self.parts)
2522
- AstNode.__init__(self, kid=new_kid)
2538
+ AstNode.set_kids(self, nodes=new_kid)
2523
2539
  return res
2524
2540
 
2525
2541
 
@@ -2552,7 +2568,7 @@ class ListVal(AtomExpr):
2552
2568
  if self.values:
2553
2569
  new_kid.append(self.values)
2554
2570
  new_kid.append(self.gen_token(Tok.RSQUARE))
2555
- AstNode.__init__(self, kid=new_kid)
2571
+ AstNode.set_kids(self, nodes=new_kid)
2556
2572
  return res
2557
2573
 
2558
2574
 
@@ -2579,11 +2595,13 @@ class SetVal(AtomExpr):
2579
2595
  res = True
2580
2596
  if deep:
2581
2597
  res = self.values.normalize(deep) if self.values else res
2582
- new_kid: list[AstNode] = []
2598
+ new_kid: list[AstNode] = [
2599
+ self.gen_token(Tok.LBRACE),
2600
+ ]
2583
2601
  if self.values:
2584
2602
  new_kid.append(self.values)
2585
-
2586
- AstNode.__init__(self, kid=new_kid)
2603
+ new_kid.append(self.gen_token(Tok.RBRACE))
2604
+ AstNode.set_kids(self, nodes=new_kid)
2587
2605
  return res
2588
2606
 
2589
2607
 
@@ -2610,15 +2628,28 @@ class TupleVal(AtomExpr):
2610
2628
  res = True
2611
2629
  if deep:
2612
2630
  res = self.values.normalize(deep) if self.values else res
2613
- new_kid: list[AstNode] = [
2614
- self.gen_token(Tok.LPAREN),
2615
- ]
2631
+ in_ret_type = (
2632
+ self.parent
2633
+ and isinstance(self.parent, IndexSlice)
2634
+ and self.parent
2635
+ and isinstance(self.parent.parent, AtomTrailer)
2636
+ and self.parent.parent
2637
+ and isinstance(self.parent.parent.parent, FuncSignature)
2638
+ )
2639
+ new_kid: list[AstNode] = (
2640
+ [
2641
+ self.gen_token(Tok.LPAREN),
2642
+ ]
2643
+ if not in_ret_type
2644
+ else []
2645
+ )
2616
2646
  if self.values:
2617
2647
  new_kid.append(self.values)
2618
2648
  if len(self.values.items) < 2:
2619
2649
  new_kid.append(self.gen_token(Tok.COMMA))
2620
- new_kid.append(self.gen_token(Tok.RPAREN))
2621
- AstNode.__init__(self, kid=new_kid)
2650
+ if not in_ret_type:
2651
+ new_kid.append(self.gen_token(Tok.RPAREN))
2652
+ AstNode.set_kids(self, nodes=new_kid)
2622
2653
  return res
2623
2654
 
2624
2655
 
@@ -2654,7 +2685,7 @@ class DictVal(AtomExpr):
2654
2685
  if i < len(self.kv_pairs) - 1:
2655
2686
  new_kid.append(self.gen_token(Tok.COMMA))
2656
2687
  new_kid.append(self.gen_token(Tok.RBRACE))
2657
- AstNode.__init__(self, kid=new_kid)
2688
+ AstNode.set_kids(self, nodes=new_kid)
2658
2689
  return res
2659
2690
 
2660
2691
 
@@ -2685,7 +2716,7 @@ class KVPair(AstNode):
2685
2716
  else:
2686
2717
  new_kid.append(self.gen_token(Tok.STAR_POW))
2687
2718
  new_kid.append(self.value)
2688
- AstNode.__init__(self, kid=new_kid)
2719
+ AstNode.set_kids(self, nodes=new_kid)
2689
2720
  return res
2690
2721
 
2691
2722
 
@@ -2714,7 +2745,7 @@ class KWPair(AstNode):
2714
2745
  new_kid.append(self.key)
2715
2746
  new_kid.append(self.gen_token(Tok.EQ))
2716
2747
  new_kid.append(self.value)
2717
- AstNode.__init__(self, kid=new_kid)
2748
+ AstNode.set_kids(self, nodes=new_kid)
2718
2749
  return res
2719
2750
 
2720
2751
 
@@ -2752,8 +2783,9 @@ class InnerCompr(AstAsyncNode):
2752
2783
  new_kid.append(self.gen_token(Tok.KW_IN))
2753
2784
  new_kid.append(self.collection)
2754
2785
  for cond in self.conditional if self.conditional else []:
2786
+ new_kid.append(self.gen_token(Tok.KW_IF))
2755
2787
  new_kid.append(cond)
2756
- AstNode.__init__(self, kid=new_kid)
2788
+ AstNode.set_kids(self, nodes=new_kid)
2757
2789
  return res
2758
2790
 
2759
2791
 
@@ -2791,7 +2823,7 @@ class ListCompr(AtomExpr):
2791
2823
  for comp in self.compr:
2792
2824
  new_kid.append(comp)
2793
2825
  new_kid.append(self.gen_token(Tok.RSQUARE))
2794
- AstNode.__init__(self, kid=new_kid)
2826
+ AstNode.set_kids(self, nodes=new_kid)
2795
2827
  return res
2796
2828
 
2797
2829
 
@@ -2812,7 +2844,7 @@ class GenCompr(ListCompr):
2812
2844
  for comp in self.compr:
2813
2845
  new_kid.append(comp)
2814
2846
  new_kid.append(self.gen_token(Tok.RPAREN))
2815
- AstNode.__init__(self, kid=new_kid)
2847
+ AstNode.set_kids(self, nodes=new_kid)
2816
2848
  return res
2817
2849
 
2818
2850
 
@@ -2827,12 +2859,13 @@ class SetCompr(ListCompr):
2827
2859
  for comp in self.compr:
2828
2860
  res = res and comp.normalize(deep)
2829
2861
  new_kid: list[AstNode] = [
2862
+ self.gen_token(Tok.LBRACE),
2830
2863
  self.out_expr,
2831
2864
  ]
2832
2865
  for comp in self.compr:
2833
2866
  new_kid.append(comp)
2834
-
2835
- AstNode.__init__(self, kid=new_kid)
2867
+ new_kid.append(self.gen_token(Tok.RBRACE))
2868
+ AstNode.set_kids(self, nodes=new_kid)
2836
2869
  return res
2837
2870
 
2838
2871
 
@@ -2863,12 +2896,13 @@ class DictCompr(AtomExpr):
2863
2896
  for comp in self.compr:
2864
2897
  res = res and comp.normalize(deep)
2865
2898
  new_kid: list[AstNode] = [
2899
+ self.gen_token(Tok.LBRACE),
2866
2900
  self.kv_pair,
2867
2901
  ]
2868
2902
  for comp in self.compr:
2869
2903
  new_kid.append(comp)
2870
-
2871
- AstNode.__init__(self, kid=new_kid)
2904
+ new_kid.append(self.gen_token(Tok.RBRACE))
2905
+ AstNode.set_kids(self, nodes=new_kid)
2872
2906
  return res
2873
2907
 
2874
2908
 
@@ -2903,7 +2937,7 @@ class AtomTrailer(Expr):
2903
2937
  new_kid.append(self.gen_token(Tok.DOT))
2904
2938
  if self.right:
2905
2939
  new_kid.append(self.right)
2906
- AstNode.__init__(self, kid=new_kid)
2940
+ AstNode.set_kids(self, nodes=new_kid)
2907
2941
  return res
2908
2942
 
2909
2943
 
@@ -2928,7 +2962,7 @@ class AtomUnit(Expr):
2928
2962
  new_kid.append(self.gen_token(Tok.LPAREN))
2929
2963
  new_kid.append(self.value)
2930
2964
  new_kid.append(self.gen_token(Tok.RPAREN))
2931
- AstNode.__init__(self, kid=new_kid)
2965
+ AstNode.set_kids(self, nodes=new_kid)
2932
2966
  return res
2933
2967
 
2934
2968
 
@@ -2957,7 +2991,7 @@ class YieldExpr(Expr):
2957
2991
  if self.expr:
2958
2992
  new_kid.append(self.expr)
2959
2993
  new_kid.append(self.gen_token(Tok.SEMI))
2960
- AstNode.__init__(self, kid=new_kid)
2994
+ AstNode.set_kids(self, nodes=new_kid)
2961
2995
  return res
2962
2996
 
2963
2997
 
@@ -3023,18 +3057,18 @@ class IndexSlice(AtomExpr):
3023
3057
  if self.is_range:
3024
3058
  if self.start:
3025
3059
  new_kid.append(self.start)
3026
- new_kid.append(self.gen_token(Tok.COLON))
3027
3060
  if self.stop:
3061
+ new_kid.append(self.gen_token(Tok.COLON))
3028
3062
  new_kid.append(self.stop)
3029
- new_kid.append(self.gen_token(Tok.COLON))
3030
3063
  if self.step:
3064
+ new_kid.append(self.gen_token(Tok.COLON))
3031
3065
  new_kid.append(self.step)
3032
3066
  elif self.start:
3033
3067
  new_kid.append(self.start)
3034
3068
  else:
3035
3069
  res = False
3036
3070
  new_kid.append(self.gen_token(Tok.RSQUARE))
3037
- AstNode.__init__(self, kid=new_kid)
3071
+ AstNode.set_kids(self, nodes=new_kid)
3038
3072
  return res
3039
3073
 
3040
3074
 
@@ -3064,7 +3098,7 @@ class ArchRef(NameSpec):
3064
3098
  if deep:
3065
3099
  res = self.name_ref.normalize(deep)
3066
3100
  new_kid: list[AstNode] = [self.arch, self.name_ref]
3067
- AstNode.__init__(self, kid=new_kid)
3101
+ AstNode.set_kids(self, nodes=new_kid)
3068
3102
  return res
3069
3103
 
3070
3104
  def py_resolve_name(self) -> str:
@@ -3101,7 +3135,7 @@ class SpecialVarRef(NameSpec):
3101
3135
  if deep:
3102
3136
  res = self.var.normalize(deep)
3103
3137
  new_kid: list[AstNode] = [self.var]
3104
- AstNode.__init__(self, kid=new_kid)
3138
+ AstNode.set_kids(self, nodes=new_kid)
3105
3139
  return res
3106
3140
 
3107
3141
  def py_resolve_name(self) -> str:
@@ -3144,11 +3178,10 @@ class EdgeRefTrailer(Expr):
3144
3178
  new_kid: list[AstNode] = []
3145
3179
  if self.edges_only:
3146
3180
  new_kid.append(self.gen_token(Tok.EDGE_OP))
3147
- self.gen_token(Tok.LSQUARE)
3148
- for expr in self.chain:
3149
- new_kid.append(expr)
3150
- self.gen_token(Tok.RSQUARE)
3151
- AstNode.__init__(self, kid=new_kid)
3181
+ new_kid.append(self.gen_token(Tok.LSQUARE))
3182
+ new_kid.extend(self.chain)
3183
+ new_kid.append(self.gen_token(Tok.RSQUARE))
3184
+ AstNode.set_kids(self, nodes=new_kid)
3152
3185
  return res
3153
3186
 
3154
3187
 
@@ -3200,7 +3233,7 @@ class EdgeOpRef(WalkerStmtOnlyNode, AtomExpr):
3200
3233
  new_kid.append(self.gen_token(Tok.ARROW_L_P1))
3201
3234
  new_kid.append(self.filter_cond)
3202
3235
  new_kid.append(self.gen_token(Tok.ARROW_R_P2))
3203
- AstNode.__init__(self, kid=new_kid)
3236
+ AstNode.set_kids(self, nodes=new_kid)
3204
3237
  return res
3205
3238
 
3206
3239
 
@@ -3222,8 +3255,8 @@ class DisconnectOp(WalkerStmtOnlyNode):
3222
3255
  res = True
3223
3256
  if deep:
3224
3257
  res = self.edge_spec.normalize(deep)
3225
- new_kid: list[AstNode] = [self.gen_token(Tok.NOT), self.edge_spec]
3226
- AstNode.__init__(self, kid=new_kid)
3258
+ new_kid: list[AstNode] = [self.gen_token(Tok.KW_DELETE), self.edge_spec]
3259
+ AstNode.set_kids(self, nodes=new_kid)
3227
3260
  return res
3228
3261
 
3229
3262
 
@@ -3283,7 +3316,7 @@ class ConnectOp(AstNode):
3283
3316
  new_kid.append(self.gen_token(Tok.COLON))
3284
3317
  new_kid.append(self.conn_assign)
3285
3318
  new_kid.append(self.gen_token(Tok.CARROW_R_P2))
3286
- AstNode.__init__(self, kid=new_kid)
3319
+ AstNode.set_kids(self, nodes=new_kid)
3287
3320
  return res
3288
3321
 
3289
3322
 
@@ -3314,17 +3347,20 @@ class FilterCompr(AtomExpr):
3314
3347
  res = self.f_type.normalize(deep) if self.f_type else res
3315
3348
  res = res and self.compares.normalize(deep) if self.compares else res
3316
3349
  new_kid: list[AstNode] = []
3317
- new_kid.append(self.gen_token(Tok.LPAREN))
3318
- if self.f_type:
3319
- new_kid.append(self.gen_token(Tok.TYPE_OP))
3320
- new_kid.append(self.gen_token(Tok.NULL_OK))
3350
+ if not isinstance(self.parent, EdgeOpRef):
3351
+ new_kid.append(self.gen_token(Tok.LPAREN))
3352
+ if self.f_type:
3353
+ new_kid.append(self.gen_token(Tok.TYPE_OP))
3354
+ new_kid.append(self.gen_token(Tok.NULL_OK))
3321
3355
  if self.f_type:
3322
3356
  new_kid.append(self.f_type)
3323
- new_kid.append(self.gen_token(Tok.COLON))
3324
3357
  if self.compares:
3358
+ if self.f_type:
3359
+ new_kid.append(self.gen_token(Tok.COLON))
3325
3360
  new_kid.append(self.compares)
3326
- new_kid.append(self.gen_token(Tok.RPAREN))
3327
- AstNode.__init__(self, kid=new_kid)
3361
+ if not isinstance(self.parent, EdgeOpRef):
3362
+ new_kid.append(self.gen_token(Tok.RPAREN))
3363
+ AstNode.set_kids(self, nodes=new_kid)
3328
3364
  return res
3329
3365
 
3330
3366
 
@@ -3352,11 +3388,14 @@ class AssignCompr(AtomExpr):
3352
3388
  if deep:
3353
3389
  res = self.assigns.normalize(deep)
3354
3390
  new_kid: list[AstNode] = []
3355
- new_kid.append(self.gen_token(Tok.LPAREN))
3356
- new_kid.append(self.gen_token(Tok.EQ))
3357
- new_kid.append(self.assigns)
3358
- new_kid.append(self.gen_token(Tok.RPAREN))
3359
- AstNode.__init__(self, kid=new_kid)
3391
+ if isinstance(self.parent, ConnectOp):
3392
+ new_kid.append(self.assigns)
3393
+ else:
3394
+ new_kid.append(self.gen_token(Tok.LPAREN))
3395
+ new_kid.append(self.gen_token(Tok.EQ))
3396
+ new_kid.append(self.assigns)
3397
+ new_kid.append(self.gen_token(Tok.RPAREN))
3398
+ AstNode.set_kids(self, nodes=new_kid)
3360
3399
  return res
3361
3400
 
3362
3401
 
@@ -3389,10 +3428,12 @@ class MatchStmt(CodeBlockStmt):
3389
3428
  self.gen_token(Tok.KW_MATCH),
3390
3429
  self.target,
3391
3430
  ]
3431
+ new_kid.append(self.gen_token(Tok.LBRACE))
3392
3432
  for case in self.cases:
3393
3433
  new_kid.append(case)
3434
+ new_kid.append(self.gen_token(Tok.RBRACE))
3394
3435
 
3395
- AstNode.__init__(self, kid=new_kid)
3436
+ AstNode.set_kids(self, nodes=new_kid)
3396
3437
  return res
3397
3438
 
3398
3439
 
@@ -3427,7 +3468,7 @@ class MatchCase(AstNode):
3427
3468
  new_kid.append(self.gen_token(Tok.COLON))
3428
3469
  if self.body:
3429
3470
  new_kid.extend([*self.body])
3430
- AstNode.__init__(self, kid=new_kid)
3471
+ AstNode.set_kids(self, nodes=new_kid)
3431
3472
  return res
3432
3473
 
3433
3474
 
@@ -3454,7 +3495,7 @@ class MatchOr(MatchPattern):
3454
3495
  new_kid.append(pattern)
3455
3496
  new_kid.append(self.gen_token(Tok.KW_OR))
3456
3497
  new_kid.pop()
3457
- AstNode.__init__(self, kid=new_kid)
3498
+ AstNode.set_kids(self, nodes=new_kid)
3458
3499
  return res
3459
3500
 
3460
3501
 
@@ -3483,7 +3524,7 @@ class MatchAs(MatchPattern):
3483
3524
  new_kid.append(self.pattern)
3484
3525
  new_kid.append(self.gen_token(Tok.KW_AS))
3485
3526
  new_kid.append(self.name)
3486
- AstNode.__init__(self, kid=new_kid)
3527
+ AstNode.set_kids(self, nodes=new_kid)
3487
3528
  return res
3488
3529
 
3489
3530
 
@@ -3492,9 +3533,9 @@ class MatchWild(MatchPattern):
3492
3533
 
3493
3534
  def normalize(self, deep: bool = False) -> bool:
3494
3535
  """Normalize match wild card node."""
3495
- AstNode.__init__(
3536
+ AstNode.set_kids(
3496
3537
  self,
3497
- kid=[
3538
+ nodes=[
3498
3539
  Name(
3499
3540
  file_path=self.loc.mod_path,
3500
3541
  name=Tok.NAME,
@@ -3527,7 +3568,7 @@ class MatchValue(MatchPattern):
3527
3568
  res = True
3528
3569
  if deep:
3529
3570
  res = self.value.normalize(deep)
3530
- AstNode.__init__(self, kid=[self.value])
3571
+ AstNode.set_kids(self, nodes=[self.value])
3531
3572
  return res
3532
3573
 
3533
3574
 
@@ -3546,7 +3587,7 @@ class MatchSingleton(MatchPattern):
3546
3587
  def normalize(self, deep: bool = False) -> bool:
3547
3588
  """Normalize match singleton node."""
3548
3589
  res = True
3549
- AstNode.__init__(self, kid=[self.value])
3590
+ AstNode.set_kids(self, nodes=[self.value])
3550
3591
  return res
3551
3592
 
3552
3593
 
@@ -3574,7 +3615,7 @@ class MatchSequence(MatchPattern):
3574
3615
  new_kid.append(self.gen_token(Tok.COMMA))
3575
3616
  new_kid.pop()
3576
3617
  new_kid.append(self.gen_token(Tok.RSQUARE))
3577
- AstNode.__init__(self, kid=new_kid)
3618
+ AstNode.set_kids(self, nodes=new_kid)
3578
3619
  return res
3579
3620
 
3580
3621
 
@@ -3602,7 +3643,7 @@ class MatchMapping(MatchPattern):
3602
3643
  new_kid.append(self.gen_token(Tok.COMMA))
3603
3644
  new_kid.pop()
3604
3645
  new_kid.append(self.gen_token(Tok.RBRACE))
3605
- AstNode.__init__(self, kid=new_kid)
3646
+ AstNode.set_kids(self, nodes=new_kid)
3606
3647
  return res
3607
3648
 
3608
3649
 
@@ -3628,8 +3669,9 @@ class MatchKVPair(MatchPattern):
3628
3669
  self.key.normalize(deep) if isinstance(self.key, MatchPattern) else True
3629
3670
  )
3630
3671
  res = res and self.value.normalize(deep)
3631
- new_kid: list[AstNode] = [self.key, self.gen_token(Tok.COLON), self.value]
3632
- AstNode.__init__(self, kid=new_kid)
3672
+ op = Tok.EQ if isinstance(self.key, Name) else Tok.COLON
3673
+ new_kid: list[AstNode] = [self.key, self.gen_token(op), self.value]
3674
+ AstNode.set_kids(self, nodes=new_kid)
3633
3675
  return res
3634
3676
 
3635
3677
 
@@ -3656,7 +3698,7 @@ class MatchStar(MatchPattern):
3656
3698
  self.gen_token(Tok.STAR_MUL if self.is_list else Tok.STAR_POW)
3657
3699
  ]
3658
3700
  new_kid.append(self.name)
3659
- AstNode.__init__(self, kid=new_kid)
3701
+ AstNode.set_kids(self, nodes=new_kid)
3660
3702
  return res
3661
3703
 
3662
3704
 
@@ -3693,7 +3735,7 @@ class MatchArch(MatchPattern):
3693
3735
  else:
3694
3736
  new_kid.pop()
3695
3737
  new_kid.append(self.gen_token(Tok.RPAREN))
3696
- AstNode.__init__(self, kid=new_kid)
3738
+ AstNode.set_kids(self, nodes=new_kid)
3697
3739
  return res
3698
3740
 
3699
3741
 
@@ -3913,6 +3955,8 @@ class String(Literal):
3913
3955
  @property
3914
3956
  def lit_value(self) -> str:
3915
3957
  """Return literal value in its python type."""
3958
+ if isinstance(self.value, bytes):
3959
+ return self.value
3916
3960
  prefix_len = 3 if self.value.startswith(("'''", '"""')) else 1
3917
3961
  if any(
3918
3962
  self.value.startswith(prefix)
@@ -3923,13 +3967,13 @@ class String(Literal):
3923
3967
 
3924
3968
  elif self.value.startswith(("'", '"')):
3925
3969
  ret_str = self.value[prefix_len:-prefix_len]
3970
+ return ret_str.encode().decode("unicode_escape", errors="backslashreplace")
3926
3971
  else:
3927
- ret_str = self.value
3928
- ret_str = ret_str.encode().decode("unicode_escape")
3929
- return ret_str
3972
+ return self.value
3930
3973
 
3931
3974
  def normalize(self, deep: bool = True) -> bool:
3932
3975
  """Normalize string."""
3976
+ self.value = r"%s" % self.value
3933
3977
  return True
3934
3978
 
3935
3979
  def unparse(self) -> str: