jaclang 0.7.2__py3-none-any.whl → 0.7.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of jaclang might be problematic. Click here for more details.
- jaclang/cli/cli.py +2 -2
- jaclang/compiler/absyntree.py +499 -294
- jaclang/compiler/codeloc.py +2 -2
- jaclang/compiler/constant.py +100 -2
- jaclang/compiler/jac.lark +27 -19
- jaclang/compiler/parser.py +119 -92
- jaclang/compiler/passes/main/access_modifier_pass.py +20 -12
- jaclang/compiler/passes/main/def_impl_match_pass.py +28 -14
- jaclang/compiler/passes/main/def_use_pass.py +59 -40
- jaclang/compiler/passes/main/fuse_typeinfo_pass.py +65 -43
- jaclang/compiler/passes/main/import_pass.py +8 -6
- jaclang/compiler/passes/main/pyast_gen_pass.py +97 -42
- jaclang/compiler/passes/main/pyast_load_pass.py +47 -12
- jaclang/compiler/passes/main/pyjac_ast_link_pass.py +19 -10
- jaclang/compiler/passes/main/registry_pass.py +6 -6
- jaclang/compiler/passes/main/sub_node_tab_pass.py +0 -5
- jaclang/compiler/passes/main/sym_tab_build_pass.py +43 -235
- jaclang/compiler/passes/main/tests/test_decl_def_match_pass.py +21 -4
- jaclang/compiler/passes/main/tests/test_def_use_pass.py +5 -10
- jaclang/compiler/passes/main/type_check_pass.py +2 -1
- jaclang/compiler/passes/tool/jac_formatter_pass.py +30 -9
- jaclang/compiler/passes/tool/tests/fixtures/corelib.jac +16 -0
- jaclang/compiler/passes/tool/tests/fixtures/corelib_fmt.jac +16 -0
- jaclang/compiler/passes/tool/tests/fixtures/genai/essay_review.jac +1 -1
- jaclang/compiler/passes/tool/tests/fixtures/genai/expert_answer.jac +1 -1
- jaclang/compiler/passes/tool/tests/fixtures/genai/joke_gen.jac +1 -1
- jaclang/compiler/passes/tool/tests/fixtures/genai/odd_word_out.jac +1 -1
- jaclang/compiler/passes/tool/tests/fixtures/genai/personality_finder.jac +1 -1
- jaclang/compiler/passes/tool/tests/fixtures/genai/text_to_type.jac +1 -1
- jaclang/compiler/passes/tool/tests/fixtures/genai/translator.jac +1 -1
- jaclang/compiler/passes/tool/tests/fixtures/genai/wikipedia.jac +1 -1
- jaclang/compiler/passes/transform.py +2 -4
- jaclang/{core/registry.py → compiler/semtable.py} +1 -3
- jaclang/compiler/symtable.py +142 -101
- jaclang/compiler/tests/test_parser.py +2 -2
- jaclang/core/aott.py +15 -11
- jaclang/core/{construct.py → architype.py} +25 -240
- jaclang/core/constructs.py +44 -0
- jaclang/core/context.py +157 -0
- jaclang/core/importer.py +18 -9
- jaclang/core/memory.py +99 -0
- jaclang/core/test.py +90 -0
- jaclang/core/utils.py +2 -2
- jaclang/langserve/engine.py +127 -50
- jaclang/langserve/server.py +34 -61
- jaclang/langserve/tests/fixtures/base_module_structure.jac +28 -0
- jaclang/langserve/tests/fixtures/circle.jac +16 -12
- jaclang/langserve/tests/fixtures/circle_err.jac +3 -3
- jaclang/langserve/tests/fixtures/circle_pure.test.jac +15 -0
- jaclang/langserve/tests/fixtures/import_include_statements.jac +6 -0
- jaclang/langserve/tests/fixtures/py_import.py +26 -0
- jaclang/langserve/tests/test_server.py +93 -18
- jaclang/langserve/utils.py +124 -10
- jaclang/plugin/builtin.py +1 -1
- jaclang/plugin/default.py +23 -9
- jaclang/plugin/feature.py +25 -7
- jaclang/plugin/spec.py +18 -20
- jaclang/settings.py +3 -0
- jaclang/tests/fixtures/abc.jac +16 -12
- jaclang/tests/fixtures/aott_raise.jac +1 -1
- jaclang/tests/fixtures/byllmissue.jac +9 -0
- jaclang/tests/fixtures/edgetypeissue.jac +10 -0
- jaclang/tests/fixtures/hello.jac +1 -1
- jaclang/tests/fixtures/impl_match_confused.impl.jac +1 -0
- jaclang/tests/fixtures/impl_match_confused.jac +5 -0
- jaclang/tests/fixtures/maxfail_run_test.jac +17 -5
- jaclang/tests/fixtures/run_test.jac +17 -5
- jaclang/tests/fixtures/with_llm_function.jac +1 -1
- jaclang/tests/fixtures/with_llm_lower.jac +1 -1
- jaclang/tests/fixtures/with_llm_method.jac +1 -1
- jaclang/tests/fixtures/with_llm_type.jac +1 -1
- jaclang/tests/fixtures/with_llm_vision.jac +1 -1
- jaclang/tests/test_bugs.py +19 -0
- jaclang/tests/test_cli.py +1 -1
- jaclang/tests/test_language.py +161 -96
- jaclang/tests/test_reference.py +1 -1
- jaclang/utils/lang_tools.py +5 -4
- jaclang/utils/test.py +2 -1
- jaclang/utils/treeprinter.py +22 -8
- {jaclang-0.7.2.dist-info → jaclang-0.7.6.dist-info}/METADATA +1 -1
- {jaclang-0.7.2.dist-info → jaclang-0.7.6.dist-info}/RECORD +83 -80
- jaclang/core/llms/__init__.py +0 -20
- jaclang/core/llms/anthropic.py +0 -90
- jaclang/core/llms/base.py +0 -206
- jaclang/core/llms/groq.py +0 -70
- jaclang/core/llms/huggingface.py +0 -76
- jaclang/core/llms/ollama.py +0 -81
- jaclang/core/llms/openai.py +0 -65
- jaclang/core/llms/togetherai.py +0 -63
- jaclang/core/llms/utils.py +0 -9
- {jaclang-0.7.2.dist-info → jaclang-0.7.6.dist-info}/WHEEL +0 -0
- {jaclang-0.7.2.dist-info → jaclang-0.7.6.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.
|
|
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
|
|
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(
|
|
50
|
-
lookup
|
|
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
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
|
13
|
+
from jaclang.compiler.passes import Pass
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
class DefUsePass(
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
def
|
|
37
|
-
"""
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
118
|
+
i.sym_tab.chain_def_insert(i.as_attr_list)
|
|
101
119
|
elif isinstance(i, ast.AstSymbolNode):
|
|
102
|
-
|
|
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
|
-
|
|
133
|
+
node.target.sym_tab.chain_def_insert(node.target.as_attr_list)
|
|
116
134
|
elif isinstance(node.target, ast.AstSymbolNode):
|
|
117
|
-
|
|
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 =
|
|
129
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
300
|
+
node.target.sym_tab.chain_def_insert(node.target.as_attr_list)
|
|
282
301
|
elif isinstance(node.target, ast.AstSymbolNode):
|
|
283
|
-
|
|
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
|
-
|
|
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
|
-
|
|
332
|
+
node.alias.sym_tab.chain_def_insert(node.alias.as_attr_list)
|
|
314
333
|
elif isinstance(node.alias, ast.AstSymbolNode):
|
|
315
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
149
|
+
node.name_spec.sym_type = "types.ModuleType"
|
|
149
150
|
|
|
150
151
|
elif isinstance(mypy_node, MypyNodes.TypeInfo):
|
|
151
|
-
node.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
283
|
-
node.
|
|
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.
|
|
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.
|
|
289
|
+
node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
|
|
301
290
|
else:
|
|
302
|
-
node.
|
|
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.
|
|
298
|
+
node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
|
|
310
299
|
else:
|
|
311
|
-
node.
|
|
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.
|
|
307
|
+
node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
|
|
319
308
|
else:
|
|
320
|
-
node.
|
|
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.
|
|
316
|
+
node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
|
|
328
317
|
else:
|
|
329
|
-
node.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|