jaclang 0.5.10__py3-none-any.whl → 0.5.15__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (41) hide show
  1. jaclang/cli/cli.py +20 -0
  2. jaclang/compiler/__init__.py +35 -19
  3. jaclang/compiler/absyntree.py +103 -95
  4. jaclang/compiler/generated/jac_parser.py +4069 -0
  5. jaclang/compiler/jac.lark +655 -0
  6. jaclang/compiler/parser.py +44 -31
  7. jaclang/compiler/passes/main/fuse_typeinfo_pass.py +92 -37
  8. jaclang/compiler/passes/main/import_pass.py +9 -5
  9. jaclang/compiler/passes/main/pyast_gen_pass.py +512 -352
  10. jaclang/compiler/passes/main/pyast_load_pass.py +271 -64
  11. jaclang/compiler/passes/main/registry_pass.py +3 -7
  12. jaclang/compiler/passes/main/tests/test_pyast_gen_pass.py +2 -0
  13. jaclang/compiler/passes/main/type_check_pass.py +4 -1
  14. jaclang/compiler/passes/tool/jac_formatter_pass.py +7 -0
  15. jaclang/compiler/passes/tool/tests/test_unparse_validate.py +16 -0
  16. jaclang/compiler/passes/utils/mypy_ast_build.py +93 -0
  17. jaclang/compiler/tests/test_importer.py +15 -0
  18. jaclang/core/aott.py +4 -3
  19. jaclang/core/construct.py +1 -1
  20. jaclang/core/importer.py +109 -51
  21. jaclang/core/llms.py +29 -0
  22. jaclang/core/registry.py +22 -0
  23. jaclang/core/utils.py +72 -0
  24. jaclang/plugin/default.py +118 -6
  25. jaclang/plugin/feature.py +29 -2
  26. jaclang/plugin/spec.py +25 -2
  27. jaclang/utils/helpers.py +7 -9
  28. jaclang/utils/lang_tools.py +37 -13
  29. jaclang/utils/test.py +1 -3
  30. jaclang/utils/tests/test_lang_tools.py +6 -0
  31. jaclang/vendor/lark/grammars/common.lark +59 -0
  32. jaclang/vendor/lark/grammars/lark.lark +62 -0
  33. jaclang/vendor/lark/grammars/python.lark +302 -0
  34. jaclang/vendor/lark/grammars/unicode.lark +7 -0
  35. {jaclang-0.5.10.dist-info → jaclang-0.5.15.dist-info}/METADATA +1 -1
  36. {jaclang-0.5.10.dist-info → jaclang-0.5.15.dist-info}/RECORD +40 -34
  37. jaclang/compiler/__jac_gen__/jac_parser.py +0 -4069
  38. /jaclang/compiler/{__jac_gen__ → generated}/__init__.py +0 -0
  39. {jaclang-0.5.10.dist-info → jaclang-0.5.15.dist-info}/WHEEL +0 -0
  40. {jaclang-0.5.10.dist-info → jaclang-0.5.15.dist-info}/entry_points.txt +0 -0
  41. {jaclang-0.5.10.dist-info → jaclang-0.5.15.dist-info}/top_level.txt +0 -0
@@ -327,7 +327,7 @@ class SubTag(AstNode, Generic[T]):
327
327
  def normalize(self, deep: bool = False) -> bool:
328
328
  """Normalize sub tag node."""
329
329
  res = self.tag.normalize() if deep else True
330
- AstNode.set_kids(self, nodes=[self.gen_token(Tok.COLON), self.tag])
330
+ self.set_kids(nodes=[self.gen_token(Tok.COLON), self.tag])
331
331
  return res
332
332
 
333
333
 
@@ -370,7 +370,7 @@ class SubNodeList(AstNode, Generic[T]):
370
370
  new_kid.pop()
371
371
  if self.right_enc:
372
372
  new_kid.append(self.right_enc)
373
- AstNode.set_kids(self, nodes=new_kid if len(new_kid) else [EmptyToken()])
373
+ self.set_kids(nodes=new_kid if len(new_kid) else [EmptyToken()])
374
374
  return res
375
375
 
376
376
 
@@ -414,7 +414,7 @@ class Module(AstDocNode):
414
414
  if self.doc:
415
415
  new_kid.append(self.doc)
416
416
  new_kid.extend(self.body)
417
- AstNode.set_kids(self, nodes=new_kid)
417
+ self.set_kids(nodes=new_kid)
418
418
  return res
419
419
 
420
420
  def unparse(self) -> str:
@@ -458,7 +458,7 @@ class GlobalVars(ElementStmt, AstAccessNode):
458
458
  if self.access:
459
459
  new_kid.append(self.access)
460
460
  new_kid.append(self.assignments)
461
- AstNode.set_kids(self, nodes=new_kid)
461
+ self.set_kids(nodes=new_kid)
462
462
  return res
463
463
 
464
464
 
@@ -517,7 +517,7 @@ class Test(AstSymbolNode, ElementStmt):
517
517
  new_kid.append(self.gen_token(Tok.KW_TEST))
518
518
  new_kid.append(self.name)
519
519
  new_kid.append(self.body)
520
- AstNode.set_kids(self, nodes=new_kid)
520
+ self.set_kids(nodes=new_kid)
521
521
  return res
522
522
 
523
523
 
@@ -552,7 +552,7 @@ class ModuleCode(ElementStmt, ArchBlockStmt, EnumBlockStmt):
552
552
  if self.name:
553
553
  new_kid.append(self.name)
554
554
  new_kid.append(self.body)
555
- AstNode.set_kids(self, nodes=new_kid)
555
+ self.set_kids(nodes=new_kid)
556
556
  return res
557
557
 
558
558
 
