jaclang 0.7.1__py3-none-any.whl → 0.7.7__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 (106) hide show
  1. jaclang/cli/cli.py +2 -2
  2. jaclang/compiler/absyntree.py +539 -297
  3. jaclang/compiler/codeloc.py +2 -2
  4. jaclang/compiler/constant.py +100 -2
  5. jaclang/compiler/jac.lark +27 -19
  6. jaclang/compiler/parser.py +119 -92
  7. jaclang/compiler/passes/main/access_modifier_pass.py +20 -12
  8. jaclang/compiler/passes/main/def_impl_match_pass.py +32 -12
  9. jaclang/compiler/passes/main/def_use_pass.py +59 -40
  10. jaclang/compiler/passes/main/fuse_typeinfo_pass.py +71 -30
  11. jaclang/compiler/passes/main/import_pass.py +12 -7
  12. jaclang/compiler/passes/main/pyast_gen_pass.py +110 -47
  13. jaclang/compiler/passes/main/pyast_load_pass.py +49 -13
  14. jaclang/compiler/passes/main/pyjac_ast_link_pass.py +25 -11
  15. jaclang/compiler/passes/main/pyout_pass.py +3 -1
  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/tests/test_import_pass.py +8 -0
  22. jaclang/compiler/passes/main/tests/test_type_check_pass.py +1 -1
  23. jaclang/compiler/passes/main/type_check_pass.py +2 -1
  24. jaclang/compiler/passes/tool/jac_formatter_pass.py +44 -11
  25. jaclang/compiler/passes/tool/tests/fixtures/corelib.jac +16 -0
  26. jaclang/compiler/passes/tool/tests/fixtures/corelib_fmt.jac +16 -0
  27. jaclang/compiler/passes/tool/tests/fixtures/doc_string.jac +15 -0
  28. jaclang/compiler/passes/tool/tests/fixtures/genai/essay_review.jac +1 -1
  29. jaclang/compiler/passes/tool/tests/fixtures/genai/expert_answer.jac +1 -1
  30. jaclang/compiler/passes/tool/tests/fixtures/genai/joke_gen.jac +1 -1
  31. jaclang/compiler/passes/tool/tests/fixtures/genai/odd_word_out.jac +1 -1
  32. jaclang/compiler/passes/tool/tests/fixtures/genai/personality_finder.jac +1 -1
  33. jaclang/compiler/passes/tool/tests/fixtures/genai/text_to_type.jac +1 -1
  34. jaclang/compiler/passes/tool/tests/fixtures/genai/translator.jac +1 -1
  35. jaclang/compiler/passes/tool/tests/fixtures/genai/wikipedia.jac +1 -1
  36. jaclang/compiler/passes/tool/tests/test_jac_format_pass.py +7 -5
  37. jaclang/compiler/passes/tool/tests/test_unparse_validate.py +1 -2
  38. jaclang/compiler/passes/transform.py +2 -4
  39. jaclang/{core/registry.py → compiler/semtable.py} +1 -3
  40. jaclang/compiler/symtable.py +150 -89
  41. jaclang/compiler/tests/test_parser.py +2 -2
  42. jaclang/core/aott.py +118 -18
  43. jaclang/core/{construct.py → architype.py} +44 -93
  44. jaclang/core/constructs.py +44 -0
  45. jaclang/core/context.py +157 -0
  46. jaclang/core/importer.py +18 -9
  47. jaclang/core/memory.py +53 -2
  48. jaclang/core/test.py +90 -0
  49. jaclang/core/utils.py +2 -2
  50. jaclang/langserve/engine.py +199 -138
  51. jaclang/langserve/server.py +48 -53
  52. jaclang/langserve/tests/fixtures/base_module_structure.jac +28 -0
  53. jaclang/langserve/tests/fixtures/circle.jac +16 -12
  54. jaclang/langserve/tests/fixtures/circle_err.jac +3 -3
  55. jaclang/langserve/tests/fixtures/circle_pure.impl.jac +8 -4
  56. jaclang/langserve/tests/fixtures/circle_pure.jac +2 -2
  57. jaclang/langserve/tests/fixtures/circle_pure.test.jac +15 -0
  58. jaclang/langserve/tests/fixtures/import_include_statements.jac +6 -0
  59. jaclang/langserve/tests/fixtures/py_import.py +26 -0
  60. jaclang/langserve/tests/test_server.py +200 -2
  61. jaclang/langserve/utils.py +214 -10
  62. jaclang/plugin/builtin.py +1 -1
  63. jaclang/plugin/default.py +48 -92
  64. jaclang/plugin/feature.py +33 -17
  65. jaclang/plugin/spec.py +18 -20
  66. jaclang/plugin/tests/test_features.py +0 -33
  67. jaclang/settings.py +4 -0
  68. jaclang/tests/fixtures/abc.jac +16 -12
  69. jaclang/tests/fixtures/aott_raise.jac +1 -1
  70. jaclang/tests/fixtures/byllmissue.jac +12 -0
  71. jaclang/tests/fixtures/edgetypeissue.jac +10 -0
  72. jaclang/tests/fixtures/hash_init_check.jac +17 -0
  73. jaclang/tests/fixtures/hello.jac +1 -1
  74. jaclang/tests/fixtures/impl_match_confused.impl.jac +1 -0
  75. jaclang/tests/fixtures/impl_match_confused.jac +5 -0
  76. jaclang/tests/fixtures/math_question.jpg +0 -0
  77. jaclang/tests/fixtures/maxfail_run_test.jac +17 -5
  78. jaclang/tests/fixtures/nosigself.jac +19 -0
  79. jaclang/tests/fixtures/run_test.jac +17 -5
  80. jaclang/tests/fixtures/walker_override.jac +21 -0
  81. jaclang/tests/fixtures/with_llm_function.jac +1 -1
  82. jaclang/tests/fixtures/with_llm_lower.jac +1 -1
  83. jaclang/tests/fixtures/with_llm_method.jac +1 -1
  84. jaclang/tests/fixtures/with_llm_type.jac +1 -1
  85. jaclang/tests/fixtures/with_llm_vision.jac +25 -0
  86. jaclang/tests/test_bugs.py +19 -0
  87. jaclang/tests/test_cli.py +1 -1
  88. jaclang/tests/test_language.py +197 -82
  89. jaclang/tests/test_reference.py +1 -1
  90. jaclang/utils/lang_tools.py +5 -4
  91. jaclang/utils/test.py +2 -1
  92. jaclang/utils/treeprinter.py +35 -4
  93. {jaclang-0.7.1.dist-info → jaclang-0.7.7.dist-info}/METADATA +3 -2
  94. {jaclang-0.7.1.dist-info → jaclang-0.7.7.dist-info}/RECORD +96 -88
  95. jaclang/core/llms/__init__.py +0 -20
  96. jaclang/core/llms/anthropic.py +0 -61
  97. jaclang/core/llms/base.py +0 -206
  98. jaclang/core/llms/groq.py +0 -67
  99. jaclang/core/llms/huggingface.py +0 -73
  100. jaclang/core/llms/ollama.py +0 -78
  101. jaclang/core/llms/openai.py +0 -61
  102. jaclang/core/llms/togetherai.py +0 -60
  103. jaclang/core/llms/utils.py +0 -9
  104. jaclang/core/shelve_storage.py +0 -55
  105. {jaclang-0.7.1.dist-info → jaclang-0.7.7.dist-info}/WHEEL +0 -0
  106. {jaclang-0.7.1.dist-info → jaclang-0.7.7.dist-info}/entry_points.txt +0 -0
