Mercurial > python-compiler.rs
annotate src/ast_convert.rs @ 79:6bf54bff8dbd
Add ast.Lambda.
author | Bastien Orivel <eijebong@bananium.fr> |
---|---|
date | Mon, 13 Jun 2016 20:06:34 +0200 |
parents | f1a845e4121b |
children | c6d3f0dabbba |
rev | line source |
---|---|
68 | 1 use python_ast::{Module, stmt, expr, expr_context, cmpop, boolop, operator, unaryop, arguments, arg, alias, comprehension, keyword, withitem, excepthandler}; |
0 | 2 |
3 use cpython::{Python, PyObject}; | |
4 use cpython::ObjectProtocol; //for call method | |
5 | |
1
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
6 fn get_str(py: Python, object: PyObject) -> String { |
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
7 let pystring = object.str(py).unwrap(); |
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
8 let mut string = pystring.to_string(py).unwrap(); |
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
9 string.to_mut().to_string() |
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
10 } |
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
11 |
18 | 12 fn get_ctx(py: Python, object: PyObject) -> expr_context { |
13 let builtins_module = py.import("builtins").unwrap(); | |
14 let isinstance = builtins_module.get(py, "isinstance").unwrap(); | |
15 | |
16 let is_instance = |object: &PyObject, type_: &PyObject| { | |
17 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap(); | |
18 }; | |
19 | |
20 let ast_module = py.import("ast").unwrap(); | |
21 let store_type = ast_module.get(py, "Store").unwrap(); | |
22 let load_type = ast_module.get(py, "Load").unwrap(); | |
21 | 23 let del_type = ast_module.get(py, "Del").unwrap(); |
18 | 24 |
25 let ctx = object.getattr(py, "ctx").unwrap(); | |
26 if is_instance(&ctx, &store_type) { | |
27 expr_context::Store | |
28 } else if is_instance(&ctx, &load_type) { | |
29 expr_context::Load | |
21 | 30 } else if is_instance(&ctx, &del_type) { |
31 expr_context::Del | |
18 | 32 } else{ |
33 unreachable!(); | |
34 } | |
35 } | |
36 | |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
37 fn parse_list<T, F: Fn(Python, PyObject) -> T>(py: Python, list: PyObject, parse: F) -> Vec<T> { |
19
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
38 let mut exprs = vec!(); |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
39 for item in list.iter(py).unwrap() { |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
40 let item = item.unwrap(); |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
41 let item = parse(py, item); |
19
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
42 exprs.push(item); |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
43 } |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
44 exprs |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
45 } |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
46 |
44
5f1d285471af
Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
21
diff
changeset
|
47 fn parse_alias(py: Python, ast: PyObject) -> alias { |
5f1d285471af
Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
21
diff
changeset
|
48 let ast_alias = get_str(py, ast.getattr(py, "name").unwrap()); |
5f1d285471af
Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
21
diff
changeset
|
49 let asname = ast.getattr(py, "asname").unwrap(); |
5f1d285471af
Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
21
diff
changeset
|
50 if asname == py.None() { |
5f1d285471af
Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
21
diff
changeset
|
51 alias{name: ast_alias, asname: None} |
5f1d285471af
Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
21
diff
changeset
|
52 } else { |
5f1d285471af
Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
21
diff
changeset
|
53 alias{name: ast_alias, asname: Some(get_str(py, asname))} |
5f1d285471af
Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
21
diff
changeset
|
54 } |
5f1d285471af
Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
21
diff
changeset
|
55 } |
5f1d285471af
Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
21
diff
changeset
|
56 |
59 | 57 fn parse_withitem(py: Python, ast: PyObject) -> withitem { |
58 let context_expr = ast.getattr(py, "context_expr").unwrap(); | |
59 let optional_vars = ast.getattr(py, "optional_vars").unwrap(); | |
60 | |
61 let context_expr = parse_expr(py, context_expr); | |
62 | |
63 if optional_vars == py.None() { | |
64 withitem{context_expr: context_expr, optional_vars: None} | |
65 } else { | |
66 let optional_vars = parse_expr(py, optional_vars); | |
67 withitem{context_expr: context_expr, optional_vars: Some(optional_vars)} | |
68 } | |
69 } | |
70 | |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
71 fn parse_unaryop(py: Python, ast: PyObject) -> unaryop { |
5
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
72 let builtins_module = py.import("builtins").unwrap(); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
73 let isinstance = builtins_module.get(py, "isinstance").unwrap(); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
74 |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
75 let is_instance = |object: &PyObject, type_: &PyObject| { |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
76 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap(); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
77 }; |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
78 |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
79 let ast_module = py.import("ast").unwrap(); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
80 let ast_type = ast_module.get(py, "AST").unwrap(); |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
81 let invert_type = ast_module.get(py, "Invert").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
82 let not_type = ast_module.get(py, "Not").unwrap(); |
5
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
83 let uadd_type = ast_module.get(py, "UAdd").unwrap(); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
84 let usub_type = ast_module.get(py, "USub").unwrap(); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
85 |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
86 assert!(is_instance(&ast, &ast_type)); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
87 |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
88 if is_instance(&ast, &invert_type) { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
89 unaryop::Invert |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
90 } else if is_instance(&ast, ¬_type) { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
91 unaryop::Not |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
92 } else if is_instance(&ast, &uadd_type) { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
93 unaryop::UAdd |
5
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
94 } else if is_instance(&ast, &usub_type) { |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
95 unaryop::USub |
5
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
96 } else { |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
97 unreachable!() |
5
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
98 } |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
99 } |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
100 |
19
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
101 fn parse_boolop(py: Python, ast: PyObject) -> boolop { |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
102 let builtins_module = py.import("builtins").unwrap(); |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
103 let isinstance = builtins_module.get(py, "isinstance").unwrap(); |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
104 |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
105 let is_instance = |object: &PyObject, type_: &PyObject| { |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
106 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap(); |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
107 }; |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
108 |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
109 let ast_module = py.import("ast").unwrap(); |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
110 let ast_type = ast_module.get(py, "AST").unwrap(); |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
111 let and_type = ast_module.get(py, "And").unwrap(); |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
112 let or_type = ast_module.get(py, "Or").unwrap(); |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
113 |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
114 assert!(is_instance(&ast, &ast_type)); |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
115 |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
116 if is_instance(&ast, &and_type) { |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
117 boolop::And |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
118 } else if is_instance(&ast, &or_type) { |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
119 boolop::Or |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
120 } else { |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
121 unreachable!() |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
122 } |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
123 } |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
124 |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
125 fn parse_cmpop(py: Python, ast: PyObject) -> cmpop { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
126 let builtins_module = py.import("builtins").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
127 let isinstance = builtins_module.get(py, "isinstance").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
128 |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
129 let is_instance = |object: &PyObject, type_: &PyObject| { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
130 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
131 }; |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
132 |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
133 let ast_module = py.import("ast").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
134 let ast_type = ast_module.get(py, "AST").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
135 let eq_type = ast_module.get(py, "Eq").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
136 let noteq_type = ast_module.get(py, "NotEq").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
137 let lt_type = ast_module.get(py, "Lt").unwrap(); |
15
a0fb169fe0f9
Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
14
diff
changeset
|
138 let lte_type = ast_module.get(py, "LtE").unwrap(); |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
139 let gt_type = ast_module.get(py, "Gt").unwrap(); |
15
a0fb169fe0f9
Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
14
diff
changeset
|
140 let gte_type = ast_module.get(py, "GtE").unwrap(); |
a0fb169fe0f9
Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
14
diff
changeset
|
141 let is_type = ast_module.get(py, "Is").unwrap(); |
a0fb169fe0f9
Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
14
diff
changeset
|
142 let is_not_type = ast_module.get(py, "IsNot").unwrap(); |
a0fb169fe0f9
Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
14
diff
changeset
|
143 let in_type = ast_module.get(py, "In").unwrap(); |
a0fb169fe0f9
Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
14
diff
changeset
|
144 let not_in_type = ast_module.get(py, "NotIn").unwrap(); |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
145 |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
146 assert!(is_instance(&ast, &ast_type)); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
147 |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
148 if is_instance(&ast, &eq_type) { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
149 cmpop::Eq |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
150 } else if is_instance(&ast, ¬eq_type) { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
151 cmpop::NotEq |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
152 } else if is_instance(&ast, <_type) { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
153 cmpop::Lt |
15
a0fb169fe0f9
Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
14
diff
changeset
|
154 } else if is_instance(&ast, <e_type) { |
a0fb169fe0f9
Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
14
diff
changeset
|
155 cmpop::LtE |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
156 } else if is_instance(&ast, >_type) { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
157 cmpop::Gt |
15
a0fb169fe0f9
Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
14
diff
changeset
|
158 } else if is_instance(&ast, >e_type) { |
a0fb169fe0f9
Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
14
diff
changeset
|
159 cmpop::GtE |
a0fb169fe0f9
Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
14
diff
changeset
|
160 } else if is_instance(&ast, &is_type) { |
a0fb169fe0f9
Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
14
diff
changeset
|
161 cmpop::Is |
a0fb169fe0f9
Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
14
diff
changeset
|
162 } else if is_instance(&ast, &is_not_type) { |
a0fb169fe0f9
Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
14
diff
changeset
|
163 cmpop::IsNot |
a0fb169fe0f9
Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
14
diff
changeset
|
164 } else if is_instance(&ast, &in_type) { |
a0fb169fe0f9
Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
14
diff
changeset
|
165 cmpop::In |
a0fb169fe0f9
Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
14
diff
changeset
|
166 } else if is_instance(&ast, ¬_in_type) { |
a0fb169fe0f9
Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
14
diff
changeset
|
167 cmpop::NotIn |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
168 } else { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
169 unreachable!() |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
170 } |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
171 } |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
172 |
14 | 173 fn parse_comprehension(py: Python, ast: PyObject) -> comprehension { |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
174 let target = ast.getattr(py, "target").unwrap(); |
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
175 let iter = ast.getattr(py, "iter").unwrap(); |
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
176 let ifs = ast.getattr(py, "ifs").unwrap(); |
14 | 177 |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
178 let target = parse_expr(py, target); |
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
179 let iter = parse_expr(py, iter); |
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
180 let ifs = parse_list(py, ifs, parse_expr); |
14 | 181 |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
182 comprehension {target: target, iter: iter, ifs: ifs} |
14 | 183 } |
184 | |
53
1a815946c2e5
Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
52
diff
changeset
|
185 fn parse_keyword(py: Python, ast: PyObject) -> keyword { |
1a815946c2e5
Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
52
diff
changeset
|
186 let arg = ast.getattr(py, "arg").unwrap(); |
1a815946c2e5
Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
52
diff
changeset
|
187 let value = ast.getattr(py, "value").unwrap(); |
1a815946c2e5
Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
52
diff
changeset
|
188 |
1a815946c2e5
Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
52
diff
changeset
|
189 let arg = if arg == py.None() { |
1a815946c2e5
Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
52
diff
changeset
|
190 None |
1a815946c2e5
Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
52
diff
changeset
|
191 } else { |
1a815946c2e5
Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
52
diff
changeset
|
192 let arg = get_str(py, arg); |
1a815946c2e5
Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
52
diff
changeset
|
193 Some(arg) |
1a815946c2e5
Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
52
diff
changeset
|
194 }; |
1a815946c2e5
Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
52
diff
changeset
|
195 let value = parse_expr(py, value); |
1a815946c2e5
Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
52
diff
changeset
|
196 |
1a815946c2e5
Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
52
diff
changeset
|
197 keyword {arg: arg, value: value} |
1a815946c2e5
Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
52
diff
changeset
|
198 } |
1a815946c2e5
Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
52
diff
changeset
|
199 |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
200 fn parse_operator(py: Python, ast: PyObject) -> operator { |
0 | 201 let builtins_module = py.import("builtins").unwrap(); |
202 let isinstance = builtins_module.get(py, "isinstance").unwrap(); | |
203 | |
204 let is_instance = |object: &PyObject, type_: &PyObject| { | |
205 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap(); | |
206 }; | |
207 | |
208 let ast_module = py.import("ast").unwrap(); | |
209 let ast_type = ast_module.get(py, "AST").unwrap(); | |
210 let add_type = ast_module.get(py, "Add").unwrap(); | |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
211 let sub_type = ast_module.get(py, "Sub").unwrap(); |
0 | 212 let mult_type = ast_module.get(py, "Mult").unwrap(); |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
213 let matmult_type = ast_module.get(py, "MatMult").unwrap(); |
5
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
214 let div_type = ast_module.get(py, "Div").unwrap(); |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
215 let mod_type = ast_module.get(py, "Mod").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
216 let pow_type = ast_module.get(py, "Pow").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
217 let lshift_type = ast_module.get(py, "LShift").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
218 let rshift_type = ast_module.get(py, "RShift").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
219 let bitor_type = ast_module.get(py, "BitOr").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
220 let bitxor_type = ast_module.get(py, "BitXor").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
221 let bitand_type = ast_module.get(py, "BitAnd").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
222 let floordiv_type = ast_module.get(py, "FloorDiv").unwrap(); |
0 | 223 |
224 assert!(is_instance(&ast, &ast_type)); | |
225 | |
226 if is_instance(&ast, &add_type) { | |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
227 operator::Add |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
228 } else if is_instance(&ast, &sub_type) { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
229 operator::Sub |
0 | 230 } else if is_instance(&ast, &mult_type) { |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
231 operator::Mult |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
232 } else if is_instance(&ast, &matmult_type) { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
233 operator::MatMult |
5
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
234 } else if is_instance(&ast, &div_type) { |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
235 operator::Div |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
236 } else if is_instance(&ast, &mod_type) { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
237 operator::Mod |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
238 } else if is_instance(&ast, &pow_type) { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
239 operator::Pow |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
240 } else if is_instance(&ast, &lshift_type) { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
241 operator::LShift |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
242 } else if is_instance(&ast, &rshift_type) { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
243 operator::RShift |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
244 } else if is_instance(&ast, &bitor_type) { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
245 operator::BitOr |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
246 } else if is_instance(&ast, &bitxor_type) { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
247 operator::BitXor |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
248 } else if is_instance(&ast, &bitand_type) { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
249 operator::BitAnd |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
250 } else if is_instance(&ast, &floordiv_type) { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
251 operator::FloorDiv |
0 | 252 } else { |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
253 println!("operator {}", ast); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
254 panic!() |
0 | 255 } |
256 } | |
257 | |
68 | 258 fn parse_excepthandler(py: Python, ast: PyObject) -> excepthandler { |
259 let type_ = ast.getattr(py, "type").unwrap(); | |
260 let name = ast.getattr(py, "name").unwrap(); | |
261 let body = ast.getattr(py, "body").unwrap(); | |
262 | |
263 let type_ = parse_optional_expr(py, type_); | |
264 let name = if name == py.None() { None } else { Some(get_str(py, name)) }; | |
265 let body = parse_list(py, body, parse_statement); | |
266 | |
267 excepthandler{type_: type_, name: name, body: body} | |
268 } | |
269 | |
61
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
270 fn parse_optional_expr(py: Python, ast: PyObject) -> Option<expr> { |
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
271 if ast == py.None() { |
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
272 None |
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
273 } else { |
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
274 let ast = parse_expr(py, ast); |
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
275 Some(ast) |
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
276 } |
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
277 } |
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
278 |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
279 fn parse_expr(py: Python, ast: PyObject) -> expr { |
0 | 280 let builtins_module = py.import("builtins").unwrap(); |
281 let isinstance = builtins_module.get(py, "isinstance").unwrap(); | |
282 | |
283 let is_instance = |object: &PyObject, type_: &PyObject| { | |
284 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap(); | |
285 }; | |
286 | |
287 let ast_module = py.import("ast").unwrap(); | |
288 let ast_type = ast_module.get(py, "AST").unwrap(); | |
5
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
289 let unary_op_type = ast_module.get(py, "UnaryOp").unwrap(); |
19
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
290 let bool_op_type = ast_module.get(py, "BoolOp").unwrap(); |
0 | 291 let bin_op_type = ast_module.get(py, "BinOp").unwrap(); |
292 let name_constant_type = ast_module.get(py, "NameConstant").unwrap(); | |
4
f27a4aee9dfa
Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3
diff
changeset
|
293 let attribute_type = ast_module.get(py, "Attribute").unwrap(); |
0 | 294 let name_type = ast_module.get(py, "Name").unwrap(); |
295 let num_type = ast_module.get(py, "Num").unwrap(); | |
296 let str_type = ast_module.get(py, "Str").unwrap(); | |
7
680d15073f55
Add ast.List literal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
6
diff
changeset
|
297 let list_type = ast_module.get(py, "List").unwrap(); |
0 | 298 let compare_type = ast_module.get(py, "Compare").unwrap(); |
299 let call_type = ast_module.get(py, "Call").unwrap(); | |
14 | 300 let listcomp_type = ast_module.get(py, "ListComp").unwrap(); |
16 | 301 let dictcomp_type = ast_module.get(py, "DictComp").unwrap(); |
17 | 302 let tuple_type = ast_module.get(py, "Tuple").unwrap(); |
52 | 303 let ellipsis_type = ast_module.get(py, "Ellipsis").unwrap(); |
73 | 304 let await_type = ast_module.get(py, "Await").unwrap(); |
74 | 305 let yield_type = ast_module.get(py, "Yield").unwrap(); |
75 | 306 let yield_from_type = ast_module.get(py, "YieldFrom").unwrap(); |
76 | 307 let set_type = ast_module.get(py, "Set").unwrap(); |
77 | 308 let setcomp_type = ast_module.get(py, "SetComp").unwrap(); |
78 | 309 let generatorexp_type = ast_module.get(py, "GeneratorExp").unwrap(); |
79 | 310 let lambda_type = ast_module.get(py, "Lambda").unwrap(); |
0 | 311 |
312 assert!(is_instance(&ast, &ast_type)); | |
313 | |
56
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
314 if is_instance(&ast, &attribute_type) { |
4
f27a4aee9dfa
Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3
diff
changeset
|
315 let value = ast.getattr(py, "value").unwrap(); |
f27a4aee9dfa
Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3
diff
changeset
|
316 let attr = ast.getattr(py, "attr").unwrap(); |
f27a4aee9dfa
Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3
diff
changeset
|
317 |
f27a4aee9dfa
Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3
diff
changeset
|
318 let value = parse_expr(py, value); |
f27a4aee9dfa
Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3
diff
changeset
|
319 let attr = get_str(py, attr); |
f27a4aee9dfa
Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3
diff
changeset
|
320 |
18 | 321 expr::Attribute(Box::new(value), attr, get_ctx(py, ast)) |
0 | 322 } else if is_instance(&ast, &name_type) { |
1
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
323 let id = ast.getattr(py, "id").unwrap(); |
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
324 let id = get_str(py, id); |
18 | 325 expr::Name(id, get_ctx(py, ast)) |
0 | 326 } else if is_instance(&ast, &name_constant_type) { |
1
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
327 let value = ast.getattr(py, "value").unwrap(); |
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
328 let value = get_str(py, value); |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
329 expr::NameConstant(value) |
0 | 330 } else if is_instance(&ast, &num_type) { |
1
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
331 let n = ast.getattr(py, "n").unwrap(); |
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
332 let n = get_str(py, n); |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
333 expr::Num(n) |
0 | 334 } else if is_instance(&ast, &str_type) { |
1
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
335 let s = ast.getattr(py, "s").unwrap(); |
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
336 let s = get_str(py, s); |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
337 expr::Str(s) |
7
680d15073f55
Add ast.List literal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
6
diff
changeset
|
338 } else if is_instance(&ast, &list_type) { |
680d15073f55
Add ast.List literal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
6
diff
changeset
|
339 let elts = ast.getattr(py, "elts").unwrap(); |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
340 let elements = parse_list(py, elts, parse_expr); |
18 | 341 expr::List(elements, get_ctx(py, ast)) |
5
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
342 } else if is_instance(&ast, &unary_op_type) { |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
343 let op = ast.getattr(py, "op").unwrap(); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
344 let operand = ast.getattr(py, "operand").unwrap(); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
345 |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
346 let op = parse_unaryop(py, op); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
347 let operand = parse_expr(py, operand); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
348 |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
349 expr::UnaryOp(op, Box::new(operand)) |
19
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
350 } else if is_instance(&ast, &bool_op_type) { |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
351 let op = ast.getattr(py, "op").unwrap(); |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
352 let values = ast.getattr(py, "values").unwrap(); |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
353 |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
354 let op = parse_boolop(py, op); |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
355 let values = parse_list(py, values, parse_expr); |
19
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
356 |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
357 expr::BoolOp(op, values) |
0 | 358 } else if is_instance(&ast, &bin_op_type) { |
359 let left = ast.getattr(py, "left").unwrap(); | |
360 let op = ast.getattr(py, "op").unwrap(); | |
361 let right = ast.getattr(py, "right").unwrap(); | |
362 | |
363 let left = parse_expr(py, left); | |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
364 let op = parse_operator(py, op); |
0 | 365 let right = parse_expr(py, right); |
366 | |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
367 expr::BinOp(Box::new(left), op, Box::new(right)) |
0 | 368 } else if is_instance(&ast, &call_type) { |
369 let func = ast.getattr(py, "func").unwrap(); | |
370 let args = ast.getattr(py, "args").unwrap(); | |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
371 let keywords = ast.getattr(py, "keywords").unwrap(); |
0 | 372 |
373 let func = parse_expr(py, func); | |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
374 let args = parse_list(py, args, parse_expr); |
53
1a815946c2e5
Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
52
diff
changeset
|
375 let keywords = parse_list(py, keywords, parse_keyword); |
0 | 376 |
53
1a815946c2e5
Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
52
diff
changeset
|
377 expr::Call(Box::new(func), args, keywords) |
0 | 378 } else if is_instance(&ast, &compare_type) { |
379 let left = ast.getattr(py, "left").unwrap(); | |
380 let ops = ast.getattr(py, "ops").unwrap(); | |
381 let comparators = ast.getattr(py, "comparators").unwrap(); | |
382 | |
383 let left = parse_expr(py, left); | |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
384 let ops = parse_list(py, ops, parse_cmpop); |
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
385 let comparators = parse_list(py, comparators, parse_expr); |
0 | 386 |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
387 expr::Compare(Box::new(left), ops, comparators) |
14 | 388 } else if is_instance(&ast, &listcomp_type) { |
389 let elt = ast.getattr(py, "elt").unwrap(); | |
390 let generators = ast.getattr(py, "generators").unwrap(); | |
391 | |
392 let elt = parse_expr(py, elt); | |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
393 let generators = parse_list(py, generators, parse_comprehension); |
14 | 394 |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
395 expr::ListComp(Box::new(elt), generators) |
16 | 396 } else if is_instance(&ast, &dictcomp_type) { |
397 let key = ast.getattr(py, "key").unwrap(); | |
398 let value = ast.getattr(py, "value").unwrap(); | |
399 let generators = ast.getattr(py, "generators").unwrap(); | |
400 | |
401 let key = parse_expr(py, key); | |
402 let value = parse_expr(py, value); | |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
403 let generators = parse_list(py, generators, parse_comprehension); |
16 | 404 |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
405 expr::DictComp(Box::new(key), Box::new(value), generators) |
17 | 406 } else if is_instance(&ast, &tuple_type) { |
407 let elts = ast.getattr(py, "elts").unwrap(); | |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
408 let elts = parse_list(py, elts, parse_expr); |
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
409 expr::Tuple(elts, get_ctx(py, ast)) |
52 | 410 } else if is_instance(&ast, &ellipsis_type) { |
411 expr::Ellipsis | |
73 | 412 } else if is_instance(&ast, &await_type) { |
413 let value = ast.getattr(py, "value").unwrap(); | |
414 let value = parse_expr(py, value); | |
415 | |
416 expr::Await(Box::new(value)) | |
74 | 417 } else if is_instance(&ast, &yield_type) { |
418 let value = ast.getattr(py, "value").unwrap(); | |
419 let value = parse_optional_expr(py, value); | |
420 | |
421 expr::Yield(Box::new(value)) | |
75 | 422 } else if is_instance(&ast, &yield_from_type) { |
423 let value = ast.getattr(py, "value").unwrap(); | |
424 let value = parse_expr(py, value); | |
425 | |
426 expr::YieldFrom(Box::new(value)) | |
76 | 427 } else if is_instance(&ast, &set_type) { |
428 let elts = ast.getattr(py, "elts").unwrap(); | |
429 let elements = parse_list(py, elts, parse_expr); | |
430 | |
431 expr::Set(elements) | |
77 | 432 } else if is_instance(&ast, &setcomp_type) { |
433 let elt = ast.getattr(py, "elt").unwrap(); | |
434 let generators = ast.getattr(py, "generators").unwrap(); | |
435 | |
436 let elt = parse_expr(py, elt); | |
437 let generators = parse_list(py, generators, parse_comprehension); | |
438 | |
439 expr::SetComp(Box::new(elt), generators) | |
78 | 440 } else if is_instance(&ast, &generatorexp_type) { |
441 let elt = ast.getattr(py, "elt").unwrap(); | |
442 let generators = ast.getattr(py, "generators").unwrap(); | |
443 | |
444 let elt = parse_expr(py, elt); | |
445 let generators = parse_list(py, generators, parse_comprehension); | |
446 | |
447 expr::GeneratorExp(Box::new(elt), generators) | |
79 | 448 } else if is_instance(&ast, &lambda_type) { |
449 let args = ast.getattr(py, "args").unwrap(); | |
450 let body = ast.getattr(py, "body").unwrap(); | |
451 | |
452 let args = parse_arguments(py, args); | |
453 let body = parse_expr(py, body); | |
454 | |
455 expr::Lambda(Box::new(args), Box::new(body)) | |
16 | 456 } else { |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
457 println!("expr {}", ast); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
458 unreachable!() |
0 | 459 } |
460 } | |
461 | |
56
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
462 fn parse_arg(py: Python, ast: PyObject) -> arg { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
463 let arg = ast.getattr(py, "arg").unwrap(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
464 let annotation = ast.getattr(py, "annotation").unwrap(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
465 |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
466 let arg = get_str(py, arg); |
61
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
467 let annotation = parse_optional_expr(py, annotation); |
56
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
468 |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
469 arg{arg: arg, annotation: annotation} |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
470 } |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
471 |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
472 fn parse_arguments(py: Python, ast: PyObject) -> arguments { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
473 let builtins_module = py.import("builtins").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
474 let isinstance = builtins_module.get(py, "isinstance").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
475 |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
476 let is_instance = |object: &PyObject, type_: &PyObject| { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
477 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
478 }; |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
479 |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
480 let ast_module = py.import("ast").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
481 let ast_type = ast_module.get(py, "AST").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
482 let arguments_type = ast_module.get(py, "arguments").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
483 let arg_type = ast_module.get(py, "arg").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
484 |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
485 assert!(is_instance(&ast, &ast_type)); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
486 |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
487 if is_instance(&ast, &arguments_type) { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
488 let args = arguments{ |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
489 //args: Vec<arg>, |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
490 args: { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
491 let args = ast.getattr(py, "args").unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
492 let mut arguments = vec!(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
493 for arg in args.iter(py).unwrap() { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
494 let arg = arg.unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
495 assert!(is_instance(&arg, &arg_type)); |
56
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
496 let arg = parse_arg(py, arg); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
497 arguments.push(arg); |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
498 } |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
499 arguments |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
500 }, |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
501 //vararg: Option<arg>, |
56
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
502 vararg: { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
503 let vararg = ast.getattr(py, "vararg").unwrap(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
504 if vararg == py.None() { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
505 None |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
506 } else { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
507 let arg = parse_arg(py, vararg); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
508 Some(arg) |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
509 } |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
510 }, |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
511 //kwonlyargs: Vec<arg>, |
56
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
512 kwonlyargs: { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
513 let kwonlyargs = ast.getattr(py, "kwonlyargs").unwrap(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
514 let mut arguments = vec!(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
515 for arg in kwonlyargs.iter(py).unwrap() { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
516 let arg = arg.unwrap(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
517 assert!(is_instance(&arg, &arg_type)); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
518 let arg = parse_arg(py, arg); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
519 arguments.push(arg); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
520 } |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
521 arguments |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
522 }, |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
523 //kw_defaults: Vec<Option<expr>>, |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
524 kw_defaults: { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
525 let kw_defaults = ast.getattr(py, "kw_defaults").unwrap(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
526 let mut arguments = vec!(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
527 for arg in kw_defaults.iter(py).unwrap() { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
528 let arg = arg.unwrap(); |
61
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
529 let arg = parse_optional_expr(py, arg); |
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
530 |
56
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
531 arguments.push(arg); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
532 } |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
533 arguments |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
534 }, |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
535 //kwarg: Option<arg>, |
56
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
536 kwarg: { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
537 let kwarg = ast.getattr(py, "kwarg").unwrap(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
538 if kwarg == py.None() { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
539 None |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
540 } else { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
541 let arg = parse_arg(py, kwarg); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
542 Some(arg) |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
543 } |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
544 }, |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
545 //defaults: Vec<expr> |
56
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
546 defaults: { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
547 let defaults = ast.getattr(py, "defaults").unwrap(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
548 let mut arguments = vec!(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
549 for arg in defaults.iter(py).unwrap() { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
550 let arg = arg.unwrap(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
551 let arg = parse_expr(py, arg); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
552 arguments.push(arg); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
553 } |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
554 arguments |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
555 } |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
556 }; |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
557 args |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
558 } else { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
559 println!("arguments {}", ast); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
560 panic!() |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
561 } |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
562 } |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
563 |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
564 fn parse_statement(py: Python, ast: PyObject) -> stmt { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
565 //stmt::FunctionDef(expr::Name("function".to_string()), vec!(expr::Name("a".to_string()), expr::Name("b".to_string())), vec!()) |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
566 //stmt::If(expr::BinOp(BinOp::BinEq, Box::new(expr::Name("__name__".to_string())), Box::new(expr::Str("__main__".to_string()))), vec!(stmt::Expr(expr::Call(Box::new(expr::Name("function".to_string())), vec!(expr::Num(1), expr::Num(2)))))) |
0 | 567 |
568 let builtins_module = py.import("builtins").unwrap(); | |
569 let isinstance = builtins_module.get(py, "isinstance").unwrap(); | |
570 | |
571 let is_instance = |object: &PyObject, type_: &PyObject| { | |
572 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap(); | |
573 }; | |
574 | |
575 let ast_module = py.import("ast").unwrap(); | |
576 let ast_type = ast_module.get(py, "AST").unwrap(); | |
2
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
577 let class_def_type = ast_module.get(py, "ClassDef").unwrap(); |
0 | 578 let function_def_type = ast_module.get(py, "FunctionDef").unwrap(); |
69
a73eaf42bea1
Add ast.AsyncDefFunction.
Bastien Orivel <eijebong@bananium.fr>
parents:
68
diff
changeset
|
579 let async_function_def_type = ast_module.get(py, "AsyncFunctionDef").unwrap(); |
0 | 580 let global_type = ast_module.get(py, "Global").unwrap(); |
51 | 581 let nonlocal_type = ast_module.get(py, "Nonlocal").unwrap(); |
0 | 582 let assign_type = ast_module.get(py, "Assign").unwrap(); |
8
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
7
diff
changeset
|
583 let aug_assign_type = ast_module.get(py, "AugAssign").unwrap(); |
0 | 584 let return_type = ast_module.get(py, "Return").unwrap(); |
585 let import_from_type = ast_module.get(py, "ImportFrom").unwrap(); | |
47
38f59b0efc2c
Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
44
diff
changeset
|
586 let import_type = ast_module.get(py, "Import").unwrap(); |
0 | 587 let if_type = ast_module.get(py, "If").unwrap(); |
6
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
588 let while_type = ast_module.get(py, "While").unwrap(); |
5
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
589 let for_type = ast_module.get(py, "For").unwrap(); |
71 | 590 let async_for_type = ast_module.get(py, "AsyncFor").unwrap(); |
0 | 591 let expr_type = ast_module.get(py, "Expr").unwrap(); |
6
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
592 let break_type = ast_module.get(py, "Break").unwrap(); |
21 | 593 let delete_type = ast_module.get(py, "Delete").unwrap(); |
49 | 594 let pass_type = ast_module.get(py, "Pass").unwrap(); |
50 | 595 let continue_type = ast_module.get(py, "Continue").unwrap(); |
57 | 596 let assert_type = ast_module.get(py, "Assert").unwrap(); |
59 | 597 let with_type = ast_module.get(py, "With").unwrap(); |
72 | 598 let async_with_type = ast_module.get(py, "AsyncWith").unwrap(); |
60 | 599 let raise_type = ast_module.get(py, "Raise").unwrap(); |
68 | 600 let try_type = ast_module.get(py, "Try").unwrap(); |
0 | 601 |
602 assert!(is_instance(&ast, &ast_type)); | |
603 | |
604 /* | |
605 // TODO: implement Hash for PyObject. (trivial) | |
606 let map = { | |
607 let fields = ast.getattr(py, "_fields").unwrap(); | |
608 let mut map = HashMap::new(); | |
609 for field in fields.iter(py).unwrap() { | |
610 let field = field.unwrap(); | |
611 let value = ast.getattr(py, field).unwrap(); | |
612 map.insert(field, value); | |
613 } | |
614 map | |
615 }; | |
616 */ | |
617 | |
2
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
618 if is_instance(&ast, &class_def_type) { |
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
619 let name = ast.getattr(py, "name").unwrap(); |
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
620 let bases = ast.getattr(py, "bases").unwrap(); |
67
8ce78e2ba48c
Implement class keywords.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
65
diff
changeset
|
621 let keywords = ast.getattr(py, "keywords").unwrap(); |
2
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
622 let body = ast.getattr(py, "body").unwrap(); |
65
ce5e27a3f277
Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
64
diff
changeset
|
623 let decorator_list = ast.getattr(py, "decorator_list").unwrap(); |
2
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
624 |
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
625 let name = get_str(py, name); |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
626 let bases = parse_list(py, bases, parse_expr); |
67
8ce78e2ba48c
Implement class keywords.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
65
diff
changeset
|
627 let keywords = parse_list(py, keywords, parse_keyword); |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
628 let body = parse_list(py, body, parse_statement); |
65
ce5e27a3f277
Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
64
diff
changeset
|
629 let decorator_list = parse_list(py, decorator_list, parse_expr); |
2
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
630 |
67
8ce78e2ba48c
Implement class keywords.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
65
diff
changeset
|
631 stmt::ClassDef(name, bases, keywords, body, decorator_list) |
69
a73eaf42bea1
Add ast.AsyncDefFunction.
Bastien Orivel <eijebong@bananium.fr>
parents:
68
diff
changeset
|
632 } else if is_instance(&ast, &function_def_type) || is_instance(&ast, &async_function_def_type) { |
0 | 633 let name = ast.getattr(py, "name").unwrap(); |
634 let args = ast.getattr(py, "args").unwrap(); | |
635 let body = ast.getattr(py, "body").unwrap(); | |
64
53817b39f139
Add FunctionDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
63
diff
changeset
|
636 let decorator_list = ast.getattr(py, "decorator_list").unwrap(); |
63
5df52b40fe54
Implement FunctionDef.returns.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
61
diff
changeset
|
637 let returns = ast.getattr(py, "returns").unwrap(); |
0 | 638 |
1
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
639 let name = get_str(py, name); |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
640 let args = parse_arguments(py, args); |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
641 let body = parse_list(py, body, parse_statement); |
64
53817b39f139
Add FunctionDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
63
diff
changeset
|
642 let decorator_list = parse_list(py, decorator_list, parse_expr); |
63
5df52b40fe54
Implement FunctionDef.returns.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
61
diff
changeset
|
643 let returns = parse_optional_expr(py, returns); |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
644 |
69
a73eaf42bea1
Add ast.AsyncDefFunction.
Bastien Orivel <eijebong@bananium.fr>
parents:
68
diff
changeset
|
645 stmt::FunctionDef(name, args, body, decorator_list, returns, is_instance(&ast, &async_function_def_type)) |
0 | 646 } else if is_instance(&ast, &global_type) { |
647 let names = ast.getattr(py, "names").unwrap(); | |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
648 let names = parse_list(py, names, get_str); |
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
649 stmt::Global(names) |
51 | 650 } else if is_instance(&ast, &nonlocal_type) { |
651 let names = ast.getattr(py, "names").unwrap(); | |
652 let names = parse_list(py, names, get_str); | |
653 stmt::Nonlocal(names) | |
0 | 654 } else if is_instance(&ast, &if_type) { |
655 let test = ast.getattr(py, "test").unwrap(); | |
656 let body = ast.getattr(py, "body").unwrap(); | |
657 let orelse = ast.getattr(py, "orelse").unwrap(); | |
658 | |
659 let test = parse_expr(py, test); | |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
660 let body = parse_list(py, body, parse_statement); |
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
661 let orelse = parse_list(py, orelse, parse_statement); |
0 | 662 |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
663 stmt::If(test, body, orelse) |
6
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
664 } else if is_instance(&ast, &while_type) { |
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
665 let test = ast.getattr(py, "test").unwrap(); |
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
666 let body = ast.getattr(py, "body").unwrap(); |
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
667 let orelse = ast.getattr(py, "orelse").unwrap(); |
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
668 |
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
669 let test = parse_expr(py, test); |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
670 let body = parse_list(py, body, parse_statement); |
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
671 let orelse = parse_list(py, orelse, parse_statement); |
6
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
672 |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
673 stmt::While(test, body, orelse) |
71 | 674 } else if is_instance(&ast, &for_type) || is_instance(&ast, &async_for_type) { |
5
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
675 let target = ast.getattr(py, "target").unwrap(); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
676 let iter = ast.getattr(py, "iter").unwrap(); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
677 let body = ast.getattr(py, "body").unwrap(); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
678 let orelse = ast.getattr(py, "orelse").unwrap(); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
679 |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
680 let target = parse_expr(py, target); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
681 let iter = parse_expr(py, iter); |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
682 let body = parse_list(py, body, parse_statement); |
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
683 let orelse = parse_list(py, orelse, parse_statement); |
5
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
684 |
71 | 685 stmt::For(target, iter, body, orelse, is_instance(&ast, &async_for_type)) |
0 | 686 } else if is_instance(&ast, &assign_type) { |
687 let targets = ast.getattr(py, "targets").unwrap(); | |
688 let value = ast.getattr(py, "value").unwrap(); | |
689 | |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
690 let targets = parse_list(py, targets, parse_expr); |
0 | 691 let value = parse_expr(py, value); |
692 | |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
693 stmt::Assign(targets, value) |
8
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
7
diff
changeset
|
694 } else if is_instance(&ast, &aug_assign_type) { |
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
7
diff
changeset
|
695 let target = ast.getattr(py, "target").unwrap(); |
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
7
diff
changeset
|
696 let op = ast.getattr(py, "op").unwrap(); |
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
7
diff
changeset
|
697 let value = ast.getattr(py, "value").unwrap(); |
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
7
diff
changeset
|
698 |
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
7
diff
changeset
|
699 let target = parse_expr(py, target); |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
700 let op = parse_operator(py, op); |
8
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
7
diff
changeset
|
701 let value = parse_expr(py, value); |
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
7
diff
changeset
|
702 |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
703 stmt::AugAssign(target, op, value) |
0 | 704 } else if is_instance(&ast, &import_from_type) { |
705 let module = ast.getattr(py, "module").unwrap(); | |
706 let names = ast.getattr(py, "names").unwrap(); | |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
707 let level = ast.getattr(py, "level").unwrap(); |
0 | 708 |
1
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
709 let module = get_str(py, module); |
44
5f1d285471af
Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
21
diff
changeset
|
710 let names = parse_list(py, names, parse_alias); |
0 | 711 |
48
039f85b187f2
Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents:
47
diff
changeset
|
712 if level == py.None() { |
039f85b187f2
Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents:
47
diff
changeset
|
713 stmt::ImportFrom(module, names, None) |
039f85b187f2
Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents:
47
diff
changeset
|
714 } else { |
039f85b187f2
Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents:
47
diff
changeset
|
715 let level = level.extract(py).unwrap(); |
039f85b187f2
Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents:
47
diff
changeset
|
716 stmt::ImportFrom(module, names, Some(level)) |
039f85b187f2
Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents:
47
diff
changeset
|
717 } |
47
38f59b0efc2c
Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
44
diff
changeset
|
718 } else if is_instance(&ast, &import_type) { |
38f59b0efc2c
Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
44
diff
changeset
|
719 let names = ast.getattr(py, "names").unwrap(); |
38f59b0efc2c
Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
44
diff
changeset
|
720 let names = parse_list(py, names, parse_alias); |
38f59b0efc2c
Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
44
diff
changeset
|
721 |
38f59b0efc2c
Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
44
diff
changeset
|
722 stmt::Import(names) |
0 | 723 } else if is_instance(&ast, &return_type) { |
724 let value = ast.getattr(py, "value").unwrap(); | |
61
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
725 let value = parse_optional_expr(py, value); |
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
726 |
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
727 stmt::Return(value) |
0 | 728 } else if is_instance(&ast, &expr_type) { |
729 let value = ast.getattr(py, "value").unwrap(); | |
730 let value = parse_expr(py, value); | |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
731 stmt::Expr(value) |
6
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
732 } else if is_instance(&ast, &break_type) { |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
733 stmt::Break |
21 | 734 } else if is_instance(&ast, &delete_type) { |
735 let targets = ast.getattr(py, "targets").unwrap(); | |
736 let targets = parse_list(py, targets, parse_expr); | |
737 stmt::Delete(targets) | |
49 | 738 } else if is_instance(&ast, &pass_type) { |
739 stmt::Pass | |
50 | 740 } else if is_instance(&ast, &continue_type) { |
741 stmt::Continue | |
57 | 742 } else if is_instance(&ast, &assert_type) { |
743 let test = ast.getattr(py, "test").unwrap(); | |
744 let msg = ast.getattr(py, "msg").unwrap(); | |
745 | |
61
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
746 let test = parse_expr(py, test); |
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
747 let msg = parse_optional_expr(py, msg); |
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
748 |
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
749 stmt::Assert(test, msg) |
72 | 750 } else if is_instance(&ast, &with_type) || is_instance(&ast, &async_with_type) { |
59 | 751 let items = ast.getattr(py, "items").unwrap(); |
752 let body = ast.getattr(py, "body").unwrap(); | |
753 | |
754 let items = parse_list(py, items, parse_withitem); | |
755 let body = parse_list(py, body, parse_statement); | |
72 | 756 stmt::With(items, body, is_instance(&ast, &async_with_type)) |
60 | 757 } else if is_instance(&ast, &raise_type) { |
758 let exc = ast.getattr(py, "exc").unwrap(); | |
759 let cause = ast.getattr(py, "cause").unwrap(); | |
760 | |
61
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
761 let exc = parse_optional_expr(py, exc); |
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
762 let cause = parse_optional_expr(py, cause); |
60 | 763 |
61
6b73843c5b4a
Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents:
60
diff
changeset
|
764 stmt::Raise(exc, cause) |
68 | 765 } else if is_instance(&ast, &try_type) { |
766 let body = ast.getattr(py, "body").unwrap(); | |
767 let excepthandlers = ast.getattr(py, "handlers").unwrap(); | |
768 let orelse = ast.getattr(py, "orelse").unwrap(); | |
769 let finalbody = ast.getattr(py, "finalbody").unwrap(); | |
770 | |
771 let body = parse_list(py, body, parse_statement); | |
772 let excepthandlers = parse_list(py, excepthandlers, parse_excepthandler); | |
773 let orelse = parse_list(py, orelse, parse_statement); | |
774 let finalbody = parse_list(py, finalbody, parse_statement); | |
775 | |
776 stmt::Try(body, excepthandlers, orelse, finalbody) | |
0 | 777 } else { |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
778 println!("stmt {}", ast); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
779 panic!() |
0 | 780 } |
781 } | |
782 | |
783 #[allow(dead_code)] | |
784 pub fn convert_ast(name: String, module: &PyObject) -> Module { | |
785 let gil = Python::acquire_gil(); | |
786 let py = gil.python(); | |
787 | |
788 let builtins_module = py.import("builtins").unwrap(); | |
789 let isinstance = builtins_module.get(py, "isinstance").unwrap(); | |
790 | |
791 let ast_module = py.import("ast").unwrap(); | |
792 let module_type = ast_module.get(py, "Module").unwrap(); | |
793 | |
794 assert!(isinstance.call(py, (module, module_type), None).unwrap().is_true(py).unwrap()); | |
795 | |
796 let body = module.getattr(py, "body").unwrap(); | |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
797 let body = parse_list(py, body, parse_statement); |
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
798 Module{name: name, statements: body} |
0 | 799 } |