@@ -582,7 +582,7 @@ class PyInlineCode(ElementStmt, ArchBlockStmt, EnumBlockStmt, CodeBlockStmt):
582
582
  new_kid.append(self.gen_token(Tok.PYNLINE))
583
583
  new_kid.append(self.code)
584
584
  new_kid.append(self.gen_token(Tok.PYNLINE))
585
- AstNode.set_kids(self, nodes=new_kid)
585
+ self.set_kids(nodes=new_kid)
586
586
  return res
587
587
 
588
588
 
@@ -633,7 +633,7 @@ class Import(ElementStmt, CodeBlockStmt):
633
633
  new_kid.append(self.gen_token(Tok.COMMA))
634
634
  new_kid.append(self.items)
635
635
  new_kid.append(self.gen_token(Tok.SEMI))
636
- AstNode.set_kids(self, nodes=new_kid)
636
+ self.set_kids(nodes=new_kid)
637
637
  return res
638
638
 
639
639
 
@@ -682,7 +682,7 @@ class ModulePath(AstSymbolNode):
682
682
  if self.alias:
683
683
  res = res and self.alias.normalize(deep)
684
684
  new_kid.append(self.alias)
685
- AstNode.set_kids(self, nodes=new_kid)
685
+ self.set_kids(nodes=new_kid)
686
686
  return res
687
687
 
688
688
  @property
@@ -723,7 +723,7 @@ class ModuleItem(AstSymbolNode):
723
723
  if self.alias:
724
724
  new_kid.append(self.gen_token(Tok.KW_AS))
725
725
  new_kid.append(self.alias)
726
- AstNode.set_kids(self, nodes=new_kid)
726
+ self.set_kids(nodes=new_kid)
727
727
  return res
728
728
 
729
729
 
@@ -822,7 +822,7 @@ class Architype(ArchSpec, AstAccessNode, ArchBlockStmt, AstImplNeedingNode):
822
822
  new_kid.append(self.body)
823
823
  else:
824
824
  new_kid.append(self.gen_token(Tok.SEMI))
825
- AstNode.set_kids(self, nodes=new_kid)
825
+ self.set_kids(nodes=new_kid)
826
826
  return res
827
827
 
828
828
 
@@ -864,7 +864,7 @@ class ArchDef(ArchSpec, AstImplOnlyNode):
864
864
  new_kid.append(self.doc)
865
865
  new_kid.append(self.target)
866
866
  new_kid.append(self.body)
867
- AstNode.set_kids(self, nodes=new_kid)
867
+ self.set_kids(nodes=new_kid)
868
868
  return res
869
869
 
870
870
 
@@ -933,7 +933,7 @@ class Enum(ArchSpec, AstAccessNode, AstImplNeedingNode, ArchBlockStmt):
933
933
  new_kid.append(self.gen_token(Tok.RBRACE))
934
934
  else:
935
935
  new_kid.append(self.gen_token(Tok.SEMI))
936
- AstNode.set_kids(self, nodes=new_kid)
936
+ self.set_kids(nodes=new_kid)
937
937
  return res
938
938
 
939
939
 
@@ -977,7 +977,7 @@ class EnumDef(ArchSpec, AstImplOnlyNode):
977
977
  new_kid.append(self.gen_token(Tok.LBRACE))
978
978
  new_kid.append(self.body)
979
979
  new_kid.append(self.gen_token(Tok.RBRACE))
980
- AstNode.set_kids(self, nodes=new_kid)
980
+ self.set_kids(nodes=new_kid)
981
981
  return res
982
982
 
983
983
 
@@ -1101,7 +1101,7 @@ class Ability(
1101
1101
  new_kid.append(self.gen_token(Tok.SEMI))
1102
1102
  else:
1103
1103
  new_kid.append(self.gen_token(Tok.SEMI))
1104
- AstNode.set_kids(self, nodes=new_kid)
1104
+ self.set_kids(nodes=new_kid)
1105
1105
  return res
1106
1106
 
1107
1107
 
@@ -1149,7 +1149,7 @@ class AbilityDef(AstSymbolNode, ElementStmt, AstImplOnlyNode, CodeBlockStmt):
1149
1149
 
1150
1150
  new_kid.append(self.body)
1151
1151
 
1152
- AstNode.set_kids(self, nodes=new_kid)
1152
+ self.set_kids(nodes=new_kid)
1153
1153
  return res
1154
1154
 
1155
1155
  @property
@@ -1194,7 +1194,7 @@ class FuncSignature(AstSemStrNode):
1194
1194
  new_kid.append(self.semstr)
1195
1195
  new_kid.append(self.gen_token(Tok.COLON))
1196
1196
  new_kid.append(self.return_type)
1197
- AstNode.set_kids(self, nodes=new_kid)
1197
+ self.set_kids(nodes=new_kid)
1198
1198
  return res
1199
1199
 
1200
1200
  @property
@@ -1253,7 +1253,7 @@ class EventSignature(AstSemStrNode):
1253
1253
  new_kid.append(self.semstr)
1254
1254
  new_kid.append(self.gen_token(Tok.RETURN_HINT))
1255
1255
  new_kid.append(self.return_type)
1256
- AstNode.set_kids(self, nodes=new_kid)
1256
+ self.set_kids(nodes=new_kid)
1257
1257
  return res
1258
1258
 
1259
1259
  @property
@@ -1289,7 +1289,7 @@ class ArchRefChain(AstNode):
1289
1289
  new_kid: list[AstNode] = []
1290
1290
  for a in self.archs:
1291
1291
  new_kid.append(a)
1292
- AstNode.set_kids(self, nodes=new_kid)
1292
+ self.set_kids(nodes=new_kid)
1293
1293
  return res
1294
1294
 
1295
1295
  def py_resolve_name(self) -> str:
@@ -1358,7 +1358,7 @@ class ParamVar(AstSymbolNode, AstTypedVarNode, AstSemStrNode):
1358
1358
  if self.value:
1359
1359
  new_kid.append(self.gen_token(Tok.EQ))
1360
1360
  new_kid.append(self.value)
1361
- AstNode.set_kids(self, nodes=new_kid)
1361
+ self.set_kids(nodes=new_kid)
1362
1362
  return res
1363
1363
 
1364
1364
 
@@ -1403,7 +1403,7 @@ class ArchHas(AstAccessNode, AstDocNode, ArchBlockStmt):
1403
1403
  new_kid.append(self.access)
1404
1404
  new_kid.append(self.vars)
1405
1405
  new_kid.append(self.gen_token(Tok.SEMI))
1406
- AstNode.set_kids(self, nodes=new_kid)
1406
+ self.set_kids(nodes=new_kid)
1407
1407
  return res
1408
1408
 
1409
1409
 
@@ -1453,7 +1453,7 @@ class HasVar(AstSymbolNode, AstTypedVarNode, AstSemStrNode):
1453
1453
  if self.defer:
1454
1454
  new_kid.append(self.gen_token(Tok.KW_BY))
1455
1455
  new_kid.append(self.gen_token(Tok.KW_POST_INIT))
1456
- AstNode.set_kids(self, nodes=new_kid)
1456
+ self.set_kids(nodes=new_kid)
1457
1457
  return res
1458
1458
 
1459
1459
 
@@ -1482,7 +1482,7 @@ class TypedCtxBlock(CodeBlockStmt):
1482
1482
  self.type_ctx,
1483
1483
  self.body,
1484
1484
  ]
