jaclang 0.0.2__py3-none-any.whl → 0.0.3__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/impl/__init__.py +1 -0
- jaclang/cli/impl/cli_impl.jac +93 -0
- jaclang/cli/impl/cmds_impl.jac +26 -0
- jaclang/core/impl/__init__.py +1 -0
- jaclang/core/impl/arch_impl.jac +112 -0
- jaclang/core/impl/element_impl.jac +95 -0
- jaclang/core/impl/exec_ctx_impl.jac +17 -0
- jaclang/core/impl/memory_impl.jac +57 -0
- jaclang/jac/passes/purple/impl/__init__.py +1 -0
- jaclang/jac/passes/purple/impl/purple_pygen_pass_impl.jac +289 -0
- {jaclang-0.0.2.dist-info → jaclang-0.0.3.dist-info}/METADATA +1 -1
- {jaclang-0.0.2.dist-info → jaclang-0.0.3.dist-info}/RECORD +15 -5
- {jaclang-0.0.2.dist-info → jaclang-0.0.3.dist-info}/WHEEL +0 -0
- {jaclang-0.0.2.dist-info → jaclang-0.0.3.dist-info}/entry_points.txt +0 -0
- {jaclang-0.0.2.dist-info → jaclang-0.0.3.dist-info}/top_level.txt +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
|
+
}
|
|
@@ -2,8 +2,16 @@ jaclang/__init__.py,sha256=n8HR401oKxP7ckVZ1cPYl-HTaYszuKV5y0kSqARu3MQ,194
|
|
|
2
2
|
jaclang/cli/__init__.py,sha256=RSosEgm2M0H8QS-H1i-qwVrnHcMClY2TGQlGWPRlXYE,175
|
|
3
3
|
jaclang/cli/cli.jac,sha256=ioxo91yk5RHpDy8qhYSxtl4X9U4nHNAuBQks8wkfI5o,1059
|
|
4
4
|
jaclang/cli/cmds.jac,sha256=QjOVFu5-9OTplEqotc49vqm0CqCyT1j_aW-GAf6RwhY,386
|
|
5
|
+
jaclang/cli/impl/__init__.py,sha256=BTgKqQqL0RDRnEdtLK_MhdR-rLSDnw39xLabPKUotqU,39
|
|
6
|
+
jaclang/cli/impl/cli_impl.jac,sha256=2_KsFrNMINzMbNgYG6jRhw3TmARMZ14F5gi_JcV9Z5A,2398
|
|
7
|
+
jaclang/cli/impl/cmds_impl.jac,sha256=HXSLNaDICww2gMy0qWTTU-KFRe29ZyrfDOIxBM8xAeg,719
|
|
5
8
|
jaclang/core/__init__.py,sha256=q35Msw8l4Z37k8ry1OkVfgkMRkG9LY4O6vEayXcN7yA,212
|
|
6
9
|
jaclang/core/primitives.jac,sha256=t--pgZaOAcLqoQ79EYjrRyk5Ef0n3W2HXm6c4GvRSpQ,2786
|
|
10
|
+
jaclang/core/impl/__init__.py,sha256=BTgKqQqL0RDRnEdtLK_MhdR-rLSDnw39xLabPKUotqU,39
|
|
11
|
+
jaclang/core/impl/arch_impl.jac,sha256=A1LJuGNXBhZ0cN_wmSJn_o9tffDu_EUZWgfjjnIWXOk,3063
|
|
12
|
+
jaclang/core/impl/element_impl.jac,sha256=rgu3RcXJ5uRmXKBlEEsVvcADMQgnj3yPL6DDvSScfa8,2486
|
|
13
|
+
jaclang/core/impl/exec_ctx_impl.jac,sha256=blu_ZYWcx0SuXItjJ4oUfnrllvlFUw9eZbff0OXVob8,370
|
|
14
|
+
jaclang/core/impl/memory_impl.jac,sha256=R27OWfEajtZ05RxYxR3hjiLYK7SxS9IQyZ9Q6U__L8g,1364
|
|
7
15
|
jaclang/jac/__init__.py,sha256=OAIBG-7iYvbebyiu0pJ-lFsua8mD6meBkaTylb8XS64,26
|
|
8
16
|
jaclang/jac/absyntree.py,sha256=wE_IeTCDU9IHTP-JRFw3I3SxIfpvs4q6q-eTN5jqAtw,47429
|
|
9
17
|
jaclang/jac/constant.py,sha256=40jhhphWVj_bvEdnPqoH2SflNT74CZPwBSfxKn0hEwo,1107
|
|
@@ -32,6 +40,8 @@ jaclang/jac/passes/blue/tests/test_sub_node_pass.py,sha256=V4ABc2Na4YoQ6--TP3nH1
|
|
|
32
40
|
jaclang/jac/passes/blue/tests/test_type_analyze_pass.py,sha256=cm8Tf3TnwtJpoOXYd1xlZOyCPTmEmt1_Y_McdS2ARBs,2123
|
|
33
41
|
jaclang/jac/passes/purple/__init__.py,sha256=K0I6Pud7QIQl7xkT8wqpWlxQADSl1t7Ab68P1C3vN3g,343
|
|
34
42
|
jaclang/jac/passes/purple/purple_pygen_pass.jac,sha256=cnkOgFL34yVasCcNA2SbDl5QOKpCRatW--jt5EWeOCQ,1125
|
|
43
|
+
jaclang/jac/passes/purple/impl/__init__.py,sha256=BTgKqQqL0RDRnEdtLK_MhdR-rLSDnw39xLabPKUotqU,39
|
|
44
|
+
jaclang/jac/passes/purple/impl/purple_pygen_pass_impl.jac,sha256=UhBBmUHJfKTtga-ntRoric9yAO8bjsPGi1GyUokjViQ,8501
|
|
35
45
|
jaclang/jac/tests/__init__.py,sha256=qiXa5UNRBanGOcplFKTT9a_9GEyiv7goq1OzuCjDCFE,27
|
|
36
46
|
jaclang/jac/tests/test_importer.py,sha256=mb5c6jb_1cQuW11nxwdJ8ezizuYn26GkIY4bnoY_LJQ,743
|
|
37
47
|
jaclang/jac/tests/test_lexer.py,sha256=iyDawkr9YXYFzdOSgw7V0xJsG-V2Q5yuPP_5JZIde20,1950
|
|
@@ -53,8 +63,8 @@ jaclang/utils/sly/lex.py,sha256=EyK1PDut3uF22Mc60Kcpa58ybfmV02p8L7ylz_1UVuY,1684
|
|
|
53
63
|
jaclang/utils/sly/yacc.py,sha256=KKoDgnmAL6DRpRuatC3WpX2TTjvtcDA5SZ25uCudYvo,88197
|
|
54
64
|
jaclang/utils/tests/__init__.py,sha256=8uwVqMsc6cxBAM1DuHLuNuTnzLXqOqM-WRa4ixOMF6w,23
|
|
55
65
|
jaclang/utils/tests/test_fstring_parser.py,sha256=8nZPKhGZA0JNRQ1jhQkXRsjGV6pBK-jKEEf2nFevYK8,1887
|
|
56
|
-
jaclang-0.0.
|
|
57
|
-
jaclang-0.0.
|
|
58
|
-
jaclang-0.0.
|
|
59
|
-
jaclang-0.0.
|
|
60
|
-
jaclang-0.0.
|
|
66
|
+
jaclang-0.0.3.dist-info/METADATA,sha256=mn5IRS8lJs-xDIx7z9puVGbswF-_AMm53PE9Kq_DaLo,213
|
|
67
|
+
jaclang-0.0.3.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
|
68
|
+
jaclang-0.0.3.dist-info/entry_points.txt,sha256=aMcbIrHSMsY7_wwAjOWoW6F4RzOgrI49M9JYiOORss0,51
|
|
69
|
+
jaclang-0.0.3.dist-info/top_level.txt,sha256=ZOAoLpE67ozkUJd-v3C59wBNXiteRD8IWPbsYB3M08g,8
|
|
70
|
+
jaclang-0.0.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|