@@ -9,7 +9,7 @@ body field.
9
9
  import jaclang.compiler.absyntree as ast
10
10
  from jaclang.compiler.passes import Pass
11
11
  from jaclang.compiler.passes.main import SubNodeTabPass
12
- from jaclang.compiler.symtable import Symbol, SymbolTable, SymbolType
12
+ from jaclang.compiler.symtable import Symbol, SymbolTable
13
13
 
14
14
 
15
15
  class DeclImplMatchPass(Pass):
@@ -28,35 +28,44 @@ 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 sym.sym_type == SymbolType.IMPL:
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(".")]
48
+ name_of_links: list[ast.NameAtom] = [] # to link archref names to decls
45
49
  lookup = sym_tab.lookup(arch_refs[0])
46
- # Below may need to be a while instead of if to skip over local
50
+ # If below may need to be a while instead of if to skip over local
47
51
  # import name collisions (see test: test_impl_decl_resolution_fix)
48
- if lookup and not isinstance(lookup.decl, ast.AstImplNeedingNode):
49
- 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
+ )
50
58
  decl_node = (
51
59
  self.defn_lookup(lookup)
52
60
  if len(arch_refs) == 1 and lookup
53
61
  else lookup.defn[-1] if lookup else None
54
62
  )
63
+ name_of_links.append(decl_node) if decl_node else None
55
64
  for name in arch_refs[1:]:
