jaclang 0.7.2__py3-none-any.whl → 0.7.8__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 (95) hide show
  1. jaclang/cli/cli.py +2 -2
  2. jaclang/compiler/__init__.py +11 -12
  3. jaclang/compiler/absyntree.py +499 -294
  4. jaclang/compiler/codeloc.py +2 -2
  5. jaclang/compiler/constant.py +100 -2
  6. jaclang/compiler/jac.lark +27 -19
  7. jaclang/compiler/parser.py +119 -92
  8. jaclang/compiler/passes/main/access_modifier_pass.py +20 -12
  9. jaclang/compiler/passes/main/def_impl_match_pass.py +28 -14
  10. jaclang/compiler/passes/main/def_use_pass.py +59 -40
  11. jaclang/compiler/passes/main/fuse_typeinfo_pass.py +65 -43
  12. jaclang/compiler/passes/main/import_pass.py +8 -6
  13. jaclang/compiler/passes/main/pyast_gen_pass.py +97 -42
  14. jaclang/compiler/passes/main/pyast_load_pass.py +47 -12
  15. jaclang/compiler/passes/main/pyjac_ast_link_pass.py +19 -10
  16. jaclang/compiler/passes/main/registry_pass.py +6 -6
  17. jaclang/compiler/passes/main/sub_node_tab_pass.py +0 -5
  18. jaclang/compiler/passes/main/sym_tab_build_pass.py +43 -235
  19. jaclang/compiler/passes/main/tests/test_decl_def_match_pass.py +21 -4
  20. jaclang/compiler/passes/main/tests/test_def_use_pass.py +5 -10
  21. jaclang/compiler/passes/main/type_check_pass.py +2 -1
  22. jaclang/compiler/passes/tool/jac_formatter_pass.py +30 -9
  23. jaclang/compiler/passes/tool/tests/fixtures/corelib.jac +16 -0
  24. jaclang/compiler/passes/tool/tests/fixtures/corelib_fmt.jac +16 -0
  25. jaclang/compiler/passes/tool/tests/fixtures/genai/essay_review.jac +1 -1
  26. jaclang/compiler/passes/tool/tests/fixtures/genai/expert_answer.jac +1 -1
  27. jaclang/compiler/passes/tool/tests/fixtures/genai/joke_gen.jac +1 -1
  28. jaclang/compiler/passes/tool/tests/fixtures/genai/odd_word_out.jac +1 -1
  29. jaclang/compiler/passes/tool/tests/fixtures/genai/personality_finder.jac +1 -1
  30. jaclang/compiler/passes/tool/tests/fixtures/genai/text_to_type.jac +1 -1
  31. jaclang/compiler/passes/tool/tests/fixtures/genai/translator.jac +1 -1
  32. jaclang/compiler/passes/tool/tests/fixtures/genai/wikipedia.jac +1 -1
  33. jaclang/compiler/passes/transform.py +2 -4
  34. jaclang/compiler/passes/utils/mypy_ast_build.py +1 -8
  35. jaclang/{core/registry.py → compiler/semtable.py} +1 -3
  36. jaclang/compiler/symtable.py +142 -101
  37. jaclang/compiler/tests/test_parser.py +2 -2
  38. jaclang/core/{construct.py → architype.py} +25 -240
  39. jaclang/core/constructs.py +44 -0
  40. jaclang/core/context.py +157 -0
  41. jaclang/core/importer.py +18 -9
  42. jaclang/core/memory.py +99 -0
  43. jaclang/core/test.py +90 -0
  44. jaclang/core/utils.py +2 -2
  45. jaclang/langserve/engine.py +127 -50
  46. jaclang/langserve/server.py +34 -61
  47. jaclang/langserve/tests/fixtures/base_module_structure.jac +28 -0
  48. jaclang/langserve/tests/fixtures/circle.jac +16 -12
  49. jaclang/langserve/tests/fixtures/circle_err.jac +3 -3
  50. jaclang/langserve/tests/fixtures/circle_pure.test.jac +15 -0
  51. jaclang/langserve/tests/fixtures/import_include_statements.jac +6 -0
  52. jaclang/langserve/tests/fixtures/py_import.py +26 -0
  53. jaclang/langserve/tests/test_server.py +93 -18
  54. jaclang/langserve/utils.py +124 -10
  55. jaclang/plugin/builtin.py +1 -1
  56. jaclang/plugin/default.py +25 -77
  57. jaclang/plugin/feature.py +25 -7
  58. jaclang/plugin/spec.py +18 -20
  59. jaclang/settings.py +3 -0
  60. jaclang/tests/fixtures/abc.jac +16 -12
  61. jaclang/tests/fixtures/aott_raise.jac +1 -1
  62. jaclang/tests/fixtures/byllmissue.jac +9 -0
  63. jaclang/tests/fixtures/edgetypeissue.jac +10 -0
  64. jaclang/tests/fixtures/hello.jac +1 -1
  65. jaclang/tests/fixtures/impl_match_confused.impl.jac +1 -0
  66. jaclang/tests/fixtures/impl_match_confused.jac +5 -0
  67. jaclang/tests/fixtures/maxfail_run_test.jac +17 -5
  68. jaclang/tests/fixtures/run_test.jac +17 -5
  69. jaclang/tests/test_bugs.py +19 -0
  70. jaclang/tests/test_cli.py +1 -1
  71. jaclang/tests/test_language.py +65 -100
  72. jaclang/tests/test_reference.py +1 -1
  73. jaclang/utils/lang_tools.py +5 -4
  74. jaclang/utils/test.py +2 -1
  75. jaclang/utils/treeprinter.py +22 -8
  76. {jaclang-0.7.2.dist-info → jaclang-0.7.8.dist-info}/METADATA +1 -1
  77. {jaclang-0.7.2.dist-info → jaclang-0.7.8.dist-info}/RECORD +79 -83
  78. jaclang/core/aott.py +0 -310
  79. jaclang/core/llms/__init__.py +0 -20
  80. jaclang/core/llms/anthropic.py +0 -90
  81. jaclang/core/llms/base.py +0 -206
  82. jaclang/core/llms/groq.py +0 -70
  83. jaclang/core/llms/huggingface.py +0 -76
  84. jaclang/core/llms/ollama.py +0 -81
  85. jaclang/core/llms/openai.py +0 -65
  86. jaclang/core/llms/togetherai.py +0 -63
  87. jaclang/core/llms/utils.py +0 -9
  88. jaclang/tests/fixtures/math_question.jpg +0 -0
  89. jaclang/tests/fixtures/with_llm_function.jac +0 -33
  90. jaclang/tests/fixtures/with_llm_lower.jac +0 -45
  91. jaclang/tests/fixtures/with_llm_method.jac +0 -51
  92. jaclang/tests/fixtures/with_llm_type.jac +0 -52
  93. jaclang/tests/fixtures/with_llm_vision.jac +0 -25
  94. {jaclang-0.7.2.dist-info → jaclang-0.7.8.dist-info}/WHEEL +0 -0
  95. {jaclang-0.7.2.dist-info → jaclang-0.7.8.dist-info}/entry_points.txt +0 -0