1485
- AstNode.set_kids(self, nodes=new_kid)
1485
+ self.set_kids(nodes=new_kid)
1486
1486
  return res
1487
1487
 
1488
1488
 
@@ -1516,7 +1516,7 @@ class IfStmt(CodeBlockStmt, AstElseBodyNode):
1516
1516
  ]
1517
1517
  if self.else_body:
1518
1518
  new_kid.append(self.else_body)
1519
- AstNode.set_kids(self, nodes=new_kid)
1519
+ self.set_kids(nodes=new_kid)
1520
1520
  return res
1521
1521
 
1522
1522
 
@@ -1537,7 +1537,7 @@ class ElseIf(IfStmt):
1537
1537
  ]
1538
1538
  if self.else_body:
1539
1539
  new_kid.append(self.else_body)
1540
- AstNode.set_kids(self, nodes=new_kid)
1540
+ self.set_kids(nodes=new_kid)
1541
1541
  return res
1542
1542
 
1543
1543
 
@@ -1562,7 +1562,7 @@ class ElseStmt(AstNode):
1562
1562
  self.gen_token(Tok.KW_ELSE),
1563
1563
  self.body,
1564
1564
  ]
1565
- AstNode.set_kids(self, nodes=new_kid)
1565
+ self.set_kids(nodes=new_kid)
1566
1566
  return res
1567
1567
 
1568
1568
 
@@ -1590,7 +1590,7 @@ class ExprStmt(CodeBlockStmt):
1590
1590
  else:
1591
1591
  new_kid.append(self.expr)
1592
1592
  new_kid.append(self.gen_token(Tok.SEMI))
1593
- AstNode.set_kids(self, nodes=new_kid)
1593
+ self.set_kids(nodes=new_kid)
1594
1594
  return res and self.expr is not None
1595
1595
 
1596
1596
 
@@ -1632,7 +1632,7 @@ class TryStmt(AstElseBodyNode, CodeBlockStmt):
1632
1632
  new_kid.append(self.else_body)
1633
1633
  if self.finally_body:
1634
1634
  new_kid.append(self.finally_body)
1635
- AstNode.set_kids(self, nodes=new_kid)
1635
+ self.set_kids(nodes=new_kid)
1636
1636
  return res
1637
1637
 
1638
1638
 
@@ -1667,7 +1667,7 @@ class Except(CodeBlockStmt):
1667
1667
  new_kid.append(self.gen_token(Tok.KW_AS))
1668
1668
  new_kid.append(self.name)
1669
1669
  new_kid.append(self.body)
1670
- AstNode.set_kids(self, nodes=new_kid)
1670
+ self.set_kids(nodes=new_kid)
1671
1671
  return res
1672
1672
 
1673
1673
 
@@ -1692,7 +1692,7 @@ class FinallyStmt(CodeBlockStmt):
1692
1692
  self.gen_token(Tok.KW_FINALLY),
1693
1693
  ]
1694
1694
  new_kid.append(self.body)
1695
- AstNode.set_kids(self, nodes=new_kid)
1695
+ self.set_kids(nodes=new_kid)
1696
1696
  return res
1697
1697
 
1698
1698
 
@@ -1739,7 +1739,7 @@ class IterForStmt(AstAsyncNode, AstElseBodyNode, CodeBlockStmt):
1739
1739
  new_kid.append(self.body)
1740
1740
  if self.else_body:
1741
1741
  new_kid.append(self.else_body)
1742
- AstNode.set_kids(self, nodes=new_kid)
1742
+ self.set_kids(nodes=new_kid)
1743
1743
  return res
1744
1744
 
1745
1745
 
@@ -1783,7 +1783,7 @@ class InForStmt(AstAsyncNode, AstElseBodyNode, CodeBlockStmt):
1783
1783
  new_kid.append(self.body)
1784
1784
  if self.else_body:
1785
1785
  new_kid.append(self.else_body)
1786
- AstNode.set_kids(self, nodes=new_kid)
1786
+ self.set_kids(nodes=new_kid)
1787
1787
  return res
1788
1788
 
1789
1789
 
