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.
- jaclang/cli/cli.py +2 -2
- jaclang/compiler/absyntree.py +539 -297
- 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 +32 -12
- jaclang/compiler/passes/main/def_use_pass.py +59 -40
- jaclang/compiler/passes/main/fuse_typeinfo_pass.py +71 -30
- jaclang/compiler/passes/main/import_pass.py +12 -7
- jaclang/compiler/passes/main/pyast_gen_pass.py +110 -47
- jaclang/compiler/passes/main/pyast_load_pass.py +49 -13
- jaclang/compiler/passes/main/pyjac_ast_link_pass.py +25 -11
- jaclang/compiler/passes/main/pyout_pass.py +3 -1
- 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/tests/test_import_pass.py +8 -0
- jaclang/compiler/passes/main/tests/test_type_check_pass.py +1 -1
- jaclang/compiler/passes/main/type_check_pass.py +2 -1
- jaclang/compiler/passes/tool/jac_formatter_pass.py +44 -11
- 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/doc_string.jac +15 -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/tool/tests/test_jac_format_pass.py +7 -5
- jaclang/compiler/passes/tool/tests/test_unparse_validate.py +1 -2
- jaclang/compiler/passes/transform.py +2 -4
- jaclang/{core/registry.py → compiler/semtable.py} +1 -3
- jaclang/compiler/symtable.py +150 -89
- jaclang/compiler/tests/test_parser.py +2 -2
- jaclang/core/aott.py +118 -18
- jaclang/core/{construct.py → architype.py} +44 -93
- jaclang/core/constructs.py +44 -0
- jaclang/core/context.py +157 -0
- jaclang/core/importer.py +18 -9
- jaclang/core/memory.py +53 -2
- jaclang/core/test.py +90 -0
- jaclang/core/utils.py +2 -2
- jaclang/langserve/engine.py +199 -138
- jaclang/langserve/server.py +48 -53
- 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.impl.jac +8 -4
- jaclang/langserve/tests/fixtures/circle_pure.jac +2 -2
- 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 +200 -2
- jaclang/langserve/utils.py +214 -10
- jaclang/plugin/builtin.py +1 -1
- jaclang/plugin/default.py +48 -92
- jaclang/plugin/feature.py +33 -17
- jaclang/plugin/spec.py +18 -20
- jaclang/plugin/tests/test_features.py +0 -33
- jaclang/settings.py +4 -0
- jaclang/tests/fixtures/abc.jac +16 -12
- jaclang/tests/fixtures/aott_raise.jac +1 -1
- jaclang/tests/fixtures/byllmissue.jac +12 -0
- jaclang/tests/fixtures/edgetypeissue.jac +10 -0
- jaclang/tests/fixtures/hash_init_check.jac +17 -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/math_question.jpg +0 -0
- jaclang/tests/fixtures/maxfail_run_test.jac +17 -5
- jaclang/tests/fixtures/nosigself.jac +19 -0
- jaclang/tests/fixtures/run_test.jac +17 -5
- jaclang/tests/fixtures/walker_override.jac +21 -0
- 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 +25 -0
- jaclang/tests/test_bugs.py +19 -0
- jaclang/tests/test_cli.py +1 -1
- jaclang/tests/test_language.py +197 -82
- jaclang/tests/test_reference.py +1 -1
- jaclang/utils/lang_tools.py +5 -4
- jaclang/utils/test.py +2 -1
- jaclang/utils/treeprinter.py +35 -4
- {jaclang-0.7.1.dist-info → jaclang-0.7.7.dist-info}/METADATA +3 -2
- {jaclang-0.7.1.dist-info → jaclang-0.7.7.dist-info}/RECORD +96 -88
- jaclang/core/llms/__init__.py +0 -20
- jaclang/core/llms/anthropic.py +0 -61
- jaclang/core/llms/base.py +0 -206
- jaclang/core/llms/groq.py +0 -67
- jaclang/core/llms/huggingface.py +0 -73
- jaclang/core/llms/ollama.py +0 -78
- jaclang/core/llms/openai.py +0 -61
- jaclang/core/llms/togetherai.py +0 -60
- jaclang/core/llms/utils.py +0 -9
- jaclang/core/shelve_storage.py +0 -55
- {jaclang-0.7.1.dist-info → jaclang-0.7.7.dist-info}/WHEEL +0 -0
- {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
|
|
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.
|
|
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 sym.
|
|
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
|
-
#
|
|
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(
|
|
49
|
-
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
|
+
)
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
|
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(
|
|
@@ -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
|
-
|
|
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.
|
|
149
|
+
node.name_spec.sym_type = "types.ModuleType"
|
|
147
150
|
|
|
148
151
|
elif isinstance(mypy_node, MypyNodes.TypeInfo):
|
|
149
|
-
node.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
289
|
+
node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
|
|
282
290
|
else:
|
|
283
|
-
node.
|
|
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.
|
|
298
|
+
node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
|
|
291
299
|
else:
|
|
292
|
-
node.
|
|
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.
|
|
307
|
+
node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
|
|
300
308
|
else:
|
|
301
|
-
node.
|
|
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.
|
|
316
|
+
node.name_spec.sym_type = str(self.node_type_hash[mypy_node])
|
|
309
317
|
else:
|
|
310
|
-
node.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|