@@ -28,26 +28,33 @@ class DeclImplMatchPass(Pass):
28
28
  """Rebuild sub node table."""
29
29
  self.ir = SubNodeTabPass(input_ir=self.ir, prior=self).ir
30
30
 
31
- def defn_lookup(self, lookup: Symbol) -> ast.AstImplNeedingNode | None:
31
+ def defn_lookup(self, lookup: Symbol) -> ast.NameAtom | None:
32
32
  """Lookup a definition in a symbol table."""
33
33
  for defn in range(len(lookup.defn)):
34
34
  candidate = lookup.defn[len(lookup.defn) - (defn + 1)]
35
- if isinstance(candidate, ast.AstImplNeedingNode) and candidate.needs_impl:
35
+ if (
36
+ isinstance(candidate.name_of, ast.AstImplNeedingNode)
37
+ and candidate.name_of.needs_impl
38
+ ):
36
39
  return candidate
37
40
  return None
38
41
 
39
42
  def connect_def_impl(self, sym_tab: SymbolTable) -> None:
40
43
  """Connect Decls and Defs."""
41
44
  for sym in sym_tab.tab.values():
42
- if isinstance(sym.decl, ast.AstImplOnlyNode):
45
+ if isinstance(sym.decl.name_of, ast.AstImplOnlyNode):
43
46
  # currently strips the type info from impls
44
47
  arch_refs = [x[3:] for x in sym.sym_name.split(".")]
45
- name_of_links = [] # to link archref names to decls
48
+ name_of_links: list[ast.NameAtom] = [] # to link archref names to decls
46
49
  lookup = sym_tab.lookup(arch_refs[0])
47
50
  # If below may need to be a while instead of if to skip over local
48
51
  # import name collisions (see test: test_impl_decl_resolution_fix)