@@ -1813,7 +1813,7 @@ class WhileStmt(CodeBlockStmt):
1813
1813
  ]
1814
1814
  if self.body:
1815
1815
  new_kid.append(self.body)
1816
- AstNode.set_kids(self, nodes=new_kid)
1816
+ self.set_kids(nodes=new_kid)
1817
1817
  return res
1818
1818
 
1819
1819
 
@@ -1848,7 +1848,7 @@ class WithStmt(AstAsyncNode, CodeBlockStmt):
1848
1848
  new_kid.append(self.body)
1849
1849
  new_kid.append(self.gen_token(Tok.RBRACE))
1850
1850
 
1851
- AstNode.set_kids(self, nodes=new_kid)
1851
+ self.set_kids(nodes=new_kid)
1852
1852
  return res
1853
1853
 
1854
1854
 
@@ -1876,7 +1876,7 @@ class ExprAsItem(AstNode):
1876
1876
  if self.alias:
1877
1877
  new_kid.append(self.gen_token(Tok.KW_AS))
1878
1878
  new_kid.append(self.alias)
1879
- AstNode.set_kids(self, nodes=new_kid)
1879
+ self.set_kids(nodes=new_kid)
1880
1880
  return res
1881
1881
 
1882
1882
 
@@ -1907,7 +1907,7 @@ class RaiseStmt(CodeBlockStmt):
1907
1907
  new_kid.append(self.gen_token(Tok.KW_FROM))
1908
1908
  new_kid.append(self.from_target)
1909
1909
  new_kid.append(self.gen_token(Tok.SEMI))
1910
- AstNode.set_kids(self, nodes=new_kid)
1910
+ self.set_kids(nodes=new_kid)
1911
1911
  return res
1912
1912
 
1913
1913
 
@@ -1939,7 +1939,7 @@ class AssertStmt(CodeBlockStmt):
1939
1939
  new_kid.append(self.gen_token(Tok.COMMA))
1940
1940
  new_kid.append(self.error_msg)
1941
1941
  new_kid.append(self.gen_token(Tok.SEMI))
1942
- AstNode.set_kids(self, nodes=new_kid)
1942
+ self.set_kids(nodes=new_kid)
1943
1943
  return res
1944
1944
 
1945
1945
 
@@ -1961,7 +1961,7 @@ class CtrlStmt(CodeBlockStmt):
1961
1961
  if deep:
1962
1962
  res = self.ctrl.normalize(deep)
1963
1963
  new_kid: list[AstNode] = [self.ctrl, self.gen_token(Tok.SEMI)]
1964
- AstNode.set_kids(self, nodes=new_kid)
1964
+ self.set_kids(nodes=new_kid)
1965
1965
  return res
1966
1966
 
1967
1967
 
@@ -1987,7 +1987,7 @@ class DeleteStmt(CodeBlockStmt):
1987
1987
  self.target,
1988
1988
  self.gen_token(Tok.SEMI),
1989
1989
  ]
1990
- AstNode.set_kids(self, nodes=new_kid)
1990
+ self.set_kids(nodes=new_kid)
1991
1991
  return res
1992
1992
 
1993
1993
 
@@ -2013,7 +2013,7 @@ class ReportStmt(CodeBlockStmt):
2013
2013
  self.expr,
2014
2014
  self.gen_token(Tok.SEMI),
2015
2015
  ]
2016
- AstNode.set_kids(self, nodes=new_kid)
2016
+ self.set_kids(nodes=new_kid)
2017
2017
  return res
2018
2018
 
2019
2019
 
@@ -2040,7 +2040,7 @@ class ReturnStmt(CodeBlockStmt):
2040
2040
  if self.expr:
2041
2041
  new_kid.append(self.expr)
2042
2042
  new_kid.append(self.gen_token(Tok.SEMI))
2043
- AstNode.set_kids(self, nodes=new_kid)
2043
+ self.set_kids(nodes=new_kid)
2044
2044
  return res
2045
2045
 
2046
2046
 
@@ -2067,7 +2067,7 @@ class IgnoreStmt(WalkerStmtOnlyNode, CodeBlockStmt):
2067
2067
  self.target,
2068
2068
  self.gen_token(Tok.SEMI),
2069
2069
  ]
2070
- AstNode.set_kids(self, nodes=new_kid)
2070
+ self.set_kids(nodes=new_kid)
2071
2071
  return res
2072
2072
 
2073
2073
 
@@ -2106,7 +2106,7 @@ class VisitStmt(WalkerStmtOnlyNode, AstElseBodyNode, CodeBlockStmt):
2106
2106
  new_kid.append(self.else_body)
2107
2107
  else:
2108
2108
  new_kid.append(self.gen_token(Tok.SEMI))
2109
- AstNode.set_kids(self, nodes=new_kid)
2109
+ self.set_kids(nodes=new_kid)
2110
2110
  return res
2111
2111
 
2112
2112
 
@@ -2137,7 +2137,7 @@ class RevisitStmt(WalkerStmtOnlyNode, AstElseBodyNode, CodeBlockStmt):
2137
2137
  if self.else_body:
2138
2138
  new_kid.append(self.else_body)
2139
2139
  new_kid.append(self.gen_token(Tok.SEMI))
2140
- AstNode.set_kids(self, nodes=new_kid)
2140
+ self.set_kids(nodes=new_kid)
2141
2141
  return res
2142
2142
 
2143
2143
 
@@ -2158,7 +2158,7 @@ class DisengageStmt(WalkerStmtOnlyNode, CodeBlockStmt):
2158
2158
  self.gen_token(Tok.KW_DISENGAGE),
2159
2159
  self.gen_token(Tok.SEMI),
2160
2160
  ]
