jaclang 0.0.2__tar.gz → 0.0.3__tar.gz
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-0.0.2 → jaclang-0.0.3}/PKG-INFO +1 -1
- jaclang-0.0.3/jaclang/cli/impl/__init__.py +1 -0
- jaclang-0.0.3/jaclang/cli/impl/cli_impl.jac +93 -0
- jaclang-0.0.3/jaclang/cli/impl/cmds_impl.jac +26 -0
- jaclang-0.0.3/jaclang/core/impl/__init__.py +1 -0
- jaclang-0.0.3/jaclang/core/impl/arch_impl.jac +112 -0
- jaclang-0.0.3/jaclang/core/impl/element_impl.jac +95 -0
- jaclang-0.0.3/jaclang/core/impl/exec_ctx_impl.jac +17 -0
- jaclang-0.0.3/jaclang/core/impl/memory_impl.jac +57 -0
- jaclang-0.0.3/jaclang/jac/passes/purple/impl/__init__.py +1 -0
- jaclang-0.0.3/jaclang/jac/passes/purple/impl/purple_pygen_pass_impl.jac +289 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang.egg-info/PKG-INFO +1 -1
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang.egg-info/SOURCES.txt +10 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/setup.py +1 -1
- {jaclang-0.0.2 → jaclang-0.0.3}/README.md +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/__init__.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/cli/__init__.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/cli/cli.jac +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/cli/cmds.jac +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/core/__init__.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/core/primitives.jac +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/__init__.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/absyntree.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/constant.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/importer.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/lexer.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/parser.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/__init__.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/__init__.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/ast_build_pass.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/blue_pygen_pass.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/decl_def_match_pass.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/import_pass.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/sub_node_tab_pass.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/tests/__init__.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/tests/test_ast_build_pass.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/tests/test_blue_pygen_pass.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/tests/test_decl_def_match_pass.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/tests/test_import_pass.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/tests/test_sub_node_pass.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/tests/test_type_analyze_pass.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/type_analyze_pass.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/ir_pass.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/purple/__init__.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/purple/purple_pygen_pass.jac +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/sym_table.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/__init__.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/fixtures/__init__.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/fixtures/activity.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/fixtures/fam.jac +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/fixtures/hello_world.jac +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/fixtures/lexer_fam.jac +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/fixtures/stuff.jac +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/test_importer.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/test_lexer.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/test_parser.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/test_utils.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/transform.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/transpiler.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/utils.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/__init__.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/fstring_parser.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/log.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/sly/__init__.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/sly/docparse.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/sly/lex.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/sly/yacc.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/test.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/tests/__init__.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/tests/test_fstring_parser.py +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang.egg-info/dependency_links.txt +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang.egg-info/entry_points.txt +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/jaclang.egg-info/top_level.txt +0 -0
- {jaclang-0.0.2 → jaclang-0.0.3}/setup.cfg +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""For setuptools to find this dir."""
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"""Implemenation for Jac's command line interface."""
|
|
2
|
+
|
|
3
|
+
:o:Command:a:init(func: callable) {
|
|
4
|
+
<s>.func = func;
|
|
5
|
+
<s>.sig = func |> inspect.signature;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
:o:Command:a:call(*args: list, **kwargs: dict) {
|
|
9
|
+
return (*args, **kwargs) |> <s>.func;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
:o:CommandRegistry:a:init {
|
|
13
|
+
<s>.registry = {};
|
|
14
|
+
<s>.parser = (prog="CLI") |> argparse.ArgumentParser;
|
|
15
|
+
<s>.sub_parsers =
|
|
16
|
+
(title="commands", dest="command") |> <s>.parser.add_subparsers;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
:o:CommandRegistry:a:register(func: callable) {
|
|
20
|
+
name = func.__name__;
|
|
21
|
+
cmd = func |> Command;
|
|
22
|
+
<s>.registry[name] = cmd;
|
|
23
|
+
cmd_parser = name |> <s>.sub_parsers.add_parser;
|
|
24
|
+
for param_name, param in |> cmd.sig.parameters.items {
|
|
25
|
+
if param_name == "args" {
|
|
26
|
+
('args', nargs=argparse.REMAINDER)
|
|
27
|
+
|> cmd_parser.add_argument;
|
|
28
|
+
}
|
|
29
|
+
elif param.default is param.empty {
|
|
30
|
+
(f"-{param_name[:1]}", f"--{param_name}",
|
|
31
|
+
required=True, type=param.annotation|>eval)
|
|
32
|
+
|> cmd_parser.add_argument;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
(f"-{param_name[:1]}", f"--{param_name}",
|
|
36
|
+
default=param.default, type=param.annotation|>eval)
|
|
37
|
+
|> cmd_parser.add_argument;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return func;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
:o:CommandRegistry:a:get(name: str) -> Command {
|
|
44
|
+
return name |> <s>.registry.get;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
:o:CommandRegistry:a:items -> dict[str, Command] {
|
|
48
|
+
return |> <s>.registry.items;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
:o:CommandShell:a:init (cmd_reg: CommandRegistry) {
|
|
53
|
+
<s>.cmd_reg = cmd_reg;
|
|
54
|
+
<s> |> cmd.Cmd.__init__;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
:o:CommandShell:a:do_exit(arg: list) -> bool {
|
|
58
|
+
return True;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
:o:CommandShell:a:default(line: str) {
|
|
62
|
+
try {
|
|
63
|
+
args = |> line.split |> <s>.cmd_reg.parser.parse_args |> vars;
|
|
64
|
+
command = args["command"] |> <s>.cmd_reg.get;
|
|
65
|
+
if command {
|
|
66
|
+
args.pop("command");
|
|
67
|
+
ret = **args |> command.call;
|
|
68
|
+
if ret {
|
|
69
|
+
ret |> print;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
except Exception as e {
|
|
74
|
+
e |> print;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
:a:start_cli {
|
|
79
|
+
parser = cmd_registry.parser;
|
|
80
|
+
args = |> parser.parse_args;
|
|
81
|
+
command = args.command |> cmd_registry.get;
|
|
82
|
+
if command {
|
|
83
|
+
args = args |> vars;
|
|
84
|
+
"command" |> args.pop;
|
|
85
|
+
ret = **args |> command.call;
|
|
86
|
+
if ret {
|
|
87
|
+
ret |> print;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
shell = |> CommandShell(cmd_registry).cmdloop;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"""Implementations for the jac command line interface."""
|
|
2
|
+
import:py from os, path;
|
|
3
|
+
|
|
4
|
+
:a:load(filename: str) {
|
|
5
|
+
if filename.endswith(".jac"){
|
|
6
|
+
[base, mod] = path.split(filename);
|
|
7
|
+
base = './' if not base else base;
|
|
8
|
+
mod=mod[:-4];
|
|
9
|
+
__jac_import__(target=mod, base_path=base);
|
|
10
|
+
} else {
|
|
11
|
+
"Not a .jac file." :> print;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
:a:run(filename: str, entrypoint: str, args: list) {
|
|
17
|
+
if filename.endswith(".jac"){
|
|
18
|
+
[base, mod] = path.split(filename);
|
|
19
|
+
base = './' if not base else base;
|
|
20
|
+
mod=mod[:-4];
|
|
21
|
+
mod = __jac_import__(target=mod, base_path=base);
|
|
22
|
+
:> ((mod, entrypoint) :> getattr );
|
|
23
|
+
} else {
|
|
24
|
+
"Not a .jac file." :> print;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""For setuptools to find this dir."""
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"""Implementation for Jac's Element Abstractions"""
|
|
2
|
+
import:py from jaclang.jac.constant, EdgeDir;
|
|
3
|
+
|
|
4
|
+
:o:Node:a:__call__
|
|
5
|
+
(walk: Walker) {
|
|
6
|
+
if not (walk, Walker) :> isinstance {
|
|
7
|
+
raise ("Argument must be a Walker instance") :> TypeError;
|
|
8
|
+
}
|
|
9
|
+
<self> :> walk;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
:o:Node:a:_jac_connect_node_
|
|
13
|
+
(nd: Node, edg: Edge) -> Node {
|
|
14
|
+
(<self>, nd) :> edg._jac_attach_;
|
|
15
|
+
return <self>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
:o:Node:a:_jac_edges_to_nodes_
|
|
19
|
+
(dir: EdgeDir) -> list[Node] {
|
|
20
|
+
ret_nodes = [];
|
|
21
|
+
if dir in [EdgeDir.OUT, EdgeDir.ANY] {
|
|
22
|
+
for i in <self>._jac_edges_[EdgeDir.OUT] {
|
|
23
|
+
ret_nodes.append(i._jac_target_);
|
|
24
|
+
}
|
|
25
|
+
} elif dir in [EdgeDir.IN, EdgeDir.ANY] {
|
|
26
|
+
for i in <self>._jac_edges_[EdgeDir.IN] {
|
|
27
|
+
ret_nodes.append(i._jac_source_);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
return ret_nodes;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
:o:Edge:a:__call__
|
|
35
|
+
(walk: Walker) {
|
|
36
|
+
if not (walk, Walker) :> isinstance {
|
|
37
|
+
raise ("Argument must be a Walker instance") :> TypeError;
|
|
38
|
+
}
|
|
39
|
+
<self>._jac_target_ :> walk;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
:o:Edge:a:_jac_apply_dir_
|
|
43
|
+
(dir: EdgeDir) -> Edge {
|
|
44
|
+
<self>._jac_dir_ = dir;
|
|
45
|
+
return <self>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
:o:Edge:a:_jac_attach_
|
|
49
|
+
(src: Node, trg: Node) -> Edge {
|
|
50
|
+
if <self>._jac_dir_ == EdgeDir.IN {
|
|
51
|
+
<self>._jac_source_ = trg;
|
|
52
|
+
<self>._jac_target_ = src;
|
|
53
|
+
<self> :> src._jac_edges_[EdgeDir.IN].append;
|
|
54
|
+
<self> :> trg._jac_edges_[EdgeDir.OUT].append;
|
|
55
|
+
} else {
|
|
56
|
+
<self>._jac_source_ = src;
|
|
57
|
+
<self>._jac_target_ = trg;
|
|
58
|
+
<self> :> src._jac_edges_[EdgeDir.OUT].append;
|
|
59
|
+
<self> :> trg._jac_edges_[EdgeDir.IN].append;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return <self>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
:o:Walker:a:__call__
|
|
66
|
+
(nd: Node) {
|
|
67
|
+
<self>._jac_path_ = [];
|
|
68
|
+
<self>._jac_next_ = [nd];
|
|
69
|
+
walker_type = <self>.__class__.__name__;
|
|
70
|
+
node_type = nd.__class__.__name__;
|
|
71
|
+
while <self>._jac_next_ :> len {
|
|
72
|
+
nd = 0 :> <self>._jac_next_.pop;
|
|
73
|
+
|
|
74
|
+
for i in nd._jac_ds_entry_funcs {
|
|
75
|
+
if i['func'].__qualname__.split(".")[0] == node_type and
|
|
76
|
+
<self>:>type in i['types'] {
|
|
77
|
+
(nd, <self>) :> i['func'];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
for i in <self>._jac_ds_entry_funcs {
|
|
81
|
+
if i['func'].__qualname__.split(".")[0] == walker_type and
|
|
82
|
+
(nd:>type in i['types'] or nd in i['types']) { # if nd==root direct chec
|
|
83
|
+
(<self>, nd) :> i['func'];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
for i in <self>._jac_ds_exit_funcs {
|
|
87
|
+
if i['func'].__qualname__.split(".")[0] == walker_type and
|
|
88
|
+
(nd:>type in i['types'] or nd in i['types']) {
|
|
89
|
+
(<self>, nd) :> i['func'];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
for i in nd._jac_ds_exit_funcs {
|
|
93
|
+
if i['func'].__qualname__.split(".")[0] == node_type and
|
|
94
|
+
<self>:>type in i['types'] {
|
|
95
|
+
(nd, <self>) :> i['func'];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
nd :> <self>._jac_path_.append;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
:o:Walker:a:_jac_visit_
|
|
103
|
+
(nds: list[Node]|list[Edge]) {
|
|
104
|
+
for i in nds {
|
|
105
|
+
i :> <self>._jac_next_.append;
|
|
106
|
+
}
|
|
107
|
+
return nds :> len;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
:o:Walker:a:_jac_disengage_ {
|
|
111
|
+
<self>._jac_next_ = [];
|
|
112
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"""Implementation for Jac's Element Abstractions"""
|
|
2
|
+
|
|
3
|
+
:enum:AccessMode {
|
|
4
|
+
READ_ONLY,
|
|
5
|
+
READ_WRITE,
|
|
6
|
+
PRIVATE
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
:object:Element:ability:init
|
|
10
|
+
(_jac_exec_ctx: ExecutionContext) {
|
|
11
|
+
<self>.__jinfo = _jac_exec_ctx :> ExecutionContext;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
:object:Element:ability:_jac_make_public_ro {
|
|
15
|
+
<self>.__jinfo.access_mode = AccessMode.READ_ONLY;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
:object:Element:ability:_jac_make_public_rw {
|
|
19
|
+
<self>.__jinfo.access_mode = AccessMode.READ_WRITE;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
:object:Element:ability:_jac_make_private {
|
|
23
|
+
<self>.__jinfo.access_mode = AccessMode.PRIVATE;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
:object:Element:ability:_jac_is_public_ro -> bool {
|
|
27
|
+
return <self>.__jinfo.access_mode == AccessMode.READ_ONLY;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
:object:Element:ability:_jac_is_public_rw -> bool {
|
|
31
|
+
return <self>.__jinfo.access_mode == AccessMode.READ_WRITE;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
:object:Element:ability:_jac_is_private -> bool {
|
|
35
|
+
return <self>.__jinfo.access_mode == AccessMode.PRIVATE;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
:object:Element:ability:_jac_is_readable
|
|
39
|
+
(caller_id: UUID) -> bool {
|
|
40
|
+
return (
|
|
41
|
+
caller_id == <self>.owner_id
|
|
42
|
+
or |> <self>.is_public_read
|
|
43
|
+
or caller_id in <self>.ro_access
|
|
44
|
+
or caller_id in <self>.rw_access
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
:object:Element:ability:_jac_is_writable
|
|
49
|
+
(caller_id: UUID) -> bool {
|
|
50
|
+
return (
|
|
51
|
+
caller_id == <self>.owner_id
|
|
52
|
+
or |> <self>.is_public_write
|
|
53
|
+
or caller_id in <self>.rw_access
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
:object:Element:ability:_jac_give_access
|
|
58
|
+
(caller_id: UUID, read_write: bool = False) {
|
|
59
|
+
if read_write {
|
|
60
|
+
caller_id |> <self>.rw_access.add;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
caller_id |> add .> ro_access .> <self>;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
:object:Element:ability:_jac_revoke_access
|
|
68
|
+
(caller_id: UUID) {
|
|
69
|
+
caller_id |> <self>.ro_access.discard;
|
|
70
|
+
caller_id |> <self>.rw_access.discard;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
:object:Object:ability:_jac_on_entry
|
|
74
|
+
(cls: type, triggers: list) {
|
|
75
|
+
can decorator(func: callable) -> callable {
|
|
76
|
+
cls._jac_ds_entry_funcs.append({'types': triggers, 'func': func});
|
|
77
|
+
can wrapper(*args: list, **kwargs: dict) -> callable {
|
|
78
|
+
return func(*args, **kwargs);
|
|
79
|
+
}
|
|
80
|
+
return wrapper;
|
|
81
|
+
}
|
|
82
|
+
return decorator;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
:object:Object:ability:_jac_on_exit
|
|
86
|
+
(cls: type, triggers: list) {
|
|
87
|
+
can decorator(func: callable) -> callable {
|
|
88
|
+
cls._jac_ds_exit_funcs.append({'types': triggers, 'func': func});
|
|
89
|
+
can wrapper(*args: list, **kwargs: dict) -> callable {
|
|
90
|
+
return func(*args, **kwargs);
|
|
91
|
+
}
|
|
92
|
+
return wrapper;
|
|
93
|
+
}
|
|
94
|
+
return decorator;
|
|
95
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Implementation for Jac's Element Abstractions"""
|
|
2
|
+
import:py from uuid, UUID, uuid4;
|
|
3
|
+
|
|
4
|
+
:object:ExecutionContext:a:init
|
|
5
|
+
(master: UUID, memory: Memory) {
|
|
6
|
+
<self>.master = master;
|
|
7
|
+
<self>.memory = memory;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
:object:ExecutionContext:a:get_root
|
|
11
|
+
() {
|
|
12
|
+
if <self>.master :> type == UUID {
|
|
13
|
+
<self>.master = Master();
|
|
14
|
+
}
|
|
15
|
+
return <self>.master.root_node;
|
|
16
|
+
}
|
|
17
|
+
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Implementation for Jac's Element Abstractions"""
|
|
2
|
+
import:py sys;
|
|
3
|
+
|
|
4
|
+
:object:Memory:ability:get_obj
|
|
5
|
+
(caller_id: UUID, item_id: UUID, override: bool = False) -> Element? {
|
|
6
|
+
ret = item_id |> <self>.index.get;
|
|
7
|
+
if override or (ret is not None and caller_id |> ret.__is_readable) {
|
|
8
|
+
return ret;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
:object:Memory:ability:has_obj
|
|
13
|
+
(item_id: UUID) -> bool {
|
|
14
|
+
return item_id in <self>.index;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
:object:Memory:ability:save_obj
|
|
18
|
+
(caller_id: UUID, item: Element) {
|
|
19
|
+
if caller_id |> item.is_writable {
|
|
20
|
+
<self>.index[item.id] = item;
|
|
21
|
+
if item._persist {
|
|
22
|
+
item |> <self>.save_obj_list.add;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
<self>.mem[item.id] = item;
|
|
26
|
+
if item._persist {
|
|
27
|
+
item |> <self>.save_obj_list.add;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
:object:Memory:ability:del_obj
|
|
32
|
+
(caller_id: UUID, item: Element) {
|
|
33
|
+
if caller_id |> item.is_writable {
|
|
34
|
+
<self>.index.pop(item.id);
|
|
35
|
+
if item._persist {
|
|
36
|
+
item |> <self>.save_obj_list.remove;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
:object:Memory:ability:get_object_distribution -> dict {
|
|
42
|
+
dist = {};
|
|
43
|
+
for i in |> <self>.index.keys {
|
|
44
|
+
t = <self>.index[i] |> type;
|
|
45
|
+
if t in dist {
|
|
46
|
+
dist[t] += 1;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
dist[t] = 1;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return dist;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
:object:Memory:ability:get_mem_size -> float {
|
|
56
|
+
return (<self>.index |> sys.getsizeof) / 1024.0;
|
|
57
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""For setuptools to find this dir."""
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
"""First Jac pass bootstrapped in Jac"""
|
|
2
|
+
import:py from jaclang.jac.constant, Constants as C, EdgeDir;
|
|
3
|
+
|
|
4
|
+
:object:PurplePygenPass:ability:add_element_import
|
|
5
|
+
(arch: str) {
|
|
6
|
+
(<self>.preamble, f"from jaclang.core import {arch} as _jac_{arch}_")
|
|
7
|
+
|> <self>.emit_ln_unique;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
:object:PurplePygenPass:ability:add_exec_context {
|
|
11
|
+
(<self>.preamble, f"from jaclang.core import exec_ctx as {C.EXEC_CONTEXT}")
|
|
12
|
+
|> <self>.emit_ln_unique;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
:object:PurplePygenPass:ability:add_edge_directions {
|
|
16
|
+
(<self>.preamble, f"from jaclang.jac.constant import EdgeDir as {C.EDGE_DIR}")
|
|
17
|
+
|> <self>.emit_ln_unique;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
:object:PurplePygenPass:ability:needs_jac_import {
|
|
21
|
+
(<self>.preamble, "from jaclang import jac_purple_import as __jac_import__")
|
|
22
|
+
|> <self>.emit_ln_unique;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
"""
|
|
26
|
+
Sub objects.
|
|
27
|
+
|
|
28
|
+
name: Name,
|
|
29
|
+
arch_type: Token,
|
|
30
|
+
doc: Optional[DocString],
|
|
31
|
+
decorators: Optional["Decorators"],
|
|
32
|
+
access: Optional[Token],
|
|
33
|
+
base_classes: "BaseClasses",
|
|
34
|
+
body: Optional["ArchBlock"],
|
|
35
|
+
"""
|
|
36
|
+
:object:PurplePygenPass:ability:exit_architype
|
|
37
|
+
(nd: ast.Architype) {
|
|
38
|
+
|> <self>.add_exec_context;
|
|
39
|
+
if nd.decorators {
|
|
40
|
+
(nd, nd.decorators.meta["py_code"]) |> <self>.emit_ln;
|
|
41
|
+
}
|
|
42
|
+
arch_type=nd.arch_type.name;
|
|
43
|
+
arch_insert = "";
|
|
44
|
+
if arch_type == Tok.KW_OBJECT {
|
|
45
|
+
"Object" |> <self>.add_element_import;
|
|
46
|
+
arch_insert = C.OBJECT_CLASS;
|
|
47
|
+
}
|
|
48
|
+
elif arch_type == Tok.KW_NODE {
|
|
49
|
+
"Node" |> <self>.add_element_import;
|
|
50
|
+
arch_insert = C.NODE_CLASS;
|
|
51
|
+
}
|
|
52
|
+
elif arch_type == Tok.KW_EDGE {
|
|
53
|
+
"Edge" |> <self>.add_element_import;
|
|
54
|
+
arch_insert = C.EDGE_CLASS;
|
|
55
|
+
}
|
|
56
|
+
elif arch_type == Tok.KW_WALKER {
|
|
57
|
+
"Walker" |> <self>.add_element_import;
|
|
58
|
+
arch_insert = C.WALKER_CLASS;
|
|
59
|
+
}
|
|
60
|
+
if nd.base_classes.base_classes |> len {
|
|
61
|
+
(nd, f"class {nd.name.meta['py_code']}"
|
|
62
|
+
f"({nd.base_classes.meta['py_code']}, {arch_insert}):")
|
|
63
|
+
|> <self>.emit_ln;
|
|
64
|
+
} else {
|
|
65
|
+
(nd, f"class {nd.name.meta['py_code']}({arch_insert}):") |> <self>.emit_ln;
|
|
66
|
+
}
|
|
67
|
+
<self>.indent_level += 1;
|
|
68
|
+
if nd.doc {
|
|
69
|
+
(nd, nd.doc.meta["py_code"]) |> <self>.emit_ln; }
|
|
70
|
+
if nd.body {
|
|
71
|
+
(nd, nd.body.meta["py_code"]) |> <self>.emit_ln; }
|
|
72
|
+
else {
|
|
73
|
+
nd.name.meta["py_code"] |> <self>.decl_def_missing; }
|
|
74
|
+
<self>.indent_level -= 1;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
"""Sub objects.
|
|
79
|
+
|
|
80
|
+
name: Name,
|
|
81
|
+
is_func: bool,
|
|
82
|
+
is_async: bool,
|
|
83
|
+
doc: Optional[DocString],
|
|
84
|
+
decorators: Optional["Decorators"],
|
|
85
|
+
access: Optional[Token],
|
|
86
|
+
signature: Optional["FuncSignature | TypeSpec | EventSignature"],
|
|
87
|
+
body: Optional["CodeBlock"],
|
|
88
|
+
arch_attached: Optional["ArchBlock"] = None,
|
|
89
|
+
"""
|
|
90
|
+
:object:PurplePygenPass:ability:exit_ability
|
|
91
|
+
(nd: ast.Ability) {
|
|
92
|
+
"Object" |> <self>.add_element_import;
|
|
93
|
+
if nd.decorators {
|
|
94
|
+
(nd, nd.decorators.meta["py_code"]) |> <self>.emit_ln;
|
|
95
|
+
}
|
|
96
|
+
if nd.signature:>type == ast.EventSignature and nd.arch_attached and
|
|
97
|
+
nd.signature.event.name == Tok.KW_ENTRY {
|
|
98
|
+
type_list = nd.signature.arch_tag_info?.meta?["py_code"] ?: "";
|
|
99
|
+
(nd, f"@{C.OBJECT_CLASS}._jac_on_entry([{type_list.replace('|', ', ')}])") |> <self>.emit_ln;
|
|
100
|
+
}
|
|
101
|
+
elif nd.signature:>type == ast.EventSignature and nd.arch_attached and
|
|
102
|
+
nd.signature.event.name == Tok.KW_EXIT {
|
|
103
|
+
type_list = nd.signature.arch_tag_info?.meta?["py_code"] ?: "";
|
|
104
|
+
(nd, f"@{C.OBJECT_CLASS}._jac_on_exit([{type_list.replace('|', ', ')}])") |> <self>.emit_ln;
|
|
105
|
+
}
|
|
106
|
+
if nd.signature:>type in [ast.FuncSignature, ast.EventSignature] {
|
|
107
|
+
if nd.arch_attached and not nd.is_static {
|
|
108
|
+
(nd, f"def {nd.name.meta['py_code']}(self{nd.signature.meta['py_code']}:")
|
|
109
|
+
|> <self>.emit_ln;
|
|
110
|
+
} else {
|
|
111
|
+
if nd.arch_attached and nd.is_static {
|
|
112
|
+
(nd, f"@classmethod") |> <self>.emit_ln;
|
|
113
|
+
}
|
|
114
|
+
(nd, f"def {nd.name.meta['py_code']}({nd.signature.meta['py_code']}:")
|
|
115
|
+
|> <self>.emit_ln;
|
|
116
|
+
}
|
|
117
|
+
} else {
|
|
118
|
+
if nd.arch_attached {
|
|
119
|
+
(nd, f"def {nd.name.meta['py_code']}(self):") |> <self>.emit_ln;
|
|
120
|
+
} else {
|
|
121
|
+
(nd, f"def {nd.name.meta['py_code']}():") |> <self>.emit_ln;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
<self>.indent_level += 1;
|
|
125
|
+
if nd.doc {
|
|
126
|
+
(nd, nd.doc.meta["py_code"]) |> <self>.emit_ln;
|
|
127
|
+
}
|
|
128
|
+
if nd.body {
|
|
129
|
+
(nd, "try:") |> <self>.emit_ln;
|
|
130
|
+
<self>.indent_level += 1;
|
|
131
|
+
(nd, nd.body.meta["py_code"]) |> <self>.emit;
|
|
132
|
+
<self>.indent_level -= 1;
|
|
133
|
+
(nd) |> <self>.emit_jac_error_handler;
|
|
134
|
+
} else {
|
|
135
|
+
nd.name.meta["py_code"] |> <self>.decl_def_missing;
|
|
136
|
+
}
|
|
137
|
+
<self>.indent_level -= 1;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
"""Sub objects.
|
|
142
|
+
|
|
143
|
+
event: Token,
|
|
144
|
+
arch_tag_info: Optional["TypeList | TypeSpec"],
|
|
145
|
+
return_type: Optional["TypeSpec"],
|
|
146
|
+
"""
|
|
147
|
+
:object:PurplePygenPass:ability:exit_event_signature
|
|
148
|
+
(nd: ast.EventSignature) {
|
|
149
|
+
if (nd.parent|>type) == ast.Ability and nd.parent.arch_attached {
|
|
150
|
+
(nd, ", ") |> <self>.emit;
|
|
151
|
+
}
|
|
152
|
+
if nd.arch_tag_info {
|
|
153
|
+
(nd, f"{C.HERE}: {nd.arch_tag_info.meta['py_code']})")
|
|
154
|
+
|> <self>.emit;
|
|
155
|
+
} else {
|
|
156
|
+
(nd, f"{C.HERE})") |> <self>.emit;
|
|
157
|
+
}
|
|
158
|
+
if nd.return_type {
|
|
159
|
+
(nd, f" -> {nd.return_type.meta['py_code']}") |> <self>.emit;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
"""Sub objects.
|
|
165
|
+
|
|
166
|
+
ctrl: Token,
|
|
167
|
+
"""
|
|
168
|
+
:object:PurplePygenPass:ability:exit_ctrl_stmt
|
|
169
|
+
(nd: ast.CtrlStmt) {
|
|
170
|
+
if nd.ctrl.name == Tok.KW_SKIP {
|
|
171
|
+
(nd, "return") |> <self>.emit_ln;
|
|
172
|
+
} else {
|
|
173
|
+
<super>.exit_ctrl_stmt(nd);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
"""Sub objects.
|
|
179
|
+
|
|
180
|
+
vis_type: Optional[Token],
|
|
181
|
+
target: ExprType,
|
|
182
|
+
else_body: Optional["ElseStmt"],
|
|
183
|
+
from_walker: bool = False,
|
|
184
|
+
"""
|
|
185
|
+
:object:PurplePygenPass:ability:exit_visit_stmt
|
|
186
|
+
(nd: ast.VisitStmt) {
|
|
187
|
+
vis_type = nd.vis_type?.value ?: "";
|
|
188
|
+
loc = f"{'self' if nd.from_walker else C.HERE}";
|
|
189
|
+
(nd, f"if not {loc}.{C.WALKER_VISIT}({nd.target.meta['py_code']}): " )
|
|
190
|
+
|> <self>.emit_ln;
|
|
191
|
+
<self>.indent_level += 1;
|
|
192
|
+
if nd.else_body {
|
|
193
|
+
(nd, nd.else_body.body.meta["py_code"]) |> <self>.emit;
|
|
194
|
+
} else {
|
|
195
|
+
(nd, 'pass') |> <self>.emit_ln;
|
|
196
|
+
}
|
|
197
|
+
<self>.indent_level -= 1;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
"""Sub objects.
|
|
202
|
+
from_walker: bool = False,
|
|
203
|
+
"""
|
|
204
|
+
:object:PurplePygenPass:ability:exit_disengage_stmt
|
|
205
|
+
(nd: ast.VisitStmt) {
|
|
206
|
+
loc = f"{'self' if nd.from_walker else C.HERE}";
|
|
207
|
+
(nd, f"return {loc}.{C.DISENGAGE}()") |> <self>.emit_ln;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
"""Sub objects.
|
|
212
|
+
|
|
213
|
+
left: ExprType,
|
|
214
|
+
right: ExprType,
|
|
215
|
+
op: Token,
|
|
216
|
+
"""
|
|
217
|
+
:object:PurplePygenPass:ability:exit_binary_expr
|
|
218
|
+
(nd: ast.BinaryExpr) {
|
|
219
|
+
if (nd.op|>type) == ast.ConnectOp {
|
|
220
|
+
(nd, f"{nd.left.meta['py_code']}.{C.CONNECT_NODE}({nd.right.meta['py_code']}, {nd.op.meta['py_code']})")
|
|
221
|
+
|> <self>.emit;
|
|
222
|
+
} else {
|
|
223
|
+
<super>.exit_binary_expr(nd);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
"""Sub objects.
|
|
229
|
+
|
|
230
|
+
filter_type: Optional[ExprType],
|
|
231
|
+
filter_cond: Optional[FilterCompr],
|
|
232
|
+
edge_dir: EdgeDir,
|
|
233
|
+
"""
|
|
234
|
+
:object:PurplePygenPass:ability:exit_edge_op_ref
|
|
235
|
+
(nd: ast.EdgeOpRef) {
|
|
236
|
+
edge_dir = f"{C.EDGE_DIR}.IN" if nd.edge_dir == EdgeDir.IN
|
|
237
|
+
else f"{C.EDGE_DIR}.OUT" if nd.edge_dir == EdgeDir.OUT
|
|
238
|
+
else f"{C.EDGE_DIR}.ANY";
|
|
239
|
+
if nd.filter_type and nd.filter_cond {
|
|
240
|
+
(nd, f"[{C.JAC_TMP} for {C.JAC_TMP} in {C.HERE}.{C.EDGES_TO_NODE}({edge_dir})"
|
|
241
|
+
f" if isinstance({C.JAC_TMP}, {nd.filter_type.meta['py_code']})"
|
|
242
|
+
f" and {nd.filter_cond.meta['py_code'].replace(C.PATCH, C.JAC_TMP)}]")
|
|
243
|
+
|> <self>.emit;
|
|
244
|
+
}
|
|
245
|
+
elif nd.filter_type {
|
|
246
|
+
(nd, f"[{C.JAC_TMP} for {C.JAC_TMP} in {C.HERE}.{C.EDGES_TO_NODE}({edge_dir})"
|
|
247
|
+
f" if isinstance({C.JAC_TMP}, {nd.filter_type.meta['py_code']})]")
|
|
248
|
+
|> <self>.emit;
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
(nd, f"{C.HERE}.{C.EDGES_TO_NODE}({edge_dir})")
|
|
252
|
+
|> <self>.emit;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
"""Sub objects.
|
|
258
|
+
|
|
259
|
+
conn_type: Optional[ExprType],
|
|
260
|
+
conn_assign: Optional[AssignmentList],
|
|
261
|
+
edge_dir: EdgeDir,
|
|
262
|
+
"""
|
|
263
|
+
:object:PurplePygenPass:ability:exit_connect_op
|
|
264
|
+
(nd: ast.ConnectOp) {
|
|
265
|
+
"Edge" |> <self>.add_element_import;
|
|
266
|
+
|> <self>.add_edge_directions;
|
|
267
|
+
|
|
268
|
+
if nd.conn_type {
|
|
269
|
+
(nd, f"{nd.conn_type.meta['py_code']}.{C.WITH_DIR}({C.EDGE_DIR}.{nd.edge_dir.name}") |> <self>.emit;
|
|
270
|
+
} else {
|
|
271
|
+
(nd, f"{C.EDGE_CLASS}().{C.WITH_DIR}({C.EDGE_DIR}.{nd.edge_dir.name}") |> <self>.emit;
|
|
272
|
+
}
|
|
273
|
+
if nd.conn_assign {
|
|
274
|
+
(nd, f", {nd.conn_assign.meta['py_code']})") |> <self>.emit;
|
|
275
|
+
} else {
|
|
276
|
+
(nd, ")") |> <self>.emit;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
"""Sub objects.
|
|
281
|
+
|
|
282
|
+
conn_type: Optional[ExprType],
|
|
283
|
+
conn_assign: Optional[AssignmentList],
|
|
284
|
+
edge_dir: EdgeDir,
|
|
285
|
+
"""
|
|
286
|
+
:object:PurplePygenPass:ability:exit_disconnect_op
|
|
287
|
+
(nd: ast.DisconnectOp) {
|
|
288
|
+
|
|
289
|
+
}
|
|
@@ -9,8 +9,16 @@ jaclang.egg-info/top_level.txt
|
|
|
9
9
|
jaclang/cli/__init__.py
|
|
10
10
|
jaclang/cli/cli.jac
|
|
11
11
|
jaclang/cli/cmds.jac
|
|
12
|
+
jaclang/cli/impl/__init__.py
|
|
13
|
+
jaclang/cli/impl/cli_impl.jac
|
|
14
|
+
jaclang/cli/impl/cmds_impl.jac
|
|
12
15
|
jaclang/core/__init__.py
|
|
13
16
|
jaclang/core/primitives.jac
|
|
17
|
+
jaclang/core/impl/__init__.py
|
|
18
|
+
jaclang/core/impl/arch_impl.jac
|
|
19
|
+
jaclang/core/impl/element_impl.jac
|
|
20
|
+
jaclang/core/impl/exec_ctx_impl.jac
|
|
21
|
+
jaclang/core/impl/memory_impl.jac
|
|
14
22
|
jaclang/jac/__init__.py
|
|
15
23
|
jaclang/jac/absyntree.py
|
|
16
24
|
jaclang/jac/constant.py
|
|
@@ -39,6 +47,8 @@ jaclang/jac/passes/blue/tests/test_sub_node_pass.py
|
|
|
39
47
|
jaclang/jac/passes/blue/tests/test_type_analyze_pass.py
|
|
40
48
|
jaclang/jac/passes/purple/__init__.py
|
|
41
49
|
jaclang/jac/passes/purple/purple_pygen_pass.jac
|
|
50
|
+
jaclang/jac/passes/purple/impl/__init__.py
|
|
51
|
+
jaclang/jac/passes/purple/impl/purple_pygen_pass_impl.jac
|
|
42
52
|
jaclang/jac/tests/__init__.py
|
|
43
53
|
jaclang/jac/tests/test_importer.py
|
|
44
54
|
jaclang/jac/tests/test_lexer.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|