49
- if lookup and not isinstance(lookup.decl, ast.AstImplNeedingNode):
50
- lookup = sym_tab.parent.lookup(arch_refs[0])
52
+ if lookup and not isinstance(
53
+ lookup.decl.name_of, ast.AstImplNeedingNode
54
+ ):
55
+ lookup = (
56
+ sym_tab.parent.lookup(arch_refs[0]) if sym_tab.parent else None
57
+ )
51
58
  decl_node = (
52
59
  self.defn_lookup(lookup)
53
60
  if len(arch_refs) == 1 and lookup
@@ -57,8 +64,8 @@ class DeclImplMatchPass(Pass):
57
64
  for name in arch_refs[1:]:
58
65
  if decl_node:
59
66
  lookup = (
60
- decl_node.sym_tab.lookup(name)
61
- if decl_node.sym_tab
67
+ decl_node.name_of.sym_tab.lookup(name, deep=False)
68
+ if decl_node.name_of.sym_tab
62
69
  else None
63
70
  )
64
71
  decl_node = (
@@ -77,11 +84,18 @@ class DeclImplMatchPass(Pass):
77
84
  decl_node,
78
85
  )
79
86
  continue
80
- decl_node.body = sym.decl # type: ignore
81
- sym.decl.decl_link = decl_node # type: ignore
82
- for idx, a in enumerate(sym.decl.target.archs):
83
- if isinstance(a.name_ref.sym_name_node, ast.NameSpec):
84
- a.name_ref.sym_name_node.name_of = name_of_links[idx]
85
- decl_node.sym_tab.tab = sym.decl.sym_tab.tab # type: ignore
87
+ if not isinstance(
88
+ valid_decl := decl_node.name_of, ast.AstImplNeedingNode
89
+ ) or not (valid_decl.sym_tab and sym.decl.name_of.sym_tab):
90
+ raise self.ice(
91
+ f"Expected AstImplNeedingNode, got {valid_decl.__class__.__name__}. Not possible."
92
+ )
93
+ valid_decl.body = sym.decl.name_of
94
+ sym.decl.name_of.decl_link = valid_decl
95
+ for idx, a in enumerate(sym.decl.name_of.target.archs):
96
+ a.name_spec.name_of = name_of_links[idx].name_of
97
+ a.name_spec.sym = name_of_links[idx].sym
98
+ sym.decl.name_of.sym_tab.tab.update(valid_decl.sym_tab.tab)
99
+ valid_decl.sym_tab.tab = sym.decl.name_of.sym_tab.tab
86
100
  for i in sym_tab.kid:
87
101
  self.connect_def_impl(i)
@@ -10,10 +10,10 @@ import ast as ast3
10
10
 
11
11
  import jaclang.compiler.absyntree as ast
12
12
  from jaclang.compiler.constant import Tokens as Tok
13
- from jaclang.compiler.passes.main.sym_tab_build_pass import SymTabPass
13
+ from jaclang.compiler.passes import Pass
14
14
 
15
15
 
16
- class DefUsePass(SymTabPass):
16
+ class DefUsePass(Pass):
17
17
  """Jac Ast build pass."""
18
18
 
19
19
  def after_pass(self) -> None:
@@ -23,25 +23,43 @@ class DefUsePass(SymTabPass):
23
23
  """Sub objects.
24
24
 
25
25
  name: Name,
26
- doc: Optional[Token],
27
- body: Optional[SubNodeList[ArchStmt]],
28
- sym_tab: Optional[SymbolTable],
26
+ arch_type: Token,
27
+ access: Optional[SubTag[Token]],
28
+ base_classes: Optional[SubNodeList[Expr]],
29
+ body: Optional[SubNodeList[ArchBlockStmt] | ArchDef],
30
+ doc: Optional[String] = None,
31
+ semstr: Optional[String] = None,
32
+ decorators: Optional[SubNodeList[Expr]] = None,
29
33
  """
34
+ node.sym_tab.inherit_baseclasses_sym(node)
35
+
36
+ def inform_from_walker(node: ast.AstNode) -> None:
37
+ for i in (
38
+ node.get_all_sub_nodes(ast.VisitStmt)
39
+ + node.get_all_sub_nodes(ast.IgnoreStmt)
40
+ + node.get_all_sub_nodes(ast.DisengageStmt)
41
+ + node.get_all_sub_nodes(ast.EdgeOpRef)
42
+ ):
43
+ i.from_walker = True
44
+
30
45
  if node.arch_type.name == Tok.KW_WALKER:
31
- self.inform_from_walker(node)
46
+ inform_from_walker(node)
32
47
  for i in self.get_all_sub_nodes(node, ast.Ability):
33
48
  if isinstance(i.body, ast.AbilityDef):
34
- self.inform_from_walker(i.body)
35
-
36
- def inform_from_walker(self, node: ast.AstNode) -> None:
37
- """Inform all sub nodes that they are from a walker."""
38
- for i in (
39
- self.get_all_sub_nodes(node, ast.VisitStmt)
40
- + self.get_all_sub_nodes(node, ast.IgnoreStmt)
41
- + self.get_all_sub_nodes(node, ast.DisengageStmt)
42
- + self.get_all_sub_nodes(node, ast.EdgeOpRef)
43
- ):
44
- i.from_walker = True
49
+ inform_from_walker(i.body)
50
+
51
+ def enter_enum(self, node: ast.Enum) -> None:
52
+ """Sub objects.
53
+
54
+ name: Name,
55
+ access: Optional[SubTag[Token]],
56
+ base_classes: Optional[SubNodeList[Expr]],
57
+ body: Optional[SubNodeList[EnumBlockStmt] | EnumDef],
58
+ doc: Optional[String] = None,
59
+ semstr: Optional[String] = None,
60
+ decorators: Optional[SubNodeList[Expr]] = None,
61
+ """
62
+ node.sym_tab.inherit_baseclasses_sym(node)
45
63
 
46
64
  def enter_arch_ref(self, node: ast.ArchRef) -> None:
47
65
  """Sub objects.
@@ -49,14 +67,14 @@ class DefUsePass(SymTabPass):
49
67
  name_ref: NameType,
50
68
  arch: Token,
51
69
  """
52
- self.use_lookup(node)
70
+ node.sym_tab.use_lookup(node)
53
71
 
54
72
  def enter_arch_ref_chain(self, node: ast.ArchRefChain) -> None:
55
73
  """Sub objects.
56
74
 
57
75
  archs: list[ArchRef],
58
76
  """
59
- self.chain_use_lookup(node.archs)
77
+ node.sym_tab.chain_use_lookup(node.archs)
60
78
 
61
79
  def enter_param_var(self, node: ast.ParamVar) -> None:
62
80
  """Sub objects.
@@ -66,7 +84,7 @@ class DefUsePass(SymTabPass):
66
84
  type_tag: SubTag[ExprType],
67
85
  value: Optional[ExprType],
68
86
  """
69
- self.def_insert(node)
87
+ node.sym_tab.def_insert(node)
70
88
 
71
89
  def enter_has_var(self, node: ast.HasVar) -> None:
72
90
  """Sub objects.
@@ -78,7 +96,7 @@ class DefUsePass(SymTabPass):
78
96
  if isinstance(node.parent, ast.SubNodeList) and isinstance(
79
97
  node.parent.parent, ast.ArchHas
80
98
  ):
81
- self.def_insert(
99
+ node.sym_tab.def_insert(
82
100
  node,
83
101
  single_decl="has var",
84
102
  access_spec=node.parent.parent,
@@ -97,9 +115,9 @@ class DefUsePass(SymTabPass):
97
115
  """
98
116
  for i in node.target.items:
99
117
  if isinstance(i, ast.AtomTrailer):
100
- self.chain_def_insert(self.unwind_atom_trailer(i))
118
+ i.sym_tab.chain_def_insert(i.as_attr_list)
101
119
  elif isinstance(i, ast.AstSymbolNode):
102
- self.def_insert(i)
120
+ i.sym_tab.def_insert(i)
103
121
  else:
104
122
  self.error("Assignment target not valid")
105
123
 
@@ -112,9 +130,9 @@ class DefUsePass(SymTabPass):
112
130
  conditional: Optional[ExprType],
113
131
  """
114
132
  if isinstance(node.target, ast.AtomTrailer):
115
- self.chain_def_insert(self.unwind_atom_trailer(node.target))
133
+ node.target.sym_tab.chain_def_insert(node.target.as_attr_list)
116
134
  elif isinstance(node.target, ast.AstSymbolNode):
117
- self.def_insert(node.target)
135
+ node.target.sym_tab.def_insert(node.target)
118
136
  else:
119
137
  self.error("Named target not valid")
120
138
 
@@ -125,8 +143,8 @@ class DefUsePass(SymTabPass):
125
143
  right: AtomType,
126
144
  is_scope_contained: bool,
127
145
  """
128
- chain = self.unwind_atom_trailer(node)
129
- self.chain_use_lookup(chain)
146
+ chain = node.as_attr_list
147
+ node.sym_tab.chain_use_lookup(chain)
130
148
 
131
149
  def enter_func_call(self, node: ast.FuncCall) -> None:
132
150
  """Sub objects.
@@ -148,7 +166,7 @@ class DefUsePass(SymTabPass):
148
166
 
149
167
  var: Token,
150
168
  """
151
- self.use_lookup(node)
169
+ node.sym_tab.use_lookup(node)
152
170
 
153
171
  def enter_edge_op_ref(self, node: ast.EdgeOpRef) -> None:
154
172
  """Sub objects.
@@ -201,7 +219,7 @@ class DefUsePass(SymTabPass):
201
219
  pos_start: int,
202
220
  pos_end: int,
203
221
  """
204
- self.use_lookup(node)
222
+ node.sym_tab.use_lookup(node)
205
223
 
206
224
  def enter_int(self, node: ast.Int) -> None:
207
225
  """Sub objects.
@@ -214,7 +232,7 @@ class DefUsePass(SymTabPass):
214
232
  pos_start: int,
215
233
  pos_end: int,
216
234
  """
217
- self.use_lookup(node)
235
+ node.sym_tab.use_lookup(node)
218
236
 
219
237
  def enter_string(self, node: ast.String) -> None:
220
238
  """Sub objects.
@@ -227,7 +245,7 @@ class DefUsePass(SymTabPass):
227
245
  pos_start: int,
228
246
  pos_end: int,
229
247
  """
230
- self.use_lookup(node)
248
+ node.sym_tab.use_lookup(node)
231
249
 
232
250
  def enter_bool(self, node: ast.Bool) -> None:
233
251
  """Sub objects.
@@ -240,7 +258,7 @@ class DefUsePass(SymTabPass):
240
258
  pos_start: int,
241
259
  pos_end: int,
242
260
  """
243
- self.use_lookup(node)
261
+ node.sym_tab.use_lookup(node)
244
262
 
245
263
  def enter_builtin_type(self, node: ast.BuiltinType) -> None:
246
264
  """Sub objects.
@@ -254,7 +272,7 @@ class DefUsePass(SymTabPass):
254
272
  pos_end: int,
255
273
  typ: type,
256
274
  """
257
- self.use_lookup(node)
275
+ node.sym_tab.use_lookup(node)
258
276
 
259
277
  def enter_name(self, node: ast.Name) -> None:
260
278
  """Sub objects.
@@ -266,7 +284,8 @@ class DefUsePass(SymTabPass):
266
284
  pos_start: int,
267
285
  pos_end: int,
268
286
  """
269
- self.use_lookup(node)
287
+ if not isinstance(node.parent, ast.AtomTrailer):
288
+ node.sym_tab.use_lookup(node)
270
289
 
271
290
  def enter_in_for_stmt(self, node: ast.InForStmt) -> None:
272
291
  """Sub objects.
@@ -278,9 +297,9 @@ class DefUsePass(SymTabPass):
278
297
  else_body: Optional[ElseStmt],
279
298
  """
280
299
  if isinstance(node.target, ast.AtomTrailer):
281
- self.chain_def_insert(self.unwind_atom_trailer(node.target))
300
+ node.target.sym_tab.chain_def_insert(node.target.as_attr_list)
282
301
  elif isinstance(node.target, ast.AstSymbolNode):
283
- self.def_insert(node.target)
302
+ node.target.sym_tab.def_insert(node.target)
284
303
  else:
285
304
  self.error("For loop assignment target not valid")
286
305
 
@@ -296,9 +315,9 @@ class DefUsePass(SymTabPass):
296
315
  )