2161
- AstNode.set_kids(self, nodes=new_kid)
2161
+ self.set_kids(nodes=new_kid)
2162
2162
  return True
2163
2163
 
2164
2164
 
@@ -2183,7 +2183,7 @@ class AwaitExpr(Expr):
2183
2183
  self.gen_token(Tok.KW_AWAIT),
2184
2184
  self.target,
2185
2185
  ]
2186
- AstNode.set_kids(self, nodes=new_kid)
2186
+ self.set_kids(nodes=new_kid)
2187
2187
  return res
2188
2188
 
2189
2189
 
@@ -2209,7 +2209,7 @@ class GlobalStmt(CodeBlockStmt):
2209
2209
  self.target,
2210
2210
  self.gen_token(Tok.SEMI),
2211
2211
  ]
2212
- AstNode.set_kids(self, nodes=new_kid)
2212
+ self.set_kids(nodes=new_kid)
2213
2213
  return res
2214
2214
 
2215
2215
 
@@ -2226,7 +2226,7 @@ class NonLocalStmt(GlobalStmt):
2226
2226
  self.target,
2227
2227
  self.gen_token(Tok.SEMI),
2228
2228
  ]
2229
- AstNode.set_kids(self, nodes=new_kid)
2229
+ self.set_kids(nodes=new_kid)
2230
2230
  return res
2231
2231
 
2232
2232
 
@@ -2282,7 +2282,7 @@ class Assignment(AstSemStrNode, AstTypedVarNode, EnumBlockStmt, CodeBlockStmt):
2282
2282
  new_kid.append(self.gen_token(Tok.SEMI))
2283
2283
  elif (not self.is_enum_stmt) and not isinstance(self.parent, IterForStmt):
2284
2284
  new_kid.append(self.gen_token(Tok.SEMI))
2285
- AstNode.set_kids(self, nodes=new_kid)
2285
+ self.set_kids(nodes=new_kid)
2286
2286
  return res
2287
2287
 
2288
2288
 
@@ -2316,7 +2316,7 @@ class BinaryExpr(Expr):
2316
2316
  self.right,
2317
2317
  self.gen_token(Tok.RPAREN),
2318
2318
  ]
2319
- AstNode.set_kids(self, nodes=new_kid)
2319
+ self.set_kids(nodes=new_kid)
2320
2320
  return res
2321
2321
 
2322
2322
 
@@ -2349,7 +2349,7 @@ class CompareExpr(Expr):
2349
2349
  for i, right in enumerate(self.rights):
2350
2350
  new_kid.append(self.ops[i])
2351
2351
  new_kid.append(right)
2352
- AstNode.set_kids(self, nodes=new_kid)
2352
+ self.set_kids(nodes=new_kid)
2353
2353
  return res
2354
2354
 
2355
2355
 
@@ -2379,7 +2379,7 @@ class BoolExpr(Expr):
2379
2379
  if i > 0:
2380
2380
  new_kid.append(self.op)
2381
2381
  new_kid.append(value)
2382
- AstNode.set_kids(self, nodes=new_kid)
2382
+ self.set_kids(nodes=new_kid)
2383
2383
  return res
2384
2384
 
2385
2385
 
@@ -2410,7 +2410,7 @@ class LambdaExpr(Expr):
2410
2410
  self.body,
2411
2411
  self.gen_token(Tok.SEMI),
2412
2412
  ]
2413
- AstNode.set_kids(self, nodes=new_kid)
2413
+ self.set_kids(nodes=new_kid)
2414
2414
  return res
2415
2415
 
2416
2416
 
@@ -2435,7 +2435,7 @@ class UnaryExpr(Expr):
2435
2435
  res = self.operand.normalize(deep)
2436
2436
  res = res and self.op.normalize(deep) if self.op else res
2437
2437
  new_kid: list[AstNode] = [self.op, self.operand]
2438
- AstNode.set_kids(self, nodes=new_kid)
2438
+ self.set_kids(nodes=new_kid)
2439
2439
  return res
2440
2440
 
2441
2441
 
@@ -2469,7 +2469,7 @@ class IfElseExpr(Expr):
2469
2469
  self.gen_token(Tok.KW_ELSE),
2470
2470
  self.else_value,
2471
2471
  ]
2472
- AstNode.set_kids(self, nodes=new_kid)
2472
+ self.set_kids(nodes=new_kid)
2473
2473
  return res
2474
2474
 
2475
2475
 
@@ -2500,7 +2500,7 @@ class MultiString(AtomExpr):
2500
2500
  new_kid: list[AstNode] = []
2501
2501
  for string in self.strings:
2502
2502
  new_kid.append(string)
2503
- AstNode.set_kids(self, nodes=new_kid)
2503
+ self.set_kids(nodes=new_kid)
2504
2504
  return res
2505
2505
 
2506
2506
 
@@ -2535,7 +2535,7 @@ class FString(AtomExpr):
2535
2535
  "{{" if i.value == "{" else "}}" if i.value == "}" else i.value
2536
2536
  )
2537
2537
  new_kid.append(self.parts)
2538
- AstNode.set_kids(self, nodes=new_kid)
2538
+ self.set_kids(nodes=new_kid)
2539
2539
  return res
2540
2540
 
2541
2541
 
@@ -2568,7 +2568,7 @@ class ListVal(AtomExpr):
2568
2568
  if self.values:
2569
2569
  new_kid.append(self.values)
2570
2570
  new_kid.append(self.gen_token(Tok.RSQUARE))
2571
- AstNode.set_kids(self, nodes=new_kid)
2571
+ self.set_kids(nodes=new_kid)
2572
2572
  return res
2573
2573
 
2574
2574
 
@@ -2601,7 +2601,7 @@ class SetVal(AtomExpr):
2601
2601
  if self.values:
