jaclang 0.7.28__py3-none-any.whl → 0.7.30__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/compiler/__init__.py +1 -1
- jaclang/compiler/absyntree.py +12 -2
- jaclang/compiler/compile.py +1 -1
- jaclang/compiler/constant.py +0 -1
- jaclang/compiler/jac.lark +1 -5
- jaclang/compiler/parser.py +2 -10
- jaclang/compiler/passes/main/import_pass.py +2 -2
- jaclang/compiler/passes/main/pyast_gen_pass.py +0 -19
- jaclang/compiler/passes/main/tests/test_import_pass.py +4 -1
- jaclang/compiler/passes/tool/jac_formatter_pass.py +0 -1
- jaclang/compiler/tests/test_importer.py +45 -1
- jaclang/plugin/default.py +75 -59
- jaclang/plugin/feature.py +0 -5
- jaclang/plugin/spec.py +0 -6
- jaclang/runtimelib/architype.py +20 -16
- jaclang/runtimelib/importer.py +26 -3
- jaclang/runtimelib/machine.py +2 -2
- jaclang/runtimelib/utils.py +15 -0
- jaclang/tests/fixtures/visit_sequence.jac +50 -0
- jaclang/tests/test_cli.py +1 -1
- jaclang/tests/test_language.py +17 -2
- jaclang/utils/test.py +2 -2
- jaclang/utils/tests/test_lang_tools.py +4 -2
- {jaclang-0.7.28.dist-info → jaclang-0.7.30.dist-info}/METADATA +2 -2
- {jaclang-0.7.28.dist-info → jaclang-0.7.30.dist-info}/RECORD +27 -26
- {jaclang-0.7.28.dist-info → jaclang-0.7.30.dist-info}/WHEEL +1 -1
- {jaclang-0.7.28.dist-info → jaclang-0.7.30.dist-info}/entry_points.txt +0 -0
jaclang/compiler/__init__.py
CHANGED
|
@@ -55,7 +55,7 @@ TOKEN_MAP.update(
|
|
|
55
55
|
"CARROW_L": "<++", "CARROW_R": "++>", "GLOBAL_OP": ":global:",
|
|
56
56
|
"NONLOCAL_OP": ":nonlocal:", "WALKER_OP": ":walker:", "NODE_OP": ":node:",
|
|
57
57
|
"EDGE_OP": ":edge:", "CLASS_OP": ":class:", "OBJECT_OP": ":obj:",
|
|
58
|
-
"TYPE_OP": "`", "ABILITY_OP": ":can:", "
|
|
58
|
+
"TYPE_OP": "`", "ABILITY_OP": ":can:", "NULL_OK": "?",
|
|
59
59
|
"KW_OR": "|", "ARROW_BI": "<-->", "ARROW_L": "<--",
|
|
60
60
|
"ARROW_R": "-->", "ARROW_L_P1": "<-:", "ARROW_R_P2": ":->",
|
|
61
61
|
"ARROW_L_P2": ":-", "ARROW_R_P1": "-:", "CARROW_BI": "<++>",
|
jaclang/compiler/absyntree.py
CHANGED
|
@@ -1013,8 +1013,9 @@ class ModulePath(AstSymbolNode):
|
|
|
1013
1013
|
target = self.dot_path_str
|
|
1014
1014
|
if target_item:
|
|
1015
1015
|
target += f".{target_item}"
|
|
1016
|
-
base_path =
|
|
1017
|
-
|
|
1016
|
+
base_path = (
|
|
1017
|
+
os.getenv("JACPATH") or os.path.dirname(self.loc.mod_path) or os.getcwd()
|
|
1018
|
+
)
|
|
1018
1019
|
parts = target.split(".")
|
|
1019
1020
|
traversal_levels = self.level - 1 if self.level > 0 else 0
|
|
1020
1021
|
actual_parts = parts[traversal_levels:]
|
|
@@ -1026,6 +1027,15 @@ class ModulePath(AstSymbolNode):
|
|
|
1026
1027
|
if os.path.exists(relative_path + ".jac")
|
|
1027
1028
|
else relative_path
|
|
1028
1029
|
)
|
|
1030
|
+
jacpath = os.getenv("JACPATH")
|
|
1031
|
+
if not os.path.exists(relative_path) and jacpath:
|
|
1032
|
+
name_to_find = actual_parts[-1] + ".jac"
|
|
1033
|
+
|
|
1034
|
+
# Walk through the single path in JACPATH
|
|
1035
|
+
for root, _, files in os.walk(jacpath):
|
|
1036
|
+
if name_to_find in files:
|
|
1037
|
+
relative_path = os.path.join(root, name_to_find)
|
|
1038
|
+
break
|
|
1029
1039
|
return relative_path
|
|
1030
1040
|
|
|
1031
1041
|
def normalize(self, deep: bool = False) -> bool:
|
jaclang/compiler/compile.py
CHANGED
|
@@ -31,7 +31,7 @@ def jac_file_to_pass(
|
|
|
31
31
|
schedule: list[Type[Pass]] = pass_schedule,
|
|
32
32
|
) -> Pass:
|
|
33
33
|
"""Convert a Jac file to an AST."""
|
|
34
|
-
with open(file_path) as file:
|
|
34
|
+
with open(file_path, "r", encoding="utf-8") as file:
|
|
35
35
|
return jac_str_to_pass(
|
|
36
36
|
jac_str=file.read(),
|
|
37
37
|
file_path=file_path,
|
jaclang/compiler/constant.py
CHANGED
jaclang/compiler/jac.lark
CHANGED
|
@@ -298,10 +298,7 @@ lambda_expr: KW_WITH func_decl_params? (RETURN_HINT expression)? KW_CAN expressi
|
|
|
298
298
|
pipe: (pipe PIPE_FWD)? pipe_back
|
|
299
299
|
|
|
300
300
|
// Pipe back expressions
|
|
301
|
-
pipe_back: (pipe_back PIPE_BKWD)?
|
|
302
|
-
|
|
303
|
-
// Elvis expressions
|
|
304
|
-
elvis_check: (elvis_check ELVIS_OP)? bitwise_or
|
|
301
|
+
pipe_back: (pipe_back PIPE_BKWD)? bitwise_or
|
|
305
302
|
|
|
306
303
|
// Bitwise expressions
|
|
307
304
|
bitwise_or: (bitwise_or BW_OR)? bitwise_xor
|
|
@@ -599,7 +596,6 @@ PIPE_BKWD: /<\|/
|
|
|
599
596
|
DOT_FWD: /\.>/
|
|
600
597
|
DOT_BKWD: /<\./
|
|
601
598
|
RETURN_HINT: /->/
|
|
602
|
-
ELVIS_OP: /\?:/
|
|
603
599
|
NULL_OK: /\?/
|
|
604
600
|
MATMUL_EQ: /@=/
|
|
605
601
|
DECOR_OP: /@/
|
jaclang/compiler/parser.py
CHANGED
|
@@ -2037,16 +2037,8 @@ class JacParser(Pass):
|
|
|
2037
2037
|
def pipe_back(self, kid: list[ast.AstNode]) -> ast.Expr:
|
|
2038
2038
|
"""Grammar rule.
|
|
2039
2039
|
|
|
2040
|
-
pipe_back:
|
|
2041
|
-
|
|
|
2042
|
-
"""
|
|
2043
|
-
return self.binary_expr_unwind(kid)
|
|
2044
|
-
|
|
2045
|
-
def elvis_check(self, kid: list[ast.AstNode]) -> ast.Expr:
|
|
2046
|
-
"""Grammar rule.
|
|
2047
|
-
|
|
2048
|
-
elvis_check: bitwise_or ELVIS_OP elvis_check
|
|
2049
|
-
| bitwise_or
|
|
2040
|
+
pipe_back: bitwise_or PIPE_BKWD pipe_back
|
|
2041
|
+
| bitwise_or
|
|
2050
2042
|
"""
|
|
2051
2043
|
return self.binary_expr_unwind(kid)
|
|
2052
2044
|
|
|
@@ -186,7 +186,7 @@ class JacImportPass(Pass):
|
|
|
186
186
|
self.warnings_had += mod_pass.warnings_had
|
|
187
187
|
mod = mod_pass.ir
|
|
188
188
|
except Exception as e:
|
|
189
|
-
logger.
|
|
189
|
+
logger.error(e)
|
|
190
190
|
mod = None
|
|
191
191
|
if isinstance(mod, ast.Module):
|
|
192
192
|
self.import_table[target] = mod
|
|
@@ -472,7 +472,7 @@ class PyImportPass(JacImportPass):
|
|
|
472
472
|
if mod:
|
|
473
473
|
mod.name = imported_mod_name if imported_mod_name else mod.name
|
|
474
474
|
if mod.name == "__init__":
|
|
475
|
-
mod_name = mod.loc.mod_path.split(
|
|
475
|
+
mod_name = mod.loc.mod_path.split(os.sep)[-2]
|
|
476
476
|
self.__debug_print(
|
|
477
477
|
f"\tRaised the __init__ file and rename the mod to be {mod_name}"
|
|
478
478
|
)
|
|
@@ -2482,25 +2482,6 @@ class PyastGenPass(Pass):
|
|
|
2482
2482
|
return func_node.gen.py_ast
|
|
2483
2483
|
elif node.op.name == Tok.PIPE_FWD and isinstance(node.right, ast.TupleVal):
|
|
2484
2484
|
self.error("Invalid pipe target.")
|
|
2485
|
-
elif node.op.name == Tok.ELVIS_OP:
|
|
2486
|
-
self.needs_jac_feature()
|
|
2487
|
-
return [
|
|
2488
|
-
self.sync(
|
|
2489
|
-
ast3.Call(
|
|
2490
|
-
func=self.sync(
|
|
2491
|
-
ast3.Attribute(
|
|
2492
|
-
value=self.sync(
|
|
2493
|
-
ast3.Name(id=Con.JAC_FEATURE.value, ctx=ast3.Load())
|
|
2494
|
-
),
|
|
2495
|
-
attr="elvis",
|
|
2496
|
-
ctx=ast3.Load(),
|
|
2497
|
-
)
|
|
2498
|
-
),
|
|
2499
|
-
args=[node.left.gen.py_ast[0], node.right.gen.py_ast[0]],
|
|
2500
|
-
keywords=[],
|
|
2501
|
-
)
|
|
2502
|
-
)
|
|
2503
|
-
]
|
|
2504
2485
|
else:
|
|
2505
2486
|
self.error(
|
|
2506
2487
|
f"Binary operator {node.op.value} not supported in bootstrap Jac"
|
|
@@ -83,7 +83,10 @@ class ImportPassPassTests(TestCase):
|
|
|
83
83
|
for i in p:
|
|
84
84
|
self.assertIn(i, build.ir.py_info.py_raise_map)
|
|
85
85
|
self.assertRegex(
|
|
86
|
-
re.sub(r".*fixtures/", "", build.ir.py_info.py_raise_map[i])
|
|
86
|
+
re.sub(r".*fixtures/", "", build.ir.py_info.py_raise_map[i]).replace(
|
|
87
|
+
"\\", "/"
|
|
88
|
+
),
|
|
89
|
+
p[i],
|
|
87
90
|
)
|
|
88
91
|
|
|
89
92
|
def test_py_raised_mods(self) -> None:
|
|
@@ -33,7 +33,7 @@ class TestLoader(TestCase):
|
|
|
33
33
|
)
|
|
34
34
|
self.assertIn(
|
|
35
35
|
"/tests/fixtures/hello_world.jac",
|
|
36
|
-
str(JacMachine.get().loaded_modules),
|
|
36
|
+
str(JacMachine.get().loaded_modules).replace("\\\\", "/"),
|
|
37
37
|
)
|
|
38
38
|
JacMachine.detach()
|
|
39
39
|
|
|
@@ -62,3 +62,47 @@ class TestLoader(TestCase):
|
|
|
62
62
|
"{SomeObj(a=10): 'check'} [MyObj(apple=5, banana=7), MyObj(apple=5, banana=7)]",
|
|
63
63
|
stdout_value,
|
|
64
64
|
)
|
|
65
|
+
|
|
66
|
+
def test_import_with_jacpath(self) -> None:
|
|
67
|
+
"""Test module import using JACPATH."""
|
|
68
|
+
# Set up a temporary JACPATH environment variable
|
|
69
|
+
import os
|
|
70
|
+
import tempfile
|
|
71
|
+
|
|
72
|
+
jacpath_dir = tempfile.TemporaryDirectory()
|
|
73
|
+
os.environ["JACPATH"] = jacpath_dir.name
|
|
74
|
+
|
|
75
|
+
# Create a mock Jac file in the JACPATH directory
|
|
76
|
+
module_name = "test_module"
|
|
77
|
+
jac_file_path = os.path.join(jacpath_dir.name, f"{module_name}.jac")
|
|
78
|
+
with open(jac_file_path, "w") as f:
|
|
79
|
+
f.write(
|
|
80
|
+
"""
|
|
81
|
+
with entry {
|
|
82
|
+
"Hello from JACPATH!" :> print;
|
|
83
|
+
}
|
|
84
|
+
"""
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
# Capture the output
|
|
88
|
+
captured_output = io.StringIO()
|
|
89
|
+
sys.stdout = captured_output
|
|
90
|
+
|
|
91
|
+
try:
|
|
92
|
+
JacMachine(self.fixture_abs_path(__file__)).attach_program(
|
|
93
|
+
JacProgram(mod_bundle=None, bytecode=None, sem_ir=None)
|
|
94
|
+
)
|
|
95
|
+
jac_import(module_name, base_path=__file__)
|
|
96
|
+
cli.run(jac_file_path)
|
|
97
|
+
|
|
98
|
+
# Reset stdout and get the output
|
|
99
|
+
sys.stdout = sys.__stdout__
|
|
100
|
+
stdout_value = captured_output.getvalue()
|
|
101
|
+
|
|
102
|
+
self.assertIn("Hello from JACPATH!", stdout_value)
|
|
103
|
+
|
|
104
|
+
finally:
|
|
105
|
+
captured_output.close()
|
|
106
|
+
JacMachine.detach()
|
|
107
|
+
os.environ.pop("JACPATH", None)
|
|
108
|
+
jacpath_dir.cleanup()
|
jaclang/plugin/default.py
CHANGED
|
@@ -43,8 +43,11 @@ from jaclang.runtimelib.constructs import (
|
|
|
43
43
|
from jaclang.runtimelib.importer import ImportPathSpec, JacImporter, PythonImporter
|
|
44
44
|
from jaclang.runtimelib.machine import JacMachine, JacProgram
|
|
45
45
|
from jaclang.runtimelib.memory import Shelf, ShelfStorage
|
|
46
|
-
from jaclang.runtimelib.utils import
|
|
47
|
-
|
|
46
|
+
from jaclang.runtimelib.utils import (
|
|
47
|
+
all_issubclass,
|
|
48
|
+
collect_node_connections,
|
|
49
|
+
traverse_graph,
|
|
50
|
+
)
|
|
48
51
|
|
|
49
52
|
import pluggy
|
|
50
53
|
|
|
@@ -176,14 +179,12 @@ class JacAccessValidationImpl:
|
|
|
176
179
|
if to_root.access.all > access_level:
|
|
177
180
|
access_level = to_root.access.all
|
|
178
181
|
|
|
179
|
-
level
|
|
180
|
-
if level > AccessLevel.NO_ACCESS and access_level == AccessLevel.NO_ACCESS:
|
|
182
|
+
if (level := to_root.access.roots.check(str(jroot.id))) is not None:
|
|
181
183
|
access_level = level
|
|
182
184
|
|
|
183
185
|
# if target anchor have set allowed roots
|
|
184
186
|
# if current root is allowed to target anchor
|
|
185
|
-
level
|
|
186
|
-
if level > AccessLevel.NO_ACCESS and access_level == AccessLevel.NO_ACCESS:
|
|
187
|
+
if (level := to_access.roots.check(str(jroot.id))) is not None:
|
|
187
188
|
access_level = level
|
|
188
189
|
|
|
189
190
|
return access_level
|
|
@@ -399,64 +400,85 @@ class JacWalkerImpl:
|
|
|
399
400
|
|
|
400
401
|
walker.path = []
|
|
401
402
|
walker.next = [node]
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
403
|
+
current_node = node.architype
|
|
404
|
+
|
|
405
|
+
# walker entry
|
|
406
|
+
for i in warch._jac_entry_funcs_:
|
|
407
|
+
if i.func and not i.trigger:
|
|
408
|
+
i.func(warch, current_node)
|
|
409
|
+
if walker.disengaged:
|
|
410
|
+
return warch
|
|
411
|
+
|
|
411
412
|
while len(walker.next):
|
|
412
413
|
if current_node := walker.next.pop(0).architype:
|
|
414
|
+
# walker entry with
|
|
415
|
+
for i in warch._jac_entry_funcs_:
|
|
416
|
+
if (
|
|
417
|
+
i.func
|
|
418
|
+
and i.trigger
|
|
419
|
+
and all_issubclass(i.trigger, NodeArchitype)
|
|
420
|
+
and isinstance(current_node, i.trigger)
|
|
421
|
+
):
|
|
422
|
+
i.func(warch, current_node)
|
|
423
|
+
if walker.disengaged:
|
|
424
|
+
return warch
|
|
425
|
+
|
|
426
|
+
# node entry
|
|
413
427
|
for i in current_node._jac_entry_funcs_:
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
if i.func:
|
|
417
|
-
i.func(current_node, warch)
|
|
418
|
-
else:
|
|
419
|
-
raise ValueError(f"No function {i.name} to call.")
|
|
428
|
+
if i.func and not i.trigger:
|
|
429
|
+
i.func(current_node, warch)
|
|
420
430
|
if walker.disengaged:
|
|
421
431
|
return warch
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
432
|
+
|
|
433
|
+
# node entry with
|
|
434
|
+
for i in current_node._jac_entry_funcs_:
|
|
435
|
+
if (
|
|
436
|
+
i.func
|
|
437
|
+
and i.trigger
|
|
438
|
+
and all_issubclass(i.trigger, WalkerArchitype)
|
|
439
|
+
and isinstance(warch, i.trigger)
|
|
440
|
+
):
|
|
441
|
+
i.func(current_node, warch)
|
|
431
442
|
if walker.disengaged:
|
|
432
443
|
return warch
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
444
|
+
|
|
445
|
+
# node exit with
|
|
446
|
+
for i in current_node._jac_exit_funcs_:
|
|
447
|
+
if (
|
|
448
|
+
i.func
|
|
449
|
+
and i.trigger
|
|
450
|
+
and all_issubclass(i.trigger, WalkerArchitype)
|
|
451
|
+
and isinstance(warch, i.trigger)
|
|
452
|
+
):
|
|
453
|
+
i.func(current_node, warch)
|
|
442
454
|
if walker.disengaged:
|
|
443
455
|
return warch
|
|
456
|
+
|
|
457
|
+
# node exit
|
|
444
458
|
for i in current_node._jac_exit_funcs_:
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
if i.func:
|
|
448
|
-
i.func(current_node, warch)
|
|
449
|
-
else:
|
|
450
|
-
raise ValueError(f"No function {i.name} to call.")
|
|
459
|
+
if i.func and not i.trigger:
|
|
460
|
+
i.func(current_node, warch)
|
|
451
461
|
if walker.disengaged:
|
|
452
462
|
return warch
|
|
463
|
+
|
|
464
|
+
# walker exit with
|
|
465
|
+
for i in warch._jac_exit_funcs_:
|
|
466
|
+
if (
|
|
467
|
+
i.func
|
|
468
|
+
and i.trigger
|
|
469
|
+
and all_issubclass(i.trigger, NodeArchitype)
|
|
470
|
+
and isinstance(current_node, i.trigger)
|
|
471
|
+
):
|
|
472
|
+
i.func(warch, current_node)
|
|
473
|
+
if walker.disengaged:
|
|
474
|
+
return warch
|
|
475
|
+
# walker exit
|
|
453
476
|
for i in warch._jac_exit_funcs_:
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
raise ValueError(f"No function {i.name} to call.")
|
|
477
|
+
if i.func and not i.trigger:
|
|
478
|
+
i.func(warch, current_node)
|
|
479
|
+
if walker.disengaged:
|
|
480
|
+
return warch
|
|
481
|
+
|
|
460
482
|
walker.ignores = []
|
|
461
483
|
return warch
|
|
462
484
|
|
|
@@ -896,12 +918,6 @@ class JacFeatureImpl(
|
|
|
896
918
|
|
|
897
919
|
return ret_count
|
|
898
920
|
|
|
899
|
-
@staticmethod
|
|
900
|
-
@hookimpl
|
|
901
|
-
def elvis(op1: Optional[T], op2: T) -> T:
|
|
902
|
-
"""Jac's elvis operator feature."""
|
|
903
|
-
return ret if (ret := op1) is not None else op2
|
|
904
|
-
|
|
905
921
|
@staticmethod
|
|
906
922
|
@hookimpl
|
|
907
923
|
def has_instance_default(gen_func: Callable[[], T]) -> T:
|
|
@@ -1008,7 +1024,7 @@ class JacFeatureImpl(
|
|
|
1008
1024
|
dir in [EdgeDir.OUT, EdgeDir.ANY]
|
|
1009
1025
|
and node == source
|
|
1010
1026
|
and target.architype in right
|
|
1011
|
-
and Jac.
|
|
1027
|
+
and Jac.check_connect_access(target)
|
|
1012
1028
|
):
|
|
1013
1029
|
Jac.destroy(anchor) if anchor.persistent else Jac.detach(anchor)
|
|
1014
1030
|
disconnect_occurred = True
|
|
@@ -1016,7 +1032,7 @@ class JacFeatureImpl(
|
|
|
1016
1032
|
dir in [EdgeDir.IN, EdgeDir.ANY]
|
|
1017
1033
|
and node == target
|
|
1018
1034
|
and source.architype in right
|
|
1019
|
-
and Jac.
|
|
1035
|
+
and Jac.check_connect_access(source)
|
|
1020
1036
|
):
|
|
1021
1037
|
Jac.destroy(anchor) if anchor.persistent else Jac.detach(anchor)
|
|
1022
1038
|
disconnect_occurred = True
|
jaclang/plugin/feature.py
CHANGED
|
@@ -377,11 +377,6 @@ class JacFeature(
|
|
|
377
377
|
verbose=verbose,
|
|
378
378
|
)
|
|
379
379
|
|
|
380
|
-
@staticmethod
|
|
381
|
-
def elvis(op1: Optional[T], op2: T) -> T:
|
|
382
|
-
"""Jac's elvis operator feature."""
|
|
383
|
-
return plugin_manager.hook.elvis(op1=op1, op2=op2)
|
|
384
|
-
|
|
385
380
|
@staticmethod
|
|
386
381
|
def has_instance_default(gen_func: Callable[[], T]) -> T:
|
|
387
382
|
"""Jac's has container default feature."""
|
jaclang/plugin/spec.py
CHANGED
|
@@ -355,12 +355,6 @@ class JacFeatureSpec(
|
|
|
355
355
|
"""Run the test suite in the specified .jac file."""
|
|
356
356
|
raise NotImplementedError
|
|
357
357
|
|
|
358
|
-
@staticmethod
|
|
359
|
-
@hookspec(firstresult=True)
|
|
360
|
-
def elvis(op1: Optional[T], op2: T) -> T:
|
|
361
|
-
"""Jac's elvis operator feature."""
|
|
362
|
-
raise NotImplementedError
|
|
363
|
-
|
|
364
358
|
@staticmethod
|
|
365
359
|
@hookspec(firstresult=True)
|
|
366
360
|
def has_instance_default(gen_func: Callable[[], T]) -> T:
|
jaclang/runtimelib/architype.py
CHANGED
|
@@ -5,6 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
import inspect
|
|
6
6
|
from dataclasses import asdict, dataclass, field, fields, is_dataclass
|
|
7
7
|
from enum import IntEnum
|
|
8
|
+
from functools import cached_property
|
|
8
9
|
from logging import getLogger
|
|
9
10
|
from pickle import dumps
|
|
10
11
|
from types import UnionType
|
|
@@ -43,9 +44,9 @@ class Access:
|
|
|
43
44
|
|
|
44
45
|
anchors: dict[str, AccessLevel] = field(default_factory=dict)
|
|
45
46
|
|
|
46
|
-
def check(self, anchor: str) -> AccessLevel:
|
|
47
|
+
def check(self, anchor: str) -> AccessLevel | None:
|
|
47
48
|
"""Validate access."""
|
|
48
|
-
return self.anchors.get(anchor
|
|
49
|
+
return self.anchors.get(anchor)
|
|
49
50
|
|
|
50
51
|
|
|
51
52
|
@dataclass
|
|
@@ -220,9 +221,9 @@ class WalkerAnchor(Anchor):
|
|
|
220
221
|
"""Walker Anchor."""
|
|
221
222
|
|
|
222
223
|
architype: WalkerArchitype
|
|
223
|
-
path: list[
|
|
224
|
-
next: list[
|
|
225
|
-
ignores: list[
|
|
224
|
+
path: list[NodeAnchor] = field(default_factory=list)
|
|
225
|
+
next: list[NodeAnchor] = field(default_factory=list)
|
|
226
|
+
ignores: list[NodeAnchor] = field(default_factory=list)
|
|
226
227
|
disengaged: bool = False
|
|
227
228
|
|
|
228
229
|
|
|
@@ -311,17 +312,20 @@ class DSFunc:
|
|
|
311
312
|
name: str
|
|
312
313
|
func: Callable[[Any, Any], Any] | None = None
|
|
313
314
|
|
|
315
|
+
@cached_property
|
|
316
|
+
def trigger(self) -> type | UnionType | tuple[type | UnionType, ...] | None:
|
|
317
|
+
"""Get function parameter annotations."""
|
|
318
|
+
t = (
|
|
319
|
+
(
|
|
320
|
+
inspect.signature(self.func, eval_str=True)
|
|
321
|
+
.parameters["_jac_here_"]
|
|
322
|
+
.annotation
|
|
323
|
+
)
|
|
324
|
+
if self.func
|
|
325
|
+
else None
|
|
326
|
+
)
|
|
327
|
+
return None if t is inspect._empty else t
|
|
328
|
+
|
|
314
329
|
def resolve(self, cls: type) -> None:
|
|
315
330
|
"""Resolve the function."""
|
|
316
331
|
self.func = getattr(cls, self.name)
|
|
317
|
-
|
|
318
|
-
def get_funcparam_annotations(
|
|
319
|
-
self, func: Callable[[Any, Any], Any] | None
|
|
320
|
-
) -> type | UnionType | tuple[type | UnionType, ...] | None:
|
|
321
|
-
"""Get function parameter annotations."""
|
|
322
|
-
if not func:
|
|
323
|
-
return None
|
|
324
|
-
annotation = (
|
|
325
|
-
inspect.signature(func, eval_str=True).parameters["_jac_here_"].annotation
|
|
326
|
-
)
|
|
327
|
-
return annotation if annotation != inspect._empty else None
|
jaclang/runtimelib/importer.py
CHANGED
|
@@ -158,9 +158,6 @@ class ImportReturn:
|
|
|
158
158
|
return getattr(new_module, name, new_module)
|
|
159
159
|
except ImportError as e:
|
|
160
160
|
logger.error(dump_traceback(e))
|
|
161
|
-
# logger.error(
|
|
162
|
-
# f"Failed to load {name} from {jac_file_path} in {module.__name__}: {str(e)}"
|
|
163
|
-
# )
|
|
164
161
|
return None
|
|
165
162
|
|
|
166
163
|
|
|
@@ -319,6 +316,32 @@ class JacImporter(Importer):
|
|
|
319
316
|
"""Run the import process for Jac modules."""
|
|
320
317
|
unique_loaded_items: list[types.ModuleType] = []
|
|
321
318
|
module = None
|
|
319
|
+
# Gather all possible search paths
|
|
320
|
+
jacpaths = os.environ.get("JACPATH", "")
|
|
321
|
+
search_paths = [spec.caller_dir]
|
|
322
|
+
if jacpaths:
|
|
323
|
+
for p in jacpaths.split(os.pathsep):
|
|
324
|
+
p = p.strip()
|
|
325
|
+
if p and p not in search_paths:
|
|
326
|
+
search_paths.append(p)
|
|
327
|
+
|
|
328
|
+
# Attempt to locate the module file or directory
|
|
329
|
+
found_path = None
|
|
330
|
+
target_path_components = spec.target.split(".")
|
|
331
|
+
for search_path in search_paths:
|
|
332
|
+
candidate = os.path.join(search_path, "/".join(target_path_components))
|
|
333
|
+
# Check if the candidate is a directory or a .jac file
|
|
334
|
+
if (os.path.isdir(candidate)) or (os.path.isfile(candidate + ".jac")):
|
|
335
|
+
found_path = candidate
|
|
336
|
+
break
|
|
337
|
+
|
|
338
|
+
# If a suitable path was found, update spec.full_target; otherwise, raise an error
|
|
339
|
+
if found_path:
|
|
340
|
+
spec.full_target = os.path.abspath(found_path)
|
|
341
|
+
else:
|
|
342
|
+
raise ImportError(
|
|
343
|
+
f"Unable to locate module '{spec.target}' in {search_paths}"
|
|
344
|
+
)
|
|
322
345
|
if os.path.isfile(spec.full_target + ".jac"):
|
|
323
346
|
module_name = self.get_sys_mod_name(spec.full_target + ".jac")
|
|
324
347
|
module_name = spec.override_name if spec.override_name else module_name
|
jaclang/runtimelib/machine.py
CHANGED
|
@@ -38,6 +38,7 @@ class JacMachine:
|
|
|
38
38
|
self.loaded_modules: dict[str, types.ModuleType] = {}
|
|
39
39
|
if not base_path:
|
|
40
40
|
base_path = os.getcwd()
|
|
41
|
+
# Ensure the base_path is a list rather than a string
|
|
41
42
|
self.base_path = base_path
|
|
42
43
|
self.base_path_dir = (
|
|
43
44
|
os.path.dirname(base_path)
|
|
@@ -306,12 +307,11 @@ class JacProgram:
|
|
|
306
307
|
return marshal.load(f)
|
|
307
308
|
|
|
308
309
|
result = compile_jac(full_target, cache_result=cachable)
|
|
309
|
-
if result.errors_had
|
|
310
|
+
if result.errors_had:
|
|
310
311
|
for alrt in result.errors_had:
|
|
311
312
|
# We're not logging here, it already gets logged as the errors were added to the errors_had list.
|
|
312
313
|
# Regardless of the logging, this needs to be sent to the end user, so we'll printing it to stderr.
|
|
313
314
|
logger.error(alrt.pretty_print())
|
|
314
|
-
return None
|
|
315
315
|
if result.ir.gen.py_bytecode is not None:
|
|
316
316
|
return marshal.loads(result.ir.gen.py_bytecode)
|
|
317
317
|
else:
|
jaclang/runtimelib/utils.py
CHANGED
|
@@ -231,3 +231,18 @@ def is_instance(
|
|
|
231
231
|
return isinstance(obj, target)
|
|
232
232
|
case _:
|
|
233
233
|
return False
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def all_issubclass(
|
|
237
|
+
classes: type | UnionType | tuple[type | UnionType, ...], target: type
|
|
238
|
+
) -> bool:
|
|
239
|
+
"""Check if all classes is subclass of target type."""
|
|
240
|
+
match classes:
|
|
241
|
+
case type():
|
|
242
|
+
return issubclass(classes, target)
|
|
243
|
+
case UnionType():
|
|
244
|
+
return all((all_issubclass(cls, target) for cls in classes.__args__))
|
|
245
|
+
case tuple():
|
|
246
|
+
return all((all_issubclass(cls, target) for cls in classes))
|
|
247
|
+
case _:
|
|
248
|
+
return False
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
node Node {
|
|
2
|
+
has val: str;
|
|
3
|
+
|
|
4
|
+
can entry1 with entry {
|
|
5
|
+
print(f"{self.val}-2");
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
can entry2 with Walker entry {
|
|
9
|
+
print(f"{self.val}-3");
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
can exit1 with Walker exit {
|
|
13
|
+
print(f"{self.val}-4");
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
can exit2 with exit {
|
|
17
|
+
print(f"{self.val}-5");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
walker Walker {
|
|
22
|
+
can entry1 with entry {
|
|
23
|
+
print("walker entry");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
can entry2 with `root entry {
|
|
27
|
+
print("walker enter to root");
|
|
28
|
+
visit [-->];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
can entry3 with Node entry {
|
|
32
|
+
print(f"{here.val}-1");
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
can exit1 with Node exit {
|
|
36
|
+
print(f"{here.val}-6");
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
can exit2 with exit {
|
|
40
|
+
print("walker exit");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
with entry{
|
|
45
|
+
root ++> Node(val = "a");
|
|
46
|
+
root ++> Node(val = "b");
|
|
47
|
+
root ++> Node(val = "c");
|
|
48
|
+
|
|
49
|
+
Walker() spawn root;
|
|
50
|
+
}
|
jaclang/tests/test_cli.py
CHANGED
|
@@ -168,7 +168,7 @@ class JacCliTests(TestCase):
|
|
|
168
168
|
cli.tool("ir", ["ast", f"{self.fixture_abs_path('import.jac')}"])
|
|
169
169
|
|
|
170
170
|
sys.stdout = sys.__stdout__
|
|
171
|
-
stdout_value = captured_output.getvalue()
|
|
171
|
+
stdout_value = captured_output.getvalue().replace("\\", "/")
|
|
172
172
|
self.assertRegex(
|
|
173
173
|
stdout_value,
|
|
174
174
|
r"1\:11 \- 1\:13.*ModulePath - os - abs_path\:.*typeshed/stdlib/os/__init__.pyi",
|
jaclang/tests/test_language.py
CHANGED
|
@@ -1230,5 +1230,20 @@ class JacLanguageTests(TestCase):
|
|
|
1230
1230
|
jac_import("architype_def_bug", base_path=self.fixture_abs_path("./"))
|
|
1231
1231
|
sys.stdout = sys.__stdout__
|
|
1232
1232
|
stdout_value = captured_output.getvalue().split("\n")
|
|
1233
|
-
self.assertIn("
|
|
1234
|
-
self.assertIn("
|
|
1233
|
+
self.assertIn("MyWalker", stdout_value[0])
|
|
1234
|
+
self.assertIn("MyNode", stdout_value[1])
|
|
1235
|
+
|
|
1236
|
+
def test_visit_sequence(self) -> None:
|
|
1237
|
+
"""Test conn assign on edges."""
|
|
1238
|
+
captured_output = io.StringIO()
|
|
1239
|
+
sys.stdout = captured_output
|
|
1240
|
+
jac_import("visit_sequence", base_path=self.fixture_abs_path("./"))
|
|
1241
|
+
sys.stdout = sys.__stdout__
|
|
1242
|
+
self.assertEqual(
|
|
1243
|
+
"walker entry\nwalker enter to root\n"
|
|
1244
|
+
"a-1\na-2\na-3\na-4\na-5\na-6\n"
|
|
1245
|
+
"b-1\nb-2\nb-3\nb-4\nb-5\nb-6\n"
|
|
1246
|
+
"c-1\nc-2\nc-3\nc-4\nc-5\nc-6\n"
|
|
1247
|
+
"walker exit\n",
|
|
1248
|
+
captured_output.getvalue(),
|
|
1249
|
+
)
|
jaclang/utils/test.py
CHANGED
|
@@ -41,12 +41,12 @@ class TestCase(_TestCase):
|
|
|
41
41
|
raise ValueError("Unable to determine the file of the module.")
|
|
42
42
|
fixture_src = module.__file__
|
|
43
43
|
fixture_path = os.path.join(os.path.dirname(fixture_src), "fixtures", fixture)
|
|
44
|
-
with open(fixture_path, "r") as f:
|
|
44
|
+
with open(fixture_path, "r", encoding="utf-8") as f:
|
|
45
45
|
return f.read()
|
|
46
46
|
|
|
47
47
|
def file_to_str(self, file_path: str) -> str:
|
|
48
48
|
"""Load fixture from fixtures directory."""
|
|
49
|
-
with open(file_path, "r") as f:
|
|
49
|
+
with open(file_path, "r", encoding="utf-8") as f:
|
|
50
50
|
return f.read()
|
|
51
51
|
|
|
52
52
|
def fixture_abs_path(self, fixture: str) -> str:
|
|
@@ -107,8 +107,10 @@ class JacFormatPassTests(TestCase):
|
|
|
107
107
|
|
|
108
108
|
def test_sym_sym_dot(self) -> None:
|
|
109
109
|
"""Testing for sym, sym. AstTool."""
|
|
110
|
-
jac_file = os.path.
|
|
111
|
-
os.path.
|
|
110
|
+
jac_file = os.path.normpath(
|
|
111
|
+
os.path.join(
|
|
112
|
+
os.path.dirname(jaclang.__file__), "../examples/reference/atom.jac"
|
|
113
|
+
)
|
|
112
114
|
)
|
|
113
115
|
out = AstTool().ir(["sym", jac_file])
|
|
114
116
|
self.assertNotIn(
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: jaclang
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.30
|
|
4
4
|
Summary: Jac is a unique and powerful programming language that runs on top of Python, offering an unprecedented level of intelligence and intuitive understanding.
|
|
5
|
-
Home-page: https://jaseci.org
|
|
6
5
|
License: MIT
|
|
7
6
|
Keywords: jac,jaclang,jaseci,python,programming-language,machine-learning,artificial-intelligence
|
|
8
7
|
Author: Jason Mars
|
|
@@ -19,6 +18,7 @@ Provides-Extra: all
|
|
|
19
18
|
Provides-Extra: llm
|
|
20
19
|
Provides-Extra: streamlit
|
|
21
20
|
Project-URL: Documentation, https://jac-lang.org
|
|
21
|
+
Project-URL: Homepage, https://jaseci.org
|
|
22
22
|
Project-URL: Repository, https://github.com/Jaseci-Labs/jaclang
|
|
23
23
|
Description-Content-Type: text/markdown
|
|
24
24
|
|
|
@@ -5,13 +5,13 @@ jaclang/cli/cli.md,sha256=4BPJGdcyvs_rXgd_DPEGjkKSGe5ureXXYaQsf-_z_LU,5939
|
|
|
5
5
|
jaclang/cli/cli.py,sha256=oOwM8tbq6HrOcYvoqBiNpT11qPkSofnlpkXXo86zAlU,16837
|
|
6
6
|
jaclang/cli/cmdreg.py,sha256=5mhzLJnpHfc0Z22qKQgcEOICgBaC95G9gSJZ-R7GqvU,8282
|
|
7
7
|
jaclang/compiler/.gitignore,sha256=n1k2_xXTorp9PY8hhYM4psHircn-NMaFx95bSgDKopo,10
|
|
8
|
-
jaclang/compiler/__init__.py,sha256=
|
|
9
|
-
jaclang/compiler/absyntree.py,sha256=
|
|
8
|
+
jaclang/compiler/__init__.py,sha256=QKNNJswgDdvn7qjvggio4BicJfCus1JCqyhsTGYN5sg,2724
|
|
9
|
+
jaclang/compiler/absyntree.py,sha256=7eiK13nNSvrdRu3brEXuF3wgBAugjBltvV79t_QnIEg,141860
|
|
10
10
|
jaclang/compiler/codeloc.py,sha256=clz7ofOE0Rgf7eqco3zEO31mCbG3Skj9-rLooliBeik,2942
|
|
11
|
-
jaclang/compiler/compile.py,sha256=
|
|
12
|
-
jaclang/compiler/constant.py,sha256=
|
|
13
|
-
jaclang/compiler/jac.lark,sha256=
|
|
14
|
-
jaclang/compiler/parser.py,sha256=
|
|
11
|
+
jaclang/compiler/compile.py,sha256=FD3jxK8zoxdpQrYRJvwO3CoPWjYL3bbW2WhPRzj3hz8,3796
|
|
12
|
+
jaclang/compiler/constant.py,sha256=9EhbI1Q2Z0RL2z6tI612ifykxRicXLSJ9cby3ylIz1w,8981
|
|
13
|
+
jaclang/compiler/jac.lark,sha256=xLs771uRhbiU10uQLwle80RcbbOh1GassZa0he5RIPE,17497
|
|
14
|
+
jaclang/compiler/parser.py,sha256=xaYkqpiWvwdMNf2aSh6lorUA-RBb-0R4BnGVyrfavNA,143006
|
|
15
15
|
jaclang/compiler/passes/__init__.py,sha256=0Tw0d130ZjzA05jVcny9cf5NfLjlaM70PKqFnY4zqn4,69
|
|
16
16
|
jaclang/compiler/passes/ir_pass.py,sha256=CgtuBrVjfG7PgTCLNSjxgFffYR5naTC3tIjOjsXx5gk,5597
|
|
17
17
|
jaclang/compiler/passes/main/__init__.py,sha256=m5ukLwMcdoi85Ee80-A-zDLbg81z0ztT2IKhOCegNpE,973
|
|
@@ -19,10 +19,10 @@ jaclang/compiler/passes/main/access_modifier_pass.py,sha256=h4R81e8rOanFjArjj2bZ
|
|
|
19
19
|
jaclang/compiler/passes/main/def_impl_match_pass.py,sha256=cCOXyL-yyLxIvSyrlhOtVgjJNu0T-RyKx3sP4bFaQ54,8172
|
|
20
20
|
jaclang/compiler/passes/main/def_use_pass.py,sha256=3rfLaQw4mScSedqPCY8vVkvZH77TTOKEbBYYGC0SZnA,9634
|
|
21
21
|
jaclang/compiler/passes/main/fuse_typeinfo_pass.py,sha256=tLEUzuddDgELAjQwP1L3NEPZ4wYK7HOulNjnw0E1Dl4,26899
|
|
22
|
-
jaclang/compiler/passes/main/import_pass.py,sha256=
|
|
22
|
+
jaclang/compiler/passes/main/import_pass.py,sha256=DmiQPoIi1nPNudwnu2Bn_vJrbVkM1VvO9XLbQqHj26s,22985
|
|
23
23
|
jaclang/compiler/passes/main/inheritance_pass.py,sha256=EXj65jDjFZv-Ayac_12iiGeQUStA87-N0mGvNbAJZjQ,4708
|
|
24
24
|
jaclang/compiler/passes/main/py_collect_dep_pass.py,sha256=TE4h6HLYRE5YdHZK9gtbPPaBJBLOg0g0xSlT_oPzwzY,2874
|
|
25
|
-
jaclang/compiler/passes/main/pyast_gen_pass.py,sha256=
|
|
25
|
+
jaclang/compiler/passes/main/pyast_gen_pass.py,sha256=OyLaqzdhagGG8JEL7b-dzGeOl_Y28UTnOzZt_I_strs,142648
|
|
26
26
|
jaclang/compiler/passes/main/pyast_load_pass.py,sha256=VmlR1j0iY60nFF9DrWVwWrvpUDZpXamkfoyF7miqysA,94697
|
|
27
27
|
jaclang/compiler/passes/main/pybc_gen_pass.py,sha256=CjA9AqyMO3Pv_b5Hh0YI6JmCqIru2ASonO6rhrkau-M,1336
|
|
28
28
|
jaclang/compiler/passes/main/pyjac_ast_link_pass.py,sha256=snbqUIPtPcD9ZKsItOlKGVnujoMGFwF8XNP0GvxS9AI,8628
|
|
@@ -66,7 +66,7 @@ jaclang/compiler/passes/main/tests/fixtures/type_info.jac,sha256=64Im2L-R3YF8DEu
|
|
|
66
66
|
jaclang/compiler/passes/main/tests/fixtures/uninitialized_hasvars.jac,sha256=RVxT9k1R_O_daYZJPvOTjZcd8-CX3zlaaIB0Chg2IvU,542
|
|
67
67
|
jaclang/compiler/passes/main/tests/test_decl_def_match_pass.py,sha256=JuemAIeaHf1wcpbkRTQdp_xlqUmSBZg91pLFyxEv1VM,4393
|
|
68
68
|
jaclang/compiler/passes/main/tests/test_def_use_pass.py,sha256=NJr8d4iS9maoySBMLtxi8a3DJjbcLgEy6GjRgU_nzhM,843
|
|
69
|
-
jaclang/compiler/passes/main/tests/test_import_pass.py,sha256=
|
|
69
|
+
jaclang/compiler/passes/main/tests/test_import_pass.py,sha256=Z7g_kY8lkq0jrN_WugTh1tRQpYmcgHyz_TfMyKIk3HY,4893
|
|
70
70
|
jaclang/compiler/passes/main/tests/test_pyast_build_pass.py,sha256=LIT4TP-nhtftRtY5rNySRQlim-dWMSlkfUvkhZTk4pc,1383
|
|
71
71
|
jaclang/compiler/passes/main/tests/test_pyast_gen_pass.py,sha256=6ZpLNYxblzBg6bmWSA0fikNM7nEAR9b9F18LJaO5buM,4679
|
|
72
72
|
jaclang/compiler/passes/main/tests/test_pybc_gen_pass.py,sha256=If8PE4exN5g9o1NRElNC0XdfIwJAp7M7f69rzmYRYUQ,655
|
|
@@ -78,7 +78,7 @@ jaclang/compiler/passes/main/tests/test_typeinfo_pass.py,sha256=o908glXImFXOlKKT
|
|
|
78
78
|
jaclang/compiler/passes/main/type_check_pass.py,sha256=eDVvCO5I46ZUdCc86nZgfrIRi0-gL0KAlM_1RGEPnCY,4343
|
|
79
79
|
jaclang/compiler/passes/tool/__init__.py,sha256=xekCOXysHIcthWm8NRmQoA1Ah1XV8vFbkfeHphJtUdc,223
|
|
80
80
|
jaclang/compiler/passes/tool/fuse_comments_pass.py,sha256=CSnuWy4gZfTcWKe0Q7LBikBgWe1zJr0QmNUkgrZ7B38,3657
|
|
81
|
-
jaclang/compiler/passes/tool/jac_formatter_pass.py,sha256=
|
|
81
|
+
jaclang/compiler/passes/tool/jac_formatter_pass.py,sha256=iKwxfOIjh5_kI6xuantMWrYt1cGALE1PBSW_Fz8X4DI,91173
|
|
82
82
|
jaclang/compiler/passes/tool/schedules.py,sha256=kmbsCazAMizGAdQuZpFky5BPlYlMXqNw7wOUzdi_wBo,432
|
|
83
83
|
jaclang/compiler/passes/tool/tests/__init__.py,sha256=AeOaZjA1rf6VAr0JqIit6jlcmOzW7pxGr4U1fOwgK_Y,24
|
|
84
84
|
jaclang/compiler/passes/tool/tests/fixtures/corelib.jac,sha256=QvGgP1v_RRqM2t8BOMbbEj3g6jCgyYKvZEdqydJqlqg,12581
|
|
@@ -138,7 +138,7 @@ jaclang/compiler/tests/fixtures/kwesc.jac,sha256=OXxVL_fwiFuvYO1YX1RHa2hpETSpb0Q
|
|
|
138
138
|
jaclang/compiler/tests/fixtures/mod_doc_test.jac,sha256=aFZpjn7V5lvCHp0lPoGXtdkcY3CK8_-SKeZGruutv4Y,35
|
|
139
139
|
jaclang/compiler/tests/fixtures/staticcheck.jac,sha256=t849--dTkSSjCJX1OiMV-lgao_hIDSKwKVs-aS6IwK8,342
|
|
140
140
|
jaclang/compiler/tests/fixtures/stuff.jac,sha256=qOq6WOwhlprMmJpiqQudgqnr4qTd9uhulQSDGQ3o6sY,82
|
|
141
|
-
jaclang/compiler/tests/test_importer.py,sha256=
|
|
141
|
+
jaclang/compiler/tests/test_importer.py,sha256=BKRZ0-n459LaXpJOJt73NHcYkYFAFfFalYz3TF4VgD8,3764
|
|
142
142
|
jaclang/compiler/tests/test_parser.py,sha256=Ke5bF2nrLufhp4y92_dONvBZ8S5GgvfDozOJnEy4-9U,5044
|
|
143
143
|
jaclang/langserve/__init__.py,sha256=3qbnivBBcLZCfmDYRMIeKkG08Lx7XQsJJg-qG8TU8yc,51
|
|
144
144
|
jaclang/langserve/engine.py,sha256=2U6sSCXLedVZhbUGFMadSecKUmW23LAk8S99vN7tsyc,20911
|
|
@@ -169,10 +169,10 @@ jaclang/langserve/tests/test_server.py,sha256=Z-RXNuCXFPi67uXkW1hmoJmrb37VFRpRdH
|
|
|
169
169
|
jaclang/langserve/utils.py,sha256=edZCrq8ZFolao-rvv5RGPxtnEh6NmhrxOgPh8VxmEPs,15019
|
|
170
170
|
jaclang/plugin/__init__.py,sha256=5t2krHKt_44PrCTGojzxEimxpNHYVQcn89jAiCSXE_k,165
|
|
171
171
|
jaclang/plugin/builtin.py,sha256=zNTbe5knJrGFgJRa4l4hMzzuij6iXFyVqRTxputUHIo,1307
|
|
172
|
-
jaclang/plugin/default.py,sha256=
|
|
173
|
-
jaclang/plugin/feature.py,sha256=
|
|
172
|
+
jaclang/plugin/default.py,sha256=yaF0JtGrDGJqPKdXUk4v_Uxd5PXFz3Zv9UWTENT0JbI,47142
|
|
173
|
+
jaclang/plugin/feature.py,sha256=zXI0uZDioToOoC9z294Kbt3zVLkDO59RXhSEN9FYyI4,17010
|
|
174
174
|
jaclang/plugin/plugin.md,sha256=B252QTH3c8uZyvXTbGmZBafZtdXstFC5vT5jIN_gS4U,9994
|
|
175
|
-
jaclang/plugin/spec.py,sha256=
|
|
175
|
+
jaclang/plugin/spec.py,sha256=4QAluXPJ_4Hbg9rPBu97JfkRbHJv8tc-tVxfhI_LWTI,14573
|
|
176
176
|
jaclang/plugin/tests/__init__.py,sha256=rn_tNG8jCHWwBc_rx4yFkGc4N1GISb7aPuTFVRTvrTk,38
|
|
177
177
|
jaclang/plugin/tests/fixtures/graph_purger.jac,sha256=c6kJD-KYYj2NErC21CjC2sjEMMBF6Qh9SdY9nSKWos8,1506
|
|
178
178
|
jaclang/plugin/tests/fixtures/impl_match.jac,sha256=WEhcA1GlovusITEFO2bOjYYqiiULyYGKhM17uK2GqnI,91
|
|
@@ -185,14 +185,14 @@ jaclang/plugin/tests/test_features.py,sha256=sK9d2UazofGl9qYZO_ODKmOHZY8E4fnXNoy
|
|
|
185
185
|
jaclang/plugin/tests/test_jaseci.py,sha256=g2HQWPaG4E2FQOWcKmZ2SM2MDDOEy2s1u14Idb7GTbw,27398
|
|
186
186
|
jaclang/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
187
187
|
jaclang/runtimelib/__init__.py,sha256=jDDYBCV82qPhmcDVk3NIvHbhng0ebSrXD3xrojg0-eo,34
|
|
188
|
-
jaclang/runtimelib/architype.py,sha256=
|
|
188
|
+
jaclang/runtimelib/architype.py,sha256=masm9grqVRFzBFJbpbxrDQ9nWrrA4RZ9FJfK2KmfIZQ,8679
|
|
189
189
|
jaclang/runtimelib/constructs.py,sha256=1ARnsPrDi1UvyaFRhGRhO0kj0fnIZ2HbHF7O3itB-ZQ,796
|
|
190
190
|
jaclang/runtimelib/context.py,sha256=DjCkj1S6WLBWbNMkhUjqPYIhxqXV0XjJ1Mpjy7WR4g0,5538
|
|
191
|
-
jaclang/runtimelib/importer.py,sha256=
|
|
192
|
-
jaclang/runtimelib/machine.py,sha256=
|
|
191
|
+
jaclang/runtimelib/importer.py,sha256=A2YIoPTPaRYvIrj3JZL7bDOyxFpU25Ld-V_fWQMsTbE,15650
|
|
192
|
+
jaclang/runtimelib/machine.py,sha256=JvJiuh_QSFmqHIwWsOXb1pRPdAmM7sadUzWkNpb6jJc,11571
|
|
193
193
|
jaclang/runtimelib/memory.py,sha256=LrVTo6Cac0q-YG1wug-Fgc8O2Tue9zRHnxSulDw3ZQ4,5656
|
|
194
194
|
jaclang/runtimelib/test.py,sha256=4HW7MjHmxjwWjwtIqLtFpcq9B9rI4NmyA92qFy9yhz8,4709
|
|
195
|
-
jaclang/runtimelib/utils.py,sha256=
|
|
195
|
+
jaclang/runtimelib/utils.py,sha256=6_fLmG3zfcX7cVKCq_NvkGjsDsx1nxvV_1GLpyIp8IY,9150
|
|
196
196
|
jaclang/settings.py,sha256=1oxaHpRfrjuwtwgoRJl-abxb8qlvIXUf0JqE-apLLqo,3793
|
|
197
197
|
jaclang/tests/fixtures/abc.jac,sha256=HZvLz6IEt3Snlgg8Czs-N4emLjg4fT3IbTo95d3Gdww,1747
|
|
198
198
|
jaclang/tests/fixtures/access_checker.jac,sha256=UVoY7sYW-R0ms2HDA4HXQ5xJNiW0vEbY2T5CCY1avus,281
|
|
@@ -310,14 +310,15 @@ jaclang/tests/fixtures/tupleunpack.jac,sha256=AP6rbofc0VmsTNxInY6WLGRKWVY6u8ut0u
|
|
|
310
310
|
jaclang/tests/fixtures/tuplytuples.jac,sha256=6qiXn5OV_qn4cqKwROjJ1VuBAh0nbUGpp-5vtH9n_Dg,344
|
|
311
311
|
jaclang/tests/fixtures/type_info.jac,sha256=4Cw31ef5gny6IS0kLzgeSO-7ArEH1HgFFFip1BGQhZM,316
|
|
312
312
|
jaclang/tests/fixtures/visit_order.jac,sha256=5_U-sJX_TkY9A1ho4ibCr-53pFYRtkl97FfMlhoke3w,260
|
|
313
|
+
jaclang/tests/fixtures/visit_sequence.jac,sha256=My5EdoMMc-6kSKtIuVQLTQ9bmiyfZb1xAyLvd5KH1CQ,830
|
|
313
314
|
jaclang/tests/fixtures/walker_override.jac,sha256=Ok58ZAgxuV6aECNxYrjbbyAWSiqIbnly3N3O6cD563o,271
|
|
314
315
|
jaclang/tests/fixtures/walker_update.jac,sha256=_bN3ASAN6LpfIQFfDMRnrx2oteM-ef7OrbE91f2qvrs,463
|
|
315
316
|
jaclang/tests/fixtures/with_context.jac,sha256=cDA_4YWe5UVmQRgcpktzkZ_zsswQpV_T2Otf_rFnPy8,466
|
|
316
317
|
jaclang/tests/foo/__init__.jac,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
317
318
|
jaclang/tests/main.jac,sha256=UJ4dASLCMA3wW78Rq3AHcq5GfXVY5QBm2S16OCrR1hQ,13
|
|
318
319
|
jaclang/tests/test_bugs.py,sha256=tBPsIlSPqZDIz4QaScNRT-WdGIdJ0uU-aRBWq1XUZ6o,555
|
|
319
|
-
jaclang/tests/test_cli.py,sha256=
|
|
320
|
-
jaclang/tests/test_language.py,sha256=
|
|
320
|
+
jaclang/tests/test_cli.py,sha256=QT1pdVxv6Wyp7xKXJc_w4YdOiwpgQ8KYYROq1KhfzAk,19351
|
|
321
|
+
jaclang/tests/test_language.py,sha256=s4phFcN1lK_OdpjhWq2bpzHC4s58Djjsn6REeHV4sRU,50988
|
|
321
322
|
jaclang/tests/test_man_code.py,sha256=ZdNarlZVfT_-8Jv3FjLplHw76tsvkCuISyfX3M4qxPg,5027
|
|
322
323
|
jaclang/tests/test_reference.py,sha256=FISQpZbB8cmRoAeJOFfXUy13WVxykZjpkPSb1OTotfI,3340
|
|
323
324
|
jaclang/tests/test_settings.py,sha256=TIX5uiu8H9IpZN2__uFiclcdCpBpPpcAwtlEHyFC4kk,1999
|
|
@@ -325,9 +326,9 @@ jaclang/utils/__init__.py,sha256=86LQ_LDyWV-JFkYBpeVHpLaVxkqwFDP60XpWXOFZIQk,46
|
|
|
325
326
|
jaclang/utils/helpers.py,sha256=0n3J50D5XvLI6nEalDewDWRkjO2EO71OkKS_6lGYuyY,10340
|
|
326
327
|
jaclang/utils/lang_tools.py,sha256=HECF9zXH8si6Q_oBhSSoOMmv-k8ppKPb6RAlX_wZPWE,10177
|
|
327
328
|
jaclang/utils/log.py,sha256=G8Y_DnETgTh9xzvlW5gh9zqJ1ap4YY_MDTwIMu5Uc0Y,262
|
|
328
|
-
jaclang/utils/test.py,sha256=
|
|
329
|
+
jaclang/utils/test.py,sha256=c12ZyRvG2IQtuRaU9XEGBrdM26fH82tWP9u64HH2Mz4,6089
|
|
329
330
|
jaclang/utils/tests/__init__.py,sha256=8uwVqMsc6cxBAM1DuHLuNuTnzLXqOqM-WRa4ixOMF6w,23
|
|
330
|
-
jaclang/utils/tests/test_lang_tools.py,sha256=
|
|
331
|
+
jaclang/utils/tests/test_lang_tools.py,sha256=wIMWdoKF24gVTlG_dGLAxetZhGmBF8cftUY-bugNOOQ,4879
|
|
331
332
|
jaclang/utils/treeprinter.py,sha256=ElR4IuXewv2D7MykE9bNji1KxgCNCOTCp2j4ZECeiEk,13512
|
|
332
333
|
jaclang/vendor/__init__.py,sha256=tEcp2kl3hMvF2d6X6WlJSAGuAMYOVCKCstXuPMQSR4Q,265
|
|
333
334
|
jaclang/vendor/attr/__init__.py,sha256=WlXJN6ICB0Y_HZ0lmuTUgia0kuSdn2p67d4N6cYxNZM,3307
|
|
@@ -1551,7 +1552,7 @@ jaclang/vendor/typing_extensions-4.12.2.dist-info/METADATA,sha256=BeUQIa8cnYbrjW
|
|
|
1551
1552
|
jaclang/vendor/typing_extensions-4.12.2.dist-info/RECORD,sha256=XS4fBVrPI7kaNZ56Ggl2RGa76jySWLqTzcrUpZIQTVM,418
|
|
1552
1553
|
jaclang/vendor/typing_extensions-4.12.2.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
|
|
1553
1554
|
jaclang/vendor/typing_extensions.py,sha256=gwekpyG9DVG3lxWKX4ni8u7nk3We5slG98mA9F3DJQw,134451
|
|
1554
|
-
jaclang-0.7.
|
|
1555
|
-
jaclang-0.7.
|
|
1556
|
-
jaclang-0.7.
|
|
1557
|
-
jaclang-0.7.
|
|
1555
|
+
jaclang-0.7.30.dist-info/METADATA,sha256=ACKhVDb2Ry7XFK-JK1Uf4ZtcjgmmpZmbABTfzwzl6hE,4977
|
|
1556
|
+
jaclang-0.7.30.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
|
|
1557
|
+
jaclang-0.7.30.dist-info/entry_points.txt,sha256=8sMi4Tvi9f8tQDN2QAXsSA2icO27zQ4GgEdph6bNEZM,49
|
|
1558
|
+
jaclang-0.7.30.dist-info/RECORD,,
|
|
File without changes
|