56
65
  if decl_node:
57
66
  lookup = (
58
- decl_node.sym_tab.lookup(name)
59
- if decl_node.sym_tab
67
+ decl_node.name_of.sym_tab.lookup(name, deep=False)
68
+ if decl_node.name_of.sym_tab
60
69
  else None
61
70
  )
62
71
  decl_node = (
@@ -64,6 +73,7 @@ class DeclImplMatchPass(Pass):
64
73
  if len(arch_refs) == 1 and lookup
65
74
  else lookup.defn[-1] if lookup else None
66
75
  )
76
+ name_of_links.append(decl_node) if decl_node else None
67
77
  else:
68
78
  break
69
79
  if not decl_node:
@@ -74,8 +84,18 @@ class DeclImplMatchPass(Pass):
74
84
  decl_node,
75
85
  )
76
86
  continue
77
- decl_node.body = sym.decl # type: ignore
78
- sym.decl.decl_link = decl_node # type: ignore
79
- 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
80
100
  for i in sym_tab.kid:
81
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(
@@ -129,9 +130,11 @@ class FuseTypeInfoPass(Pass):
129
130
  if isinstance(mypy_node, MypyNodes.MemberExpr):
130
131
  if mypy_node in self.node_type_hash:
131
132
  t = str(self.node_type_hash[mypy_node])
132
- if "->" in t:
133
+ if "def" in t and "->" in t:
133
134
  t = t.split("->")[1].strip()
134
- node.sym_info.typ = t
135
+ elif "def" in t:
136
+ t = "None"
137
+ node.name_spec.sym_type = t
135
138
  else:
136
139
  self.__debug_print(f"{node.loc} MemberExpr type is not found")
137
140
 
@@ -143,16 +146,16 @@ class FuseTypeInfoPass(Pass):
143
146
  self.__call_type_handler(node, mypy_node.type)
144
147
 
145
148
  elif isinstance(mypy_node, MypyNodes.MypyFile):
146
- node.sym_info = ast.SymbolInfo("types.ModuleType")
149
+ node.name_spec.sym_type = "types.ModuleType"
147
150
 
148
151
  elif isinstance(mypy_node, MypyNodes.TypeInfo):
149
- node.sym_info = ast.SymbolInfo(mypy_node.fullname)
152
+ node.name_spec.sym_type = mypy_node.fullname
150
153
 
151
154
  elif isinstance(mypy_node, MypyNodes.OverloadedFuncDef):
152
155
  self.__call_type_handler(node, mypy_node.items[0].func.type)
153
156
 
154
157
  elif mypy_node is None:
155
- node.sym_info = ast.SymbolInfo("None")
158
+ node.name_spec.sym_type = "None"
156
159
 
157
160
  else:
158
161
  self.__debug_print(
@@ -162,7 +165,7 @@ class FuseTypeInfoPass(Pass):
162
165
 
163
166
  else:
164
167
  if isinstance(mypy_node, MypyNodes.ClassDef):
165
- node.sym_info.typ = mypy_node.fullname
168
+ node.name_spec.sym_type = mypy_node.fullname
166
169
  self.__set_sym_table_link(node)
167
170
  elif isinstance(mypy_node, MypyNodes.FuncDef):
168
171
  self.__call_type_handler(node, mypy_node.type)
@@ -177,7 +180,7 @@ class FuseTypeInfoPass(Pass):
177
180
  )
178
181
 
179
182
  @__handle_node
180
- def enter_name(self, node: ast.NameSpec) -> None:
183
+ def enter_name(self, node: ast.NameAtom) -> None:
181
184
  """Pass handler for name nodes."""
182
185
  self.__collect_type_from_symbol(node)
183
186
 
@@ -263,10 +266,15 @@ class FuseTypeInfoPass(Pass):
263
266
  "Getting type of 'HasVar' is only supported with AssignmentStmt"
264
267
  )
265
268
 
269
+ def exit_has_var(self, node: ast.HasVar) -> None:
270
+ """Pass handler for HasVar nodes."""
271
+ node.name_spec.sym_type = node.name.sym_type
272
+ node.name_spec.type_sym_tab = node.name.type_sym_tab
273
+
266
274
  @__handle_node
267
275
  def enter_multi_string(self, node: ast.MultiString) -> None:
268
276
  """Pass handler for MultiString nodes."""
269
- node.sym_info = ast.SymbolInfo("builtins.str")
277
+ node.name_spec.sym_type = "builtins.str"
270
278
 