2602
2602
  new_kid.append(self.values)
2603
2603
  new_kid.append(self.gen_token(Tok.RBRACE))
2604
- AstNode.set_kids(self, nodes=new_kid)
2604
+ self.set_kids(nodes=new_kid)
2605
2605
  return res
2606
2606
 
2607
2607
 
@@ -2649,7 +2649,7 @@ class TupleVal(AtomExpr):
2649
2649
  new_kid.append(self.gen_token(Tok.COMMA))
2650
2650
  if not in_ret_type:
2651
2651
  new_kid.append(self.gen_token(Tok.RPAREN))
2652
- AstNode.set_kids(self, nodes=new_kid)
2652
+ self.set_kids(nodes=new_kid)
2653
2653
  return res
2654
2654
 
2655
2655
 
@@ -2685,7 +2685,7 @@ class DictVal(AtomExpr):
2685
2685
  if i < len(self.kv_pairs) - 1:
2686
2686
  new_kid.append(self.gen_token(Tok.COMMA))
2687
2687
  new_kid.append(self.gen_token(Tok.RBRACE))
2688
- AstNode.set_kids(self, nodes=new_kid)
2688
+ self.set_kids(nodes=new_kid)
2689
2689
  return res
2690
2690
 
2691
2691
 
@@ -2716,7 +2716,7 @@ class KVPair(AstNode):
2716
2716
  else:
2717
2717
  new_kid.append(self.gen_token(Tok.STAR_POW))
2718
2718
  new_kid.append(self.value)
2719
- AstNode.set_kids(self, nodes=new_kid)
2719
+ self.set_kids(nodes=new_kid)
2720
2720
  return res
2721
2721
 
2722
2722
 
@@ -2745,7 +2745,7 @@ class KWPair(AstNode):
2745
2745
  new_kid.append(self.key)
2746
2746
  new_kid.append(self.gen_token(Tok.EQ))
2747
2747
  new_kid.append(self.value)
2748
- AstNode.set_kids(self, nodes=new_kid)
2748
+ self.set_kids(nodes=new_kid)
2749
2749
  return res
2750
2750
 
2751
2751
 
@@ -2785,7 +2785,7 @@ class InnerCompr(AstAsyncNode):
2785
2785
  for cond in self.conditional if self.conditional else []:
2786
2786
  new_kid.append(self.gen_token(Tok.KW_IF))
2787
2787
  new_kid.append(cond)
2788
- AstNode.set_kids(self, nodes=new_kid)
2788
+ self.set_kids(nodes=new_kid)
2789
2789
  return res
2790
2790
 
2791
2791
 
@@ -2823,7 +2823,7 @@ class ListCompr(AtomExpr):
2823
2823
  for comp in self.compr:
2824
2824
  new_kid.append(comp)
2825
2825
  new_kid.append(self.gen_token(Tok.RSQUARE))
2826
- AstNode.set_kids(self, nodes=new_kid)
2826
+ self.set_kids(nodes=new_kid)
2827
2827
  return res
2828
2828
 
2829
2829
 
@@ -2844,7 +2844,7 @@ class GenCompr(ListCompr):
2844
2844
  for comp in self.compr:
2845
2845
  new_kid.append(comp)
2846
2846
  new_kid.append(self.gen_token(Tok.RPAREN))
2847
- AstNode.set_kids(self, nodes=new_kid)
2847
+ self.set_kids(nodes=new_kid)
2848
2848
  return res
2849
2849
 
2850
2850
 
@@ -2865,7 +2865,7 @@ class SetCompr(ListCompr):
2865
2865
  for comp in self.compr:
2866
2866
  new_kid.append(comp)
2867
2867
  new_kid.append(self.gen_token(Tok.RBRACE))
2868
- AstNode.set_kids(self, nodes=new_kid)
2868
+ self.set_kids(nodes=new_kid)
2869
2869
  return res
2870
2870
 
2871
2871
 
@@ -2902,7 +2902,7 @@ class DictCompr(AtomExpr):
2902
2902
  for comp in self.compr:
2903
2903
  new_kid.append(comp)
2904
2904
  new_kid.append(self.gen_token(Tok.RBRACE))
2905
- AstNode.set_kids(self, nodes=new_kid)
2905
+ self.set_kids(nodes=new_kid)
2906
2906
  return res
2907
2907
 
2908
2908
 
@@ -2916,12 +2916,14 @@ class AtomTrailer(Expr):
2916
2916
  is_attr: bool,
2917
2917
  is_null_ok: bool,
2918
2918
  kid: Sequence[AstNode],
2919
+ is_genai: bool = False,
2919
2920
  ) -> None:
2920
2921
  """Initialize atom trailer expression node."""
2921
2922
  self.target = target
2922
2923
  self.right = right
2923
2924
  self.is_attr = is_attr
2924
2925
  self.is_null_ok = is_null_ok
2926
+ self.is_genai = is_genai
2925
2927
  AstNode.__init__(self, kid=kid)
2926
2928
 
2927
2929
  def normalize(self, deep: bool = True) -> bool:
@@ -2937,7 +2939,7 @@ class AtomTrailer(Expr):
2937
2939
  new_kid.append(self.gen_token(Tok.DOT))
2938
2940
  if self.right:
2939
2941
  new_kid.append(self.right)
2940
- AstNode.set_kids(self, nodes=new_kid)
2942
+ self.set_kids(nodes=new_kid)
2941
2943
  return res
2942
2944
 
2943
2945
 
@@ -2962,7 +2964,7 @@ class AtomUnit(Expr):
2962
2964
  new_kid.append(self.gen_token(Tok.LPAREN))
2963
2965
  new_kid.append(self.value)
2964
2966
  new_kid.append(self.gen_token(Tok.RPAREN))