297
316
  for i in items:
298
317
  if isinstance(i, ast.AtomTrailer):
299
- self.unwind_atom_trailer(i)[-1].py_ctx_func = ast3.Del
318
+ i.as_attr_list[-1].name_spec.py_ctx_func = ast3.Del
300
319
  elif isinstance(i, ast.AstSymbolNode):
301
- i.py_ctx_func = ast3.Del
320
+ i.name_spec.py_ctx_func = ast3.Del
302
321
  else:
303
322
  self.error("Delete target not valid")
304
323
 
@@ -310,8 +329,8 @@ class DefUsePass(SymTabPass):
310
329
  """
311
330
  if node.alias:
312
331
  if isinstance(node.alias, ast.AtomTrailer):
313
- self.chain_def_insert(self.unwind_atom_trailer(node.alias))
332
+ node.alias.sym_tab.chain_def_insert(node.alias.as_attr_list)
314
333
  elif isinstance(node.alias, ast.AstSymbolNode):
315
- self.def_insert(node.alias)
334
+ node.alias.sym_tab.def_insert(node.alias)
316
335
  else:
317
336
  self.error("For expr as target not valid")
@@ -11,6 +11,7 @@ from typing import Callable, TypeVar
11
11
 
12
12
  import jaclang.compiler.absyntree as ast
13
13
  from jaclang.compiler.passes import Pass
14
+ from jaclang.compiler.symtable import SymbolTable
14
15
  from jaclang.settings import settings
15
16
  from jaclang.utils.helpers import pascal_to_snake
16
17
  from jaclang.vendor.mypy.nodes import Node as VNode # bit of a hack
@@ -46,7 +47,7 @@ class FuseTypeInfoPass(Pass):
46
47
  )
47
48
 
48
49
  def __set_sym_table_link(self, node: ast.AstSymbolNode) -> None:
49
- typ = node.sym_info.typ.split(".")
50
+ typ = node.sym_type.split(".")
50
51
  typ_sym_table = self.ir.sym_tab
51
52
 
52
53
  if typ[0] == "builtins":
@@ -63,7 +64,7 @@ class FuseTypeInfoPass(Pass):
63
64
  typ_sym_table = f
64
65
 
65
66
  if typ_sym_table != self.ir.sym_tab:
66
- node.sym_info.typ_sym_table = typ_sym_table
67
+ node.name_spec.type_sym_tab = typ_sym_table
67
68
 
68
69
  @staticmethod
69
70
  def __handle_node(
@@ -133,7 +134,7 @@ class FuseTypeInfoPass(Pass):
133
134
  t = t.split("->")[1].strip()
134
135
  elif "def" in t:
135
136
  t = "None"
136
- node.sym_info.typ = t
137
+ node.name_spec.sym_type = t
137
138
  else:
138
139
  self.__debug_print(f"{node.loc} MemberExpr type is not found")
139
140
 
@@ -145,16 +146,16 @@ class FuseTypeInfoPass(Pass):
145
146
  self.__call_type_handler(node, mypy_node.type)
146
147
 
147
148
  elif isinstance(mypy_node, MypyNodes.MypyFile):
148
- node.sym_info = ast.SymbolInfo("types.ModuleType")
149
+ node.name_spec.sym_type = "types.ModuleType"
149
150
 
150
151
  elif isinstance(mypy_node, MypyNodes.TypeInfo):
151
- node.sym_info = ast.SymbolInfo(mypy_node.fullname)
152
+ node.name_spec.sym_type = mypy_node.fullname
152
153
 
153
154
  elif isinstance(mypy_node, MypyNodes.OverloadedFuncDef):
154
155
  self.__call_type_handler(node, mypy_node.items[0].func.type)
155
156
 
156
157
  elif mypy_node is None:
157
- node.sym_info = ast.SymbolInfo("None")
158
+ node.name_spec.sym_type = "None"
158
159
 
159
160
  else:
160
161
  self.__debug_print(
@@ -164,7 +165,7 @@ class FuseTypeInfoPass(Pass):
164
165
 
165
166
  else:
166
167
  if isinstance(mypy_node, MypyNodes.ClassDef):
167
- node.sym_info.typ = mypy_node.fullname
168
+ node.name_spec.sym_type = mypy_node.fullname
168
169
  self.__set_sym_table_link(node)
169
170
  elif isinstance(mypy_node, MypyNodes.FuncDef):
170
171
  self.__call_type_handler(node, mypy_node.type)
@@ -179,22 +180,10 @@ class FuseTypeInfoPass(Pass):
179
180
  )
180
181
 
181
182
  @__handle_node
182
- def enter_name(self, node: ast.NameSpec) -> None:
183
+ def enter_name(self, node: ast.NameAtom) -> None:
183
184
  """Pass handler for name nodes."""
184
185
  self.__collect_type_from_symbol(node)
185
186
 
186
- # Assign correct symbols to sym_link in case of
187
- # AtomTrailer Object
188
- if isinstance(node.parent, ast.AtomTrailer):
189
- target_node = node.parent.target
190
- if isinstance(target_node, ast.AstSymbolNode):
191
- parent_symbol_table = target_node.sym_info.typ_sym_table
192
- if isinstance(parent_symbol_table, ast.SymbolTable):
193
- owner = parent_symbol_table.owner
194
- if isinstance(owner, ast.AstSymbolNode):
195
- target_node.sym_link = owner.sym_link
196
- node.sym_link = parent_symbol_table.lookup(node.sym_name)
197
-
198
187
  @__handle_node
199
188
  def enter_module_path(self, node: ast.ModulePath) -> None:
200
189
  """Pass handler for ModulePath nodes."""
@@ -279,13 +268,13 @@ class FuseTypeInfoPass(Pass):
279
268
 
280
269
  def exit_has_var(self, node: ast.HasVar) -> None:
281
270
  """Pass handler for HasVar nodes."""
282
- node.sym_info.typ = node.name.sym_info.typ
283
- node.sym_info.typ_sym_table = node.name.sym_info.typ_sym_table
271
+ node.name_spec.sym_type = node.name.sym_type
272
+ node.name_spec.type_sym_tab = node.name.type_sym_tab
284
273
 
285
274
  @__handle_node
286
275
  def enter_multi_string(self, node: ast.MultiString) -> None:
287
276
  """Pass handler for MultiString nodes."""
288
- node.sym_info = ast.SymbolInfo("builtins.str")
277
+ node.name_spec.sym_type = "builtins.str"
289
278
 
290
279
  @__handle_node
291
280
  def enter_f_string(self, node: ast.FString) -> None:
@@ -297,48 +286,48 @@ class FuseTypeInfoPass(Pass):
297
286
  """Pass handler for ListVal nodes."""
298
287
  mypy_node = node.gen.mypy_ast[0]
299
288
  if mypy_node in self.node_type_hash:
300
- node.sym_info.typ = str(self.node_type_hash[mypy_node])
289
+ node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
301
290
  else:
302
- node.sym_info.typ = "builtins.list"
291
+ node.name_spec.sym_type = "builtins.list"
303
292
 
304
293
  @__handle_node
305
294
  def enter_set_val(self, node: ast.SetVal) -> None:
306
295
  """Pass handler for SetVal nodes."""
307
296
  mypy_node = node.gen.mypy_ast[0]
308
297
  if mypy_node in self.node_type_hash:
309
- node.sym_info.typ = str(self.node_type_hash[mypy_node])
298
+ node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
310
299
  else:
311
- node.sym_info.typ = "builtins.set"
300
+ node.name_spec.sym_type = "builtins.set"
312
301
 
313
302
  @__handle_node
314
303
  def enter_tuple_val(self, node: ast.TupleVal) -> None:
315
304
  """Pass handler for TupleVal nodes."""
316
305
  mypy_node = node.gen.mypy_ast[0]
317
306
  if mypy_node in self.node_type_hash:
318
- node.sym_info.typ = str(self.node_type_hash[mypy_node])
307
+ node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
319
308
  else:
320
- node.sym_info.typ = "builtins.tuple"
309
+ node.name_spec.sym_type = "builtins.tuple"
321
310
 
322
311
  @__handle_node
323
312
  def enter_dict_val(self, node: ast.DictVal) -> None:
324
313
  """Pass handler for DictVal nodes."""
325
314
  mypy_node = node.gen.mypy_ast[0]
326
315
  if mypy_node in self.node_type_hash:
327
- node.sym_info.typ = str(self.node_type_hash[mypy_node])
316
+ node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
328
317
  else:
329
- node.sym_info.typ = "builtins.dict"
318
+ node.name_spec.sym_type = "builtins.dict"
330
319
 
331
320
  @__handle_node
332
321
  def enter_list_compr(self, node: ast.ListCompr) -> None:
333
322
  """Pass handler for ListCompr nodes."""
334
323
  mypy_node = node.gen.mypy_ast[0]
335
- node.sym_info.typ = str(self.node_type_hash[mypy_node])
324
+ node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
336
325
 
337
326
  @__handle_node
338
327
  def enter_dict_compr(self, node: ast.DictCompr) -> None:
339
328
  """Pass handler for DictCompr nodes."""
340
329
  mypy_node = node.gen.mypy_ast[0]
341
- node.sym_info.typ = str(self.node_type_hash[mypy_node])
330
+ node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
342
331
 
343
332
  @__handle_node
344
333
  def enter_index_slice(self, node: ast.IndexSlice) -> None:
@@ -350,7 +339,7 @@ class FuseTypeInfoPass(Pass):
350
339
  """Pass handler for ArchRef nodes."""
351
340
  if isinstance(node.gen.mypy_ast[0], MypyNodes.ClassDef):
352
341
  mypy_node: MypyNodes.ClassDef = node.gen.mypy_ast[0]
353
- node.sym_info.typ = mypy_node.fullname
342
+ node.name_spec.sym_type = mypy_node.fullname
354
343
  self.__set_sym_table_link(node)
355
344
  elif isinstance(node.gen.mypy_ast[0], MypyNodes.FuncDef):
356
345
  mypy_node2: MypyNodes.FuncDef = node.gen.mypy_ast[0]
@@ -384,22 +373,22 @@ class FuseTypeInfoPass(Pass):
384
373
  @__handle_node
385
374
  def enter_int(self, node: ast.Int) -> None:
386
375
  """Pass handler for Int nodes."""
387
- node.sym_info.typ = "builtins.int"
376
+ node.name_spec.sym_type = "builtins.int"
388
377
 
389
378
  @__handle_node
390
379
  def enter_float(self, node: ast.Float) -> None:
391
380
  """Pass handler for Float nodes."""
392
- node.sym_info.typ = "builtins.float"
381
+ node.name_spec.sym_type = "builtins.float"
393
382
 
394
383
  @__handle_node
395
384
  def enter_string(self, node: ast.String) -> None:
396
385
  """Pass handler for String nodes."""
397
- node.sym_info.typ = "builtins.str"
386
+ node.name_spec.sym_type = "builtins.str"
398
387
 
399
388
  @__handle_node
400
389
  def enter_bool(self, node: ast.Bool) -> None:
401
390
  """Pass handler for Bool nodes."""
402
- node.sym_info.typ = "builtins.bool"
391
+ node.name_spec.sym_type = "builtins.bool"
403
392
 
404
393
  @__handle_node
405
394
  def enter_builtin_type(self, node: ast.BuiltinType) -> None:
@@ -410,13 +399,13 @@ class FuseTypeInfoPass(Pass):
410
399
  self, node: ast.AstSymbolNode, mypy_type: MypyTypes.Instance
411
400
  ) -> None:
412
401
  """Get type info from mypy type Instance."""
413
- node.sym_info = ast.SymbolInfo(str(mypy_type))
402
+ node.name_spec.sym_type = str(mypy_type)
414
403
 
415
404
  def get_type_from_callable_type(
416
405
  self, node: ast.AstSymbolNode, mypy_type: MypyTypes.CallableType
417
406
  ) -> None:
418
407
  """Get type info from mypy type CallableType."""
419
- node.sym_info = ast.SymbolInfo(str(mypy_type.ret_type))
408
+ node.name_spec.sym_type = str(mypy_type.ret_type)
420
409
 
421
410
  # TODO: Which overloaded function to get the return value from?
422
411
  def get_type_from_overloaded(
@@ -429,16 +418,49 @@ class FuseTypeInfoPass(Pass):
429
418
  self, node: ast.AstSymbolNode, mypy_type: MypyTypes.NoneType
430
419
  ) -> None:
431
420
  """Get type info from mypy type NoneType."""
432
- node.sym_info = ast.SymbolInfo("None")
421
+ node.name_spec.sym_type = "None"
433
422
 
434
423
  def get_type_from_any_type(
435
424
  self, node: ast.AstSymbolNode, mypy_type: MypyTypes.AnyType
436
425
  ) -> None:
437
426
  """Get type info from mypy type NoneType."""
438
- node.sym_info = ast.SymbolInfo("Any")
427
+ node.name_spec.sym_type = "Any"
439
428
 
440
429
  def get_type_from_tuple_type(
441
430
  self, node: ast.AstSymbolNode, mypy_type: MypyTypes.TupleType
442
431
  ) -> None:
443
432
  """Get type info from mypy type TupleType."""
444
- node.sym_info = ast.SymbolInfo("builtins.tuple")
433
+ node.name_spec.sym_type = "builtins.tuple"
434
+
435
+ def exit_assignment(self, node: ast.Assignment) -> None:
436
+ """Add new symbols in the symbol table in case of self."""
437
+ # This will fix adding new items to the class through self
438
+ # self.x = 5 # will add x to self datatype symbol table
439
+ for target in node.target.items:
440
+ if (
441
+ isinstance(target, ast.AtomTrailer)
442
+ and isinstance(target.target, ast.SpecialVarRef)
443
+ and target.target.sym_name == "self"
444
+ ):
445
+ self_obj = target.target
446
+ right_obj = target.right
447
+ if self_obj.type_sym_tab and isinstance(right_obj, ast.AstSymbolNode):
448
+ self_obj.type_sym_tab.def_insert(right_obj)
449
+
450
+ def exit_name(self, node: ast.Name) -> None:
451
+ """Add new symbols in the symbol table in case of atom trailer."""
452
+ if isinstance(node.parent, ast.AtomTrailer):
453
+ target_node = node.parent.target
454
+ if isinstance(target_node, ast.AstSymbolNode):
455
+ parent_symbol_table = target_node.type_sym_tab
456
+ if isinstance(parent_symbol_table, SymbolTable):
457
+ node.sym = parent_symbol_table.lookup(node.sym_name)
458
+
459
+ # def exit_in_for_stmt(self, node: ast.InForStmt):
460
+ # print(node.loc.mod_path, node.loc)
461
+ # print(node.target, node.target.loc)
462
+ # # node.sym_tab.def_insert()
463
+ # # exit()
464
+
465
+ # def after_pass(self) -> None:
466
+ # exit()
@@ -204,15 +204,17 @@ class JacImportPass(Pass):
204
204
  class PyImportPass(JacImportPass):
205
205
  """Jac statically imports Python modules."""
206
206
 
207
+ def before_pass(self) -> None:
208
+ """Only run pass if settings are set to raise python."""
209
+ if not settings.py_raise:
210
+ self.terminate()
211
+ else:
212
+ return super().before_pass()
213
+
207
214
  def process_import(self, node: ast.Module, i: ast.ModulePath) -> None:
208
215
  """Process an import."""
209
216
  lang = i.parent_of_type(ast.Import).hint.tag.value
210
- if (
211
- lang == "py"
212
- and not i.sub_module
213
- and settings.py_raise
214
- and not is_standard_lib_module(i.path_str)
215
- ):
217
+ if lang == "py" and not i.sub_module and not is_standard_lib_module(i.path_str):
216
218
  mod = self.import_py_module(node=i, mod_path=node.loc.mod_path)
217
219
  if mod:
218
220
  i.sub_module = mod