271
279
  @__handle_node
272
280
  def enter_f_string(self, node: ast.FString) -> None:
@@ -278,48 +286,48 @@ class FuseTypeInfoPass(Pass):
278
286
  """Pass handler for ListVal nodes."""
279
287
  mypy_node = node.gen.mypy_ast[0]
280
288
  if mypy_node in self.node_type_hash:
281
- node.sym_info.typ = str(self.node_type_hash[mypy_node])
289
+ node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
282
290
  else:
283
- node.sym_info.typ = "builtins.list"
291
+ node.name_spec.sym_type = "builtins.list"
284
292
 
285
293
  @__handle_node
286
294
  def enter_set_val(self, node: ast.SetVal) -> None:
287
295
  """Pass handler for SetVal nodes."""
288
296
  mypy_node = node.gen.mypy_ast[0]
289
297
  if mypy_node in self.node_type_hash:
290
- node.sym_info.typ = str(self.node_type_hash[mypy_node])
298
+ node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
291
299
  else:
292
- node.sym_info.typ = "builtins.set"
300
+ node.name_spec.sym_type = "builtins.set"
293
301
 
294
302
  @__handle_node
295
303
  def enter_tuple_val(self, node: ast.TupleVal) -> None:
296
304
  """Pass handler for TupleVal nodes."""
297
305
  mypy_node = node.gen.mypy_ast[0]
298
306
  if mypy_node in self.node_type_hash:
299
- node.sym_info.typ = str(self.node_type_hash[mypy_node])
307
+ node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
300
308
  else:
301
- node.sym_info.typ = "builtins.tuple"
309
+ node.name_spec.sym_type = "builtins.tuple"
302
310
 
303
311
  @__handle_node
304
312
  def enter_dict_val(self, node: ast.DictVal) -> None:
305
313
  """Pass handler for DictVal nodes."""
306
314
  mypy_node = node.gen.mypy_ast[0]
307
315
  if mypy_node in self.node_type_hash:
308
- node.sym_info.typ = str(self.node_type_hash[mypy_node])
316
+ node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
309
317
  else:
310
- node.sym_info.typ = "builtins.dict"
318
+ node.name_spec.sym_type = "builtins.dict"
311
319
 
312
320
  @__handle_node
313
321
  def enter_list_compr(self, node: ast.ListCompr) -> None:
314
322
  """Pass handler for ListCompr nodes."""
315
323
  mypy_node = node.gen.mypy_ast[0]
316
- node.sym_info.typ = str(self.node_type_hash[mypy_node])
324
+ node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
317
325
 
318
326
  @__handle_node
319
327
  def enter_dict_compr(self, node: ast.DictCompr) -> None:
320
328
  """Pass handler for DictCompr nodes."""
321
329
  mypy_node = node.gen.mypy_ast[0]
322
- node.sym_info.typ = str(self.node_type_hash[mypy_node])
330
+ node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
323
331
 
324
332
  @__handle_node
325
333
  def enter_index_slice(self, node: ast.IndexSlice) -> None:
@@ -331,7 +339,7 @@ class FuseTypeInfoPass(Pass):
331
339
  """Pass handler for ArchRef nodes."""
332
340
  if isinstance(node.gen.mypy_ast[0], MypyNodes.ClassDef):
333
341
  mypy_node: MypyNodes.ClassDef = node.gen.mypy_ast[0]
334
- node.sym_info.typ = mypy_node.fullname
342
+ node.name_spec.sym_type = mypy_node.fullname
335
343
  self.__set_sym_table_link(node)
336
344
  elif isinstance(node.gen.mypy_ast[0], MypyNodes.FuncDef):
337
345
  mypy_node2: MypyNodes.FuncDef = node.gen.mypy_ast[0]
@@ -365,22 +373,22 @@ class FuseTypeInfoPass(Pass):
365
373
  @__handle_node
366
374
  def enter_int(self, node: ast.Int) -> None:
367
375
  """Pass handler for Int nodes."""
368
- node.sym_info.typ = "builtins.int"
376
+ node.name_spec.sym_type = "builtins.int"
369
377
 
370
378
  @__handle_node
371
379
  def enter_float(self, node: ast.Float) -> None:
372
380
  """Pass handler for Float nodes."""
373
- node.sym_info.typ = "builtins.float"
381
+ node.name_spec.sym_type = "builtins.float"
374
382
 
375
383
  @__handle_node