2965
- AstNode.set_kids(self, nodes=new_kid)
2967
+ self.set_kids(nodes=new_kid)
2966
2968
  return res
2967
2969
 
2968
2970
 
@@ -2991,7 +2993,7 @@ class YieldExpr(Expr):
2991
2993
  if self.expr:
2992
2994
  new_kid.append(self.expr)
2993
2995
  new_kid.append(self.gen_token(Tok.SEMI))
2994
- AstNode.set_kids(self, nodes=new_kid)
2996
+ self.set_kids(nodes=new_kid)
2995
2997
  return res
2996
2998
 
2997
2999
 
@@ -3002,11 +3004,13 @@ class FuncCall(Expr):
3002
3004
  self,
3003
3005
  target: Expr,
3004
3006
  params: Optional[SubNodeList[Expr | KWPair]],
3007
+ genai_call: Optional[FuncCall],
3005
3008
  kid: Sequence[AstNode],
3006
3009
  ) -> None:
3007
3010
  """Initialize function call expression node."""
3008
3011
  self.target = target
3009
3012
  self.params = params
3013
+ self.genai_call = genai_call
3010
3014
  AstNode.__init__(self, kid=kid)
3011
3015
 
3012
3016
  def normalize(self, deep: bool = True) -> bool:
@@ -3014,10 +3018,14 @@ class FuncCall(Expr):
3014
3018
  if deep:
3015
3019
  res = self.target.normalize(deep)
3016
3020
  res = res and (not self.params or self.params.normalize(deep))
3017
- AstNode.__init__(self, kid=[self.target, self.gen_token(Tok.LPAREN, "(")])
3018
- if self.params: # TODO: Fix
3019
- self.kid.append(self.params)
3020
- self.kid.append(self.gen_token(Tok.RPAREN, ")"))
3021
+ new_kids = [self.target, self.gen_token(Tok.LPAREN, "(")]
3022
+ if self.params:
3023
+ new_kids.append(self.params)
3024
+ if self.genai_call:
3025
+ new_kids.append(self.gen_token(Tok.KW_BY))
3026
+ new_kids.append(self.genai_call)
3027
+ new_kids.append(self.gen_token(Tok.RPAREN, ")"))
3028
+ self.set_kids(nodes=new_kids)
3021
3029
  return res
3022
3030
 
3023
3031
 
@@ -3068,7 +3076,7 @@ class IndexSlice(AtomExpr):
3068
3076
  else:
3069
3077
  res = False
3070
3078
  new_kid.append(self.gen_token(Tok.RSQUARE))
3071
- AstNode.set_kids(self, nodes=new_kid)
3079
+ self.set_kids(nodes=new_kid)
3072
3080
  return res
3073
3081
 
3074
3082
 
@@ -3098,7 +3106,7 @@ class ArchRef(NameSpec):
3098
3106
  if deep:
3099
3107
  res = self.name_ref.normalize(deep)
3100
3108
  new_kid: list[AstNode] = [self.arch, self.name_ref]
3101
- AstNode.set_kids(self, nodes=new_kid)
3109
+ self.set_kids(nodes=new_kid)
3102
3110
  return res
3103
3111
 
3104
3112
  def py_resolve_name(self) -> str:
@@ -3135,7 +3143,7 @@ class SpecialVarRef(NameSpec):
3135
3143
  if deep:
3136
3144
  res = self.var.normalize(deep)
3137
3145
  new_kid: list[AstNode] = [self.var]
3138
- AstNode.set_kids(self, nodes=new_kid)
3146
+ self.set_kids(nodes=new_kid)
3139
3147
  return res
3140
3148
 
3141
3149
  def py_resolve_name(self) -> str:
@@ -3181,7 +3189,7 @@ class EdgeRefTrailer(Expr):
3181
3189
  new_kid.append(self.gen_token(Tok.LSQUARE))
3182
3190
  new_kid.extend(self.chain)
3183
3191
  new_kid.append(self.gen_token(Tok.RSQUARE))
3184
- AstNode.set_kids(self, nodes=new_kid)
3192
+ self.set_kids(nodes=new_kid)
3185
3193
  return res
3186
3194
 
3187
3195
 
@@ -3233,7 +3241,7 @@ class EdgeOpRef(WalkerStmtOnlyNode, AtomExpr):
3233
3241
  new_kid.append(self.gen_token(Tok.ARROW_L_P1))
3234
3242
  new_kid.append(self.filter_cond)
3235
3243
  new_kid.append(self.gen_token(Tok.ARROW_R_P2))
3236
- AstNode.set_kids(self, nodes=new_kid)
3244
+ self.set_kids(nodes=new_kid)
3237
3245
  return res
3238
3246
 
3239
3247
 
@@ -3256,7 +3264,7 @@ class DisconnectOp(WalkerStmtOnlyNode):
3256
3264
  if deep:
3257
3265
  res = self.edge_spec.normalize(deep)
3258
3266
  new_kid: list[AstNode] = [self.gen_token(Tok.KW_DELETE), self.edge_spec]
3259
- AstNode.set_kids(self, nodes=new_kid)
3267
+ self.set_kids(nodes=new_kid)
3260
3268
  return res
3261
3269
 
3262
3270
 
@@ -3316,7 +3324,7 @@ class ConnectOp(AstNode):
3316
3324
  new_kid.append(self.gen_token(Tok.COLON))
3317
3325
  new_kid.append(self.conn_assign)
3318
3326
  new_kid.append(self.gen_token(Tok.CARROW_R_P2))
3319
- AstNode.set_kids(self, nodes=new_kid)
3327
+ self.set_kids(nodes=new_kid)
3320
3328
  return res
3321
3329
 
3322
3330
 
