Mercurial > python-compiler.rs
annotate src/ast_convert.rs @ 77:7d1406181aae
Add ast.SetComp.
author | Bastien Orivel <eijebong@bananium.fr> |
---|---|
date | Mon, 13 Jun 2016 19:22:59 +0200 |
parents | efd42fc280e8 |
children | f1a845e4121b |
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(); |
0 | 309 |
310 assert!(is_instance(&ast, &ast_type)); | |
311 | |
56
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
312 if is_instance(&ast, &attribute_type) { |
4
f27a4aee9dfa
Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3
diff
changeset
|
313 let value = ast.getattr(py, "value").unwrap(); |
f27a4aee9dfa
Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3
diff
changeset
|
314 let attr = ast.getattr(py, "attr").unwrap(); |
f27a4aee9dfa
Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3
diff
changeset
|
315 |
f27a4aee9dfa
Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3
diff
changeset
|
316 let value = parse_expr(py, value); |
f27a4aee9dfa
Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3
diff
changeset
|
317 let attr = get_str(py, attr); |
f27a4aee9dfa
Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3
diff
changeset
|
318 |
18 | 319 expr::Attribute(Box::new(value), attr, get_ctx(py, ast)) |
0 | 320 } 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
|
321 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
|
322 let id = get_str(py, id); |
18 | 323 expr::Name(id, get_ctx(py, ast)) |
0 | 324 } 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
|
325 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
|
326 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
|
327 expr::NameConstant(value) |
0 | 328 } 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
|
329 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
|
330 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
|
331 expr::Num(n) |
0 | 332 } 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
|
333 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
|
334 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
|
335 expr::Str(s) |
7
680d15073f55
Add ast.List literal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
6
diff
changeset
|
336 } else if is_instance(&ast, &list_type) { |
680d15073f55
Add ast.List literal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
6
diff
changeset
|
337 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
|
338 let elements = parse_list(py, elts, parse_expr); |
18 | 339 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
|
340 } 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
|
341 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
|
342 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
|
343 |
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 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
|
345 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
|
346 |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
347 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
|
348 } 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
|
349 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
|
350 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
|
351 |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
352 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
|
353 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
|
354 |
0cb53a31ac12
Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
18
diff
changeset
|
355 expr::BoolOp(op, values) |
0 | 356 } else if is_instance(&ast, &bin_op_type) { |
357 let left = ast.getattr(py, "left").unwrap(); | |
358 let op = ast.getattr(py, "op").unwrap(); | |
359 let right = ast.getattr(py, "right").unwrap(); | |
360 | |
361 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
|
362 let op = parse_operator(py, op); |
0 | 363 let right = parse_expr(py, right); |
364 | |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
365 expr::BinOp(Box::new(left), op, Box::new(right)) |
0 | 366 } else if is_instance(&ast, &call_type) { |
367 let func = ast.getattr(py, "func").unwrap(); | |
368 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
|
369 let keywords = ast.getattr(py, "keywords").unwrap(); |
0 | 370 |
371 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
|
372 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
|
373 let keywords = parse_list(py, keywords, parse_keyword); |
0 | 374 |
53
1a815946c2e5
Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
52
diff
changeset
|
375 expr::Call(Box::new(func), args, keywords) |
0 | 376 } else if is_instance(&ast, &compare_type) { |
377 let left = ast.getattr(py, "left").unwrap(); | |
378 let ops = ast.getattr(py, "ops").unwrap(); | |
379 let comparators = ast.getattr(py, "comparators").unwrap(); | |
380 | |
381 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
|
382 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
|
383 let comparators = parse_list(py, comparators, parse_expr); |
0 | 384 |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
385 expr::Compare(Box::new(left), ops, comparators) |
14 | 386 } else if is_instance(&ast, &listcomp_type) { |
387 let elt = ast.getattr(py, "elt").unwrap(); | |
388 let generators = ast.getattr(py, "generators").unwrap(); | |
389 | |
390 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
|
391 let generators = parse_list(py, generators, parse_comprehension); |
14 | 392 |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
393 expr::ListComp(Box::new(elt), generators) |
16 | 394 } else if is_instance(&ast, &dictcomp_type) { |
395 let key = ast.getattr(py, "key").unwrap(); | |
396 let value = ast.getattr(py, "value").unwrap(); | |
397 let generators = ast.getattr(py, "generators").unwrap(); | |
398 | |
399 let key = parse_expr(py, key); | |
400 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
|
401 let generators = parse_list(py, generators, parse_comprehension); |
16 | 402 |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
403 expr::DictComp(Box::new(key), Box::new(value), generators) |
17 | 404 } else if is_instance(&ast, &tuple_type) { |
405 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
|
406 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
|
407 expr::Tuple(elts, get_ctx(py, ast)) |
52 | 408 } else if is_instance(&ast, &ellipsis_type) { |
409 expr::Ellipsis | |
73 | 410 } else if is_instance(&ast, &await_type) { |
411 let value = ast.getattr(py, "value").unwrap(); | |
412 let value = parse_expr(py, value); | |
413 | |
414 expr::Await(Box::new(value)) | |
74 | 415 } else if is_instance(&ast, &yield_type) { |
416 let value = ast.getattr(py, "value").unwrap(); | |
417 let value = parse_optional_expr(py, value); | |
418 | |
419 expr::Yield(Box::new(value)) | |
75 | 420 } else if is_instance(&ast, &yield_from_type) { |
421 let value = ast.getattr(py, "value").unwrap(); | |
422 let value = parse_expr(py, value); | |
423 | |
424 expr::YieldFrom(Box::new(value)) | |
76 | 425 } else if is_instance(&ast, &set_type) { |
426 let elts = ast.getattr(py, "elts").unwrap(); | |
427 let elements = parse_list(py, elts, parse_expr); | |
428 | |
429 expr::Set(elements) | |
77 | 430 } else if is_instance(&ast, &setcomp_type) { |
431 let elt = ast.getattr(py, "elt").unwrap(); | |
432 let generators = ast.getattr(py, "generators").unwrap(); | |
433 | |
434 let elt = parse_expr(py, elt); | |
435 let generators = parse_list(py, generators, parse_comprehension); | |
436 | |
437 expr::SetComp(Box::new(elt), generators) | |
16 | 438 } else { |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
439 println!("expr {}", ast); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
440 unreachable!() |
0 | 441 } |
442 } | |
443 | |
56
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
444 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
|
445 let arg = ast.getattr(py, "arg").unwrap(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
446 let annotation = ast.getattr(py, "annotation").unwrap(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
447 |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
448 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
|
449 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
|
450 |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
451 arg{arg: arg, annotation: annotation} |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
452 } |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
453 |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
454 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
|
455 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
|
456 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
|
457 |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
458 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
|
459 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
|
460 }; |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
461 |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
462 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
|
463 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
|
464 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
|
465 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
|
466 |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
467 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
|
468 |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
469 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
|
470 let args = arguments{ |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
471 //args: Vec<arg>, |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
472 args: { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
473 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
|
474 let mut arguments = vec!(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
475 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
|
476 let arg = arg.unwrap(); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
477 assert!(is_instance(&arg, &arg_type)); |
56
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
478 let arg = parse_arg(py, arg); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
479 arguments.push(arg); |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
480 } |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
481 arguments |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
482 }, |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
483 //vararg: Option<arg>, |
56
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
484 vararg: { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
485 let vararg = ast.getattr(py, "vararg").unwrap(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
486 if vararg == py.None() { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
487 None |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
488 } else { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
489 let arg = parse_arg(py, vararg); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
490 Some(arg) |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
491 } |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
492 }, |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
493 //kwonlyargs: Vec<arg>, |
56
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
494 kwonlyargs: { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
495 let kwonlyargs = ast.getattr(py, "kwonlyargs").unwrap(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
496 let mut arguments = vec!(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
497 for arg in kwonlyargs.iter(py).unwrap() { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
498 let arg = arg.unwrap(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
499 assert!(is_instance(&arg, &arg_type)); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
500 let arg = parse_arg(py, arg); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
501 arguments.push(arg); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
502 } |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
503 arguments |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
504 }, |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
505 //kw_defaults: Vec<Option<expr>>, |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
506 kw_defaults: { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
507 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
|
508 let mut arguments = vec!(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
509 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
|
510 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
|
511 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
|
512 |
56
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
513 arguments.push(arg); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
514 } |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
515 arguments |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
516 }, |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
517 //kwarg: Option<arg>, |
56
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
518 kwarg: { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
519 let kwarg = ast.getattr(py, "kwarg").unwrap(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
520 if kwarg == py.None() { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
521 None |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
522 } else { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
523 let arg = parse_arg(py, kwarg); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
524 Some(arg) |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
525 } |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
526 }, |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
527 //defaults: Vec<expr> |
56
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
528 defaults: { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
529 let defaults = ast.getattr(py, "defaults").unwrap(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
530 let mut arguments = vec!(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
531 for arg in defaults.iter(py).unwrap() { |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
532 let arg = arg.unwrap(); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
533 let arg = parse_expr(py, arg); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
534 arguments.push(arg); |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
535 } |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
536 arguments |
c3cc16b933d2
Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
53
diff
changeset
|
537 } |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
538 }; |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
539 args |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
540 } else { |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
541 println!("arguments {}", ast); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
542 panic!() |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
543 } |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
544 } |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
545 |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
546 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
|
547 //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
|
548 //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 | 549 |
550 let builtins_module = py.import("builtins").unwrap(); | |
551 let isinstance = builtins_module.get(py, "isinstance").unwrap(); | |
552 | |
553 let is_instance = |object: &PyObject, type_: &PyObject| { | |
554 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap(); | |
555 }; | |
556 | |
557 let ast_module = py.import("ast").unwrap(); | |
558 let ast_type = ast_module.get(py, "AST").unwrap(); | |
2
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
559 let class_def_type = ast_module.get(py, "ClassDef").unwrap(); |
0 | 560 let function_def_type = ast_module.get(py, "FunctionDef").unwrap(); |
69
a73eaf42bea1
Add ast.AsyncDefFunction.
Bastien Orivel <eijebong@bananium.fr>
parents:
68
diff
changeset
|
561 let async_function_def_type = ast_module.get(py, "AsyncFunctionDef").unwrap(); |
0 | 562 let global_type = ast_module.get(py, "Global").unwrap(); |
51 | 563 let nonlocal_type = ast_module.get(py, "Nonlocal").unwrap(); |
0 | 564 let assign_type = ast_module.get(py, "Assign").unwrap(); |
8
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
7
diff
changeset
|
565 let aug_assign_type = ast_module.get(py, "AugAssign").unwrap(); |
0 | 566 let return_type = ast_module.get(py, "Return").unwrap(); |
567 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
|
568 let import_type = ast_module.get(py, "Import").unwrap(); |
0 | 569 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
|
570 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
|
571 let for_type = ast_module.get(py, "For").unwrap(); |
71 | 572 let async_for_type = ast_module.get(py, "AsyncFor").unwrap(); |
0 | 573 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
|
574 let break_type = ast_module.get(py, "Break").unwrap(); |
21 | 575 let delete_type = ast_module.get(py, "Delete").unwrap(); |
49 | 576 let pass_type = ast_module.get(py, "Pass").unwrap(); |
50 | 577 let continue_type = ast_module.get(py, "Continue").unwrap(); |
57 | 578 let assert_type = ast_module.get(py, "Assert").unwrap(); |
59 | 579 let with_type = ast_module.get(py, "With").unwrap(); |
72 | 580 let async_with_type = ast_module.get(py, "AsyncWith").unwrap(); |
60 | 581 let raise_type = ast_module.get(py, "Raise").unwrap(); |
68 | 582 let try_type = ast_module.get(py, "Try").unwrap(); |
0 | 583 |
584 assert!(is_instance(&ast, &ast_type)); | |
585 | |
586 /* | |
587 // TODO: implement Hash for PyObject. (trivial) | |
588 let map = { | |
589 let fields = ast.getattr(py, "_fields").unwrap(); | |
590 let mut map = HashMap::new(); | |
591 for field in fields.iter(py).unwrap() { | |
592 let field = field.unwrap(); | |
593 let value = ast.getattr(py, field).unwrap(); | |
594 map.insert(field, value); | |
595 } | |
596 map | |
597 }; | |
598 */ | |
599 | |
2
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
600 if is_instance(&ast, &class_def_type) { |
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
601 let name = ast.getattr(py, "name").unwrap(); |
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
602 let bases = ast.getattr(py, "bases").unwrap(); |
67
8ce78e2ba48c
Implement class keywords.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
65
diff
changeset
|
603 let keywords = ast.getattr(py, "keywords").unwrap(); |
2
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
604 let body = ast.getattr(py, "body").unwrap(); |
65
ce5e27a3f277
Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
64
diff
changeset
|
605 let decorator_list = ast.getattr(py, "decorator_list").unwrap(); |
2
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
606 |
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
607 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
|
608 let bases = parse_list(py, bases, parse_expr); |
67
8ce78e2ba48c
Implement class keywords.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
65
diff
changeset
|
609 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
|
610 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
|
611 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
|
612 |
67
8ce78e2ba48c
Implement class keywords.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
65
diff
changeset
|
613 stmt::ClassDef(name, bases, keywords, body, decorator_list) |
69
a73eaf42bea1
Add ast.AsyncDefFunction.
Bastien Orivel <eijebong@bananium.fr>
parents:
68
diff
changeset
|
614 } else if is_instance(&ast, &function_def_type) || is_instance(&ast, &async_function_def_type) { |
0 | 615 let name = ast.getattr(py, "name").unwrap(); |
616 let args = ast.getattr(py, "args").unwrap(); | |
617 let body = ast.getattr(py, "body").unwrap(); | |
64
53817b39f139
Add FunctionDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
63
diff
changeset
|
618 let decorator_list = ast.getattr(py, "decorator_list").unwrap(); |
63
5df52b40fe54
Implement FunctionDef.returns.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
61
diff
changeset
|
619 let returns = ast.getattr(py, "returns").unwrap(); |
0 | 620 |
1
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
621 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
|
622 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
|
623 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
|
624 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
|
625 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
|
626 |
69
a73eaf42bea1
Add ast.AsyncDefFunction.
Bastien Orivel <eijebong@bananium.fr>
parents:
68
diff
changeset
|
627 stmt::FunctionDef(name, args, body, decorator_list, returns, is_instance(&ast, &async_function_def_type)) |
0 | 628 } else if is_instance(&ast, &global_type) { |
629 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
|
630 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
|
631 stmt::Global(names) |
51 | 632 } else if is_instance(&ast, &nonlocal_type) { |
633 let names = ast.getattr(py, "names").unwrap(); | |
634 let names = parse_list(py, names, get_str); | |
635 stmt::Nonlocal(names) | |
0 | 636 } else if is_instance(&ast, &if_type) { |
637 let test = ast.getattr(py, "test").unwrap(); | |
638 let body = ast.getattr(py, "body").unwrap(); | |
639 let orelse = ast.getattr(py, "orelse").unwrap(); | |
640 | |
641 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
|
642 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
|
643 let orelse = parse_list(py, orelse, parse_statement); |
0 | 644 |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
645 stmt::If(test, body, orelse) |
6
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
646 } else if is_instance(&ast, &while_type) { |
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
647 let test = ast.getattr(py, "test").unwrap(); |
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
648 let body = ast.getattr(py, "body").unwrap(); |
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
649 let orelse = ast.getattr(py, "orelse").unwrap(); |
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
650 |
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
651 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
|
652 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
|
653 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
|
654 |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
655 stmt::While(test, body, orelse) |
71 | 656 } 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
|
657 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
|
658 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
|
659 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
|
660 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
|
661 |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
4
diff
changeset
|
662 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
|
663 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
|
664 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
|
665 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
|
666 |
71 | 667 stmt::For(target, iter, body, orelse, is_instance(&ast, &async_for_type)) |
0 | 668 } else if is_instance(&ast, &assign_type) { |
669 let targets = ast.getattr(py, "targets").unwrap(); | |
670 let value = ast.getattr(py, "value").unwrap(); | |
671 | |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
672 let targets = parse_list(py, targets, parse_expr); |
0 | 673 let value = parse_expr(py, value); |
674 | |
20
ace12d6b9855
Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
19
diff
changeset
|
675 stmt::Assign(targets, value) |
8
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
7
diff
changeset
|
676 } else if is_instance(&ast, &aug_assign_type) { |
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
7
diff
changeset
|
677 let target = ast.getattr(py, "target").unwrap(); |
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
7
diff
changeset
|
678 let op = ast.getattr(py, "op").unwrap(); |
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
7
diff
changeset
|
679 let value = ast.getattr(py, "value").unwrap(); |
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
7
diff
changeset
|
680 |
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
7
diff
changeset
|
681 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
|
682 let op = parse_operator(py, op); |
8
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
7
diff
changeset
|
683 let value = parse_expr(py, value); |
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
7
diff
changeset
|
684 |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
685 stmt::AugAssign(target, op, value) |
0 | 686 } else if is_instance(&ast, &import_from_type) { |
687 let module = ast.getattr(py, "module").unwrap(); | |
688 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
|
689 let level = ast.getattr(py, "level").unwrap(); |
0 | 690 |
1
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
691 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
|
692 let names = parse_list(py, names, parse_alias); |
0 | 693 |
48
039f85b187f2
Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents:
47
diff
changeset
|
694 if level == py.None() { |
039f85b187f2
Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents:
47
diff
changeset
|
695 stmt::ImportFrom(module, names, None) |
039f85b187f2
Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents:
47
diff
changeset
|
696 } else { |
039f85b187f2
Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents:
47
diff
changeset
|
697 let level = level.extract(py).unwrap(); |
039f85b187f2
Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents:
47
diff
changeset
|
698 stmt::ImportFrom(module, names, Some(level)) |
039f85b187f2
Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents:
47
diff
changeset
|
699 } |
47
38f59b0efc2c
Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
44
diff
changeset
|
700 } 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
|
701 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
|
702 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
|
703 |
38f59b0efc2c
Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents:
44
diff
changeset
|
704 stmt::Import(names) |
0 | 705 } else if is_instance(&ast, &return_type) { |
706 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
|
707 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
|
708 |
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
|
709 stmt::Return(value) |
0 | 710 } else if is_instance(&ast, &expr_type) { |
711 let value = ast.getattr(py, "value").unwrap(); | |
712 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
|
713 stmt::Expr(value) |
6
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
714 } 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
|
715 stmt::Break |
21 | 716 } else if is_instance(&ast, &delete_type) { |
717 let targets = ast.getattr(py, "targets").unwrap(); | |
718 let targets = parse_list(py, targets, parse_expr); | |
719 stmt::Delete(targets) | |
49 | 720 } else if is_instance(&ast, &pass_type) { |
721 stmt::Pass | |
50 | 722 } else if is_instance(&ast, &continue_type) { |
723 stmt::Continue | |
57 | 724 } else if is_instance(&ast, &assert_type) { |
725 let test = ast.getattr(py, "test").unwrap(); | |
726 let msg = ast.getattr(py, "msg").unwrap(); | |
727 | |
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
|
728 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
|
729 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
|
730 |
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
|
731 stmt::Assert(test, msg) |
72 | 732 } else if is_instance(&ast, &with_type) || is_instance(&ast, &async_with_type) { |
59 | 733 let items = ast.getattr(py, "items").unwrap(); |
734 let body = ast.getattr(py, "body").unwrap(); | |
735 | |
736 let items = parse_list(py, items, parse_withitem); | |
737 let body = parse_list(py, body, parse_statement); | |
72 | 738 stmt::With(items, body, is_instance(&ast, &async_with_type)) |
60 | 739 } else if is_instance(&ast, &raise_type) { |
740 let exc = ast.getattr(py, "exc").unwrap(); | |
741 let cause = ast.getattr(py, "cause").unwrap(); | |
742 | |
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
|
743 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
|
744 let cause = parse_optional_expr(py, cause); |
60 | 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 stmt::Raise(exc, cause) |
68 | 747 } else if is_instance(&ast, &try_type) { |
748 let body = ast.getattr(py, "body").unwrap(); | |
749 let excepthandlers = ast.getattr(py, "handlers").unwrap(); | |
750 let orelse = ast.getattr(py, "orelse").unwrap(); | |
751 let finalbody = ast.getattr(py, "finalbody").unwrap(); | |
752 | |
753 let body = parse_list(py, body, parse_statement); | |
754 let excepthandlers = parse_list(py, excepthandlers, parse_excepthandler); | |
755 let orelse = parse_list(py, orelse, parse_statement); | |
756 let finalbody = parse_list(py, finalbody, parse_statement); | |
757 | |
758 stmt::Try(body, excepthandlers, orelse, finalbody) | |
0 | 759 } else { |
13
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
760 println!("stmt {}", ast); |
38b0d63697b1
Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
761 panic!() |
0 | 762 } |
763 } | |
764 | |
765 #[allow(dead_code)] | |
766 pub fn convert_ast(name: String, module: &PyObject) -> Module { | |
767 let gil = Python::acquire_gil(); | |
768 let py = gil.python(); | |
769 | |
770 let builtins_module = py.import("builtins").unwrap(); | |
771 let isinstance = builtins_module.get(py, "isinstance").unwrap(); | |
772 | |
773 let ast_module = py.import("ast").unwrap(); | |
774 let module_type = ast_module.get(py, "Module").unwrap(); | |
775 | |
776 assert!(isinstance.call(py, (module, module_type), None).unwrap().is_true(py).unwrap()); | |
777 | |
778 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
|
779 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
|
780 Module{name: name, statements: body} |
0 | 781 } |