376
384
  def enter_string(self, node: ast.String) -> None:
377
385
  """Pass handler for String nodes."""
378
- node.sym_info.typ = "builtins.str"
386
+ node.name_spec.sym_type = "builtins.str"
379
387
 
380
388
  @__handle_node
381
389
  def enter_bool(self, node: ast.Bool) -> None:
382
390
  """Pass handler for Bool nodes."""
383
- node.sym_info.typ = "builtins.bool"
391
+ node.name_spec.sym_type = "builtins.bool"
384
392
 
385
393
  @__handle_node
386
394
  def enter_builtin_type(self, node: ast.BuiltinType) -> None:
@@ -391,13 +399,13 @@ class FuseTypeInfoPass(Pass):
391
399
  self, node: ast.AstSymbolNode, mypy_type: MypyTypes.Instance
392
400
  ) -> None:
393
401
  """Get type info from mypy type Instance."""
394
- node.sym_info = ast.SymbolInfo(str(mypy_type))
402
+ node.name_spec.sym_type = str(mypy_type)
395
403
 
396
404
  def get_type_from_callable_type(
397
405
  self, node: ast.AstSymbolNode, mypy_type: MypyTypes.CallableType
398
406
  ) -> None:
399
407
  """Get type info from mypy type CallableType."""
400
- node.sym_info = ast.SymbolInfo(str(mypy_type.ret_type))
408
+ node.name_spec.sym_type = str(mypy_type.ret_type)
401
409
 
402
410
  # TODO: Which overloaded function to get the return value from?
403
411
  def get_type_from_overloaded(
@@ -410,16 +418,49 @@ class FuseTypeInfoPass(Pass):
410
418
  self, node: ast.AstSymbolNode, mypy_type: MypyTypes.NoneType
411
419
  ) -> None:
412
420
  """Get type info from mypy type NoneType."""
413
- node.sym_info = ast.SymbolInfo("None")
421
+ node.name_spec.sym_type = "None"
414
422
 
415
423
  def get_type_from_any_type(
416
424
  self, node: ast.AstSymbolNode, mypy_type: MypyTypes.AnyType
417
425
  ) -> None:
418
426
  """Get type info from mypy type NoneType."""
419
- node.sym_info = ast.SymbolInfo("Any")
427
+ node.name_spec.sym_type = "Any"
420
428
 
421
429
  def get_type_from_tuple_type(
422
430
  self, node: ast.AstSymbolNode, mypy_type: MypyTypes.TupleType
423
431
  ) -> None:
424
432
  """Get type info from mypy type TupleType."""
425
- 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()
@@ -63,6 +63,8 @@ class JacImportPass(Pass):
63
63
 
64
64
  def __annex_impl(self, node: ast.Module) -> None:
65
65
  """Annex impl and test modules."""
66
+ if node.stub_only:
67
+ return
66
68
  if not node.loc.mod_path:
67
69
  self.error("Module has no path")
68
70
  if not node.loc.mod_path.endswith(".jac"):
@@ -105,7 +107,7 @@ class JacImportPass(Pass):
105
107
  ) and cur_file.endswith(".test.jac"):
106
108
  mod = self.import_jac_mod_from_file(cur_file)
107
109
  if mod:
108
- node.test_mod = mod
110
+ node.test_mod.append(mod)
109
111
  node.add_kids_right([mod], pos_update=False)
110
112
  mod.parent = node
111
113
 
@@ -167,6 +169,7 @@ class JacImportPass(Pass):
167
169
  doc=None,
168
170
  body=[],
169
171
  is_imported=False,
172
+ stub_only=True,
170
173
  kid=[ast.EmptyToken()],
171
174
  )
172
175
 
@@ -201,15 +204,17 @@ class JacImportPass(Pass):
201
204
  class PyImportPass(JacImportPass):
202
205
  """Jac statically imports Python modules."""
203
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
+
204
214
  def process_import(self, node: ast.Module, i: ast.ModulePath) -> None:
205
215
  """Process an import."""
206
216
  lang = i.parent_of_type(ast.Import).hint.tag.value
207
- if (
208
- lang == "py"
209
- and not i.sub_module
210
- and settings.py_raise
211
- and not is_standard_lib_module(i.path_str)
212
- ):
217
+ if lang == "py" and not i.sub_module and not is_standard_lib_module(i.path_str):
213
218
  mod = self.import_py_module(node=i, mod_path=node.loc.mod_path)
214
219
  if mod:
215
220
  i.sub_module = mod