@@ -3360,7 +3368,7 @@ class FilterCompr(AtomExpr):
3360
3368
  new_kid.append(self.compares)
3361
3369
  if not isinstance(self.parent, EdgeOpRef):
3362
3370
  new_kid.append(self.gen_token(Tok.RPAREN))
3363
- AstNode.set_kids(self, nodes=new_kid)
3371
+ self.set_kids(nodes=new_kid)
3364
3372
  return res
3365
3373
 
3366
3374
 
@@ -3395,7 +3403,7 @@ class AssignCompr(AtomExpr):
3395
3403
  new_kid.append(self.gen_token(Tok.EQ))
3396
3404
  new_kid.append(self.assigns)
3397
3405
  new_kid.append(self.gen_token(Tok.RPAREN))
3398
- AstNode.set_kids(self, nodes=new_kid)
3406
+ self.set_kids(nodes=new_kid)
3399
3407
  return res
3400
3408
 
3401
3409
 
@@ -3433,7 +3441,7 @@ class MatchStmt(CodeBlockStmt):
3433
3441
  new_kid.append(case)
3434
3442
  new_kid.append(self.gen_token(Tok.RBRACE))
3435
3443
 
3436
- AstNode.set_kids(self, nodes=new_kid)
3444
+ self.set_kids(nodes=new_kid)
3437
3445
  return res
3438
3446
 
3439
3447
 
@@ -3468,7 +3476,7 @@ class MatchCase(AstNode):
3468
3476
  new_kid.append(self.gen_token(Tok.COLON))
3469
3477
  if self.body:
3470
3478
  new_kid.extend([*self.body])
3471
- AstNode.set_kids(self, nodes=new_kid)
3479
+ self.set_kids(nodes=new_kid)
3472
3480
  return res
3473
3481
 
3474
3482
 
@@ -3495,7 +3503,7 @@ class MatchOr(MatchPattern):
3495
3503
  new_kid.append(pattern)
3496
3504
  new_kid.append(self.gen_token(Tok.KW_OR))
3497
3505
  new_kid.pop()
3498
- AstNode.set_kids(self, nodes=new_kid)
3506
+ self.set_kids(nodes=new_kid)
3499
3507
  return res
3500
3508
 
3501
3509
 
@@ -3524,7 +3532,7 @@ class MatchAs(MatchPattern):
3524
3532
  new_kid.append(self.pattern)
3525
3533
  new_kid.append(self.gen_token(Tok.KW_AS))
3526
3534
  new_kid.append(self.name)
3527
- AstNode.set_kids(self, nodes=new_kid)
3535
+ self.set_kids(nodes=new_kid)
3528
3536
  return res
3529
3537
 
3530
3538
 
@@ -3568,7 +3576,7 @@ class MatchValue(MatchPattern):
3568
3576
  res = True
3569
3577
  if deep:
3570
3578
  res = self.value.normalize(deep)
3571
- AstNode.set_kids(self, nodes=[self.value])
3579
+ self.set_kids(nodes=[self.value])
3572
3580
  return res
3573
3581
 
3574
3582
 
@@ -3587,7 +3595,7 @@ class MatchSingleton(MatchPattern):
3587
3595
  def normalize(self, deep: bool = False) -> bool:
3588
3596
  """Normalize match singleton node."""
3589
3597
  res = True
3590
- AstNode.set_kids(self, nodes=[self.value])
3598
+ self.set_kids(nodes=[self.value])
3591
3599
  return res
3592
3600
 
3593
3601
 
@@ -3615,7 +3623,7 @@ class MatchSequence(MatchPattern):
3615
3623
  new_kid.append(self.gen_token(Tok.COMMA))
3616
3624
  new_kid.pop()
3617
3625
  new_kid.append(self.gen_token(Tok.RSQUARE))
3618
- AstNode.set_kids(self, nodes=new_kid)
3626
+ self.set_kids(nodes=new_kid)
3619
3627
  return res
3620
3628
 
3621
3629
 
@@ -3643,7 +3651,7 @@ class MatchMapping(MatchPattern):
3643
3651
  new_kid.append(self.gen_token(Tok.COMMA))
3644
3652
  new_kid.pop()
3645
3653
  new_kid.append(self.gen_token(Tok.RBRACE))
3646
- AstNode.set_kids(self, nodes=new_kid)
3654
+ self.set_kids(nodes=new_kid)
3647
3655
  return res
3648
3656
 
3649
3657
 
@@ -3671,7 +3679,7 @@ class MatchKVPair(MatchPattern):
3671
3679
  res = res and self.value.normalize(deep)
3672
3680
  op = Tok.EQ if isinstance(self.key, Name) else Tok.COLON
3673
3681
  new_kid: list[AstNode] = [self.key, self.gen_token(op), self.value]
3674
- AstNode.set_kids(self, nodes=new_kid)
3682
+ self.set_kids(nodes=new_kid)
3675
3683
  return res
3676
3684
 
3677
3685
 
@@ -3698,7 +3706,7 @@ class MatchStar(MatchPattern):
3698
3706
  self.gen_token(Tok.STAR_MUL if self.is_list else Tok.STAR_POW)
3699
3707
  ]
3700
3708
  new_kid.append(self.name)
3701
- AstNode.set_kids(self, nodes=new_kid)
3709
+ self.set_kids(nodes=new_kid)
3702
3710
  return res
3703
3711
 
3704
3712
 
@@ -3735,7 +3743,7 @@ class MatchArch(MatchPattern):
3735
3743
  else:
3736
3744
  new_kid.pop()
3737
3745
  new_kid.append(self.gen_token(Tok.RPAREN))
3738
- AstNode.set_kids(self, nodes=new_kid)
3746
+ self.set_kids(nodes=new_kid)
3739
3747
  return res
3740
3748
 
3741
3749