annotate src/ast_convert.rs @ 19:0cb53a31ac12

Implement ast.BoolOp, and improve its display.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Fri, 03 Jun 2016 00:55:24 +0100
parents 51ef651266b1
children ace12d6b9855
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
1 use python_ast::{Module, stmt, expr, expr_context, cmpop, boolop, operator, unaryop, arguments, arg, alias, comprehension};
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
2
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
3 use cpython::{Python, PyObject};
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
4 use cpython::ObjectProtocol; //for call method
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
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
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
12 fn get_ctx(py: Python, object: PyObject) -> expr_context {
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
13 let builtins_module = py.import("builtins").unwrap();
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
14 let isinstance = builtins_module.get(py, "isinstance").unwrap();
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
15
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
16 let is_instance = |object: &PyObject, type_: &PyObject| {
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
17 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap();
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
18 };
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
19
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
20 let ast_module = py.import("ast").unwrap();
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
21 let store_type = ast_module.get(py, "Store").unwrap();
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
22 let load_type = ast_module.get(py, "Load").unwrap();
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
23
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
24 let ctx = object.getattr(py, "ctx").unwrap();
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
25 if is_instance(&ctx, &store_type) {
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
26 expr_context::Store
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
27 } else if is_instance(&ctx, &load_type) {
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
28 expr_context::Load
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
29 } else{
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
30 unreachable!();
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
31 }
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
32 }
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
33
19
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
34 fn parse_expr_vec(py: Python, list: PyObject) -> Vec<expr> {
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
35 let mut exprs = vec!();
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
36 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
37 let item = item.unwrap();
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
38 let item = parse_expr(py, item);
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
39 exprs.push(item);
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
40 }
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
41 exprs
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
42 }
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 fn parse_string_vec(py: Python, ast: PyObject) -> Vec<String> {
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
45 let builtins_module = py.import("builtins").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
46 let isinstance = builtins_module.get(py, "isinstance").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
47
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
48 let is_instance = |object: &PyObject, type_: &PyObject| {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
49 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
50 };
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
51
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
52 let ast_module = py.import("ast").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
53 let ast_type = ast_module.get(py, "AST").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
54 let arguments_type = ast_module.get(py, "arguments").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
55
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
56 assert!(is_instance(&ast, &ast_type));
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
57
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
58 if is_instance(&ast, &arguments_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
59 let args = ast.getattr(py, "args").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
60 let mut arguments = vec!();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
61 for arg in args.iter(py).unwrap() {
9
fa7e285f88e7 Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
62 let arg = arg.unwrap();
fa7e285f88e7 Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
63 let arg = parse_expr(py, arg);
fa7e285f88e7 Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
64 arguments.push(match arg {
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
65 expr::Name(arg, expr_context::Load) => arg,
9
fa7e285f88e7 Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
66 _ => panic!()
fa7e285f88e7 Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
67 });
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
68 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
69 arguments
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
70 } else {
9
fa7e285f88e7 Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
71 panic!()
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
72 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
73 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
74
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
75 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
76 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
77 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
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 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
80 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
81 };
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
82
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 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
84 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
85 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
86 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
87 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
88 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
89
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
90 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
91
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
92 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
93 unaryop::Invert
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
94 } else if is_instance(&ast, &not_type) {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
95 unaryop::Not
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
96 } 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
97 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
98 } 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
99 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
100 } else {
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
101 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
102 }
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
103 }
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
104
19
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
105 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
106 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
107 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
108
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
109 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
110 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
111 };
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
112
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
113 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
114 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
115 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
116 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
117
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
118 assert!(is_instance(&ast, &ast_type));
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
119
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
120 if is_instance(&ast, &and_type) {
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
121 boolop::And
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
122 } 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
123 boolop::Or
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
124 } else {
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
125 unreachable!()
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
126 }
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
127 }
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
128
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
129 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
130 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
131 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
132
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
133 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
134 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
135 };
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
136
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
137 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
138 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
139 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
140 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
141 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
142 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
143 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
144 let gte_type = ast_module.get(py, "GtE").unwrap();
a0fb169fe0f9 Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 14
diff changeset
145 let is_type = ast_module.get(py, "Is").unwrap();
a0fb169fe0f9 Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 14
diff changeset
146 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
147 let in_type = ast_module.get(py, "In").unwrap();
a0fb169fe0f9 Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 14
diff changeset
148 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
149
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
150 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
151
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
152 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
153 cmpop::Eq
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
154 } else if is_instance(&ast, &noteq_type) {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
155 cmpop::NotEq
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, &lt_type) {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
157 cmpop::Lt
15
a0fb169fe0f9 Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 14
diff changeset
158 } else if is_instance(&ast, &lte_type) {
a0fb169fe0f9 Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 14
diff changeset
159 cmpop::LtE
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
160 } else if is_instance(&ast, &gt_type) {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
161 cmpop::Gt
15
a0fb169fe0f9 Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 14
diff changeset
162 } else if is_instance(&ast, &gte_type) {
a0fb169fe0f9 Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 14
diff changeset
163 cmpop::GtE
a0fb169fe0f9 Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 14
diff changeset
164 } else if is_instance(&ast, &is_type) {
a0fb169fe0f9 Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 14
diff changeset
165 cmpop::Is
a0fb169fe0f9 Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 14
diff changeset
166 } else if is_instance(&ast, &is_not_type) {
a0fb169fe0f9 Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 14
diff changeset
167 cmpop::IsNot
a0fb169fe0f9 Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 14
diff changeset
168 } else if is_instance(&ast, &in_type) {
a0fb169fe0f9 Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 14
diff changeset
169 cmpop::In
a0fb169fe0f9 Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 14
diff changeset
170 } else if is_instance(&ast, &not_in_type) {
a0fb169fe0f9 Add forgotten cmpop values.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 14
diff changeset
171 cmpop::NotIn
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
172 } else {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
173 unreachable!()
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
174 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
175 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
176
14
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
177 fn parse_comprehension(py: Python, ast: PyObject) -> comprehension {
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
178 let target = ast.getattr(py, "target").unwrap();
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
179 let iter = ast.getattr(py, "iter").unwrap();
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
180 let ifs = ast.getattr(py, "ifs").unwrap();
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
181 let ifs = ifs.iter(py).unwrap();
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
182
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
183 let target = parse_expr(py, target);
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
184 let iter = parse_expr(py, iter);
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
185
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
186 let mut new_ifs = vec!();
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
187 for if_ in ifs {
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
188 let if_ = parse_expr(py, if_.unwrap());
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
189 new_ifs.push(if_);
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
190 }
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
191 comprehension {target: target, iter: iter, ifs: new_ifs}
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
192
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
193 }
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
194
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
195 fn parse_operator(py: Python, ast: PyObject) -> operator {
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
196 let builtins_module = py.import("builtins").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
197 let isinstance = builtins_module.get(py, "isinstance").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
198
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
199 let is_instance = |object: &PyObject, type_: &PyObject| {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
200 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
201 };
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
202
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
203 let ast_module = py.import("ast").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
204 let ast_type = ast_module.get(py, "AST").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
205 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
206 let sub_type = ast_module.get(py, "Sub").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
207 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
208 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
209 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
210 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
211 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
212 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
213 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
214 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
215 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
216 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
217 let floordiv_type = ast_module.get(py, "FloorDiv").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
218
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
219 assert!(is_instance(&ast, &ast_type));
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
220
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
221 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
222 operator::Add
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
223 } 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
224 operator::Sub
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
225 } 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
226 operator::Mult
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
227 } 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
228 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
229 } 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
230 operator::Div
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
231 } 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
232 operator::Mod
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
233 } 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
234 operator::Pow
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
235 } 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
236 operator::LShift
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
237 } 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
238 operator::RShift
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
239 } 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
240 operator::BitOr
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
241 } 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
242 operator::BitXor
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
243 } 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
244 operator::BitAnd
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
245 } 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
246 operator::FloorDiv
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
247 } else {
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
248 println!("operator {}", ast);
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
249 panic!()
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
250 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
251 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
252
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
253 fn parse_expr(py: Python, ast: PyObject) -> expr {
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
254 let builtins_module = py.import("builtins").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
255 let isinstance = builtins_module.get(py, "isinstance").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
256
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
257 let is_instance = |object: &PyObject, type_: &PyObject| {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
258 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
259 };
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
260
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
261 let ast_module = py.import("ast").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
262 let ast_type = ast_module.get(py, "AST").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
263 let arg_type = ast_module.get(py, "arg").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
264 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
265 let bool_op_type = ast_module.get(py, "BoolOp").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
266 let bin_op_type = ast_module.get(py, "BinOp").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
267 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
268 let attribute_type = ast_module.get(py, "Attribute").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
269 let name_type = ast_module.get(py, "Name").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
270 let num_type = ast_module.get(py, "Num").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
271 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
272 let list_type = ast_module.get(py, "List").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
273 let compare_type = ast_module.get(py, "Compare").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
274 let call_type = ast_module.get(py, "Call").unwrap();
14
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
275 let listcomp_type = ast_module.get(py, "ListComp").unwrap();
16
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
276 let dictcomp_type = ast_module.get(py, "DictComp").unwrap();
17
f1c77634a2eb Add ast.Tuple
Bastien Orivel <eijebong@bananium.fr>
parents: 16
diff changeset
277 let tuple_type = ast_module.get(py, "Tuple").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
278
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
279 assert!(is_instance(&ast, &ast_type));
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
280
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
281 if is_instance(&ast, &arg_type) {
1
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
282 let arg = ast.getattr(py, "arg").unwrap();
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
283 let arg = get_str(py, arg);
18
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
284 expr::Name(arg, get_ctx(py, ast))
4
f27a4aee9dfa Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3
diff changeset
285 } else if is_instance(&ast, &attribute_type) {
f27a4aee9dfa Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3
diff changeset
286 let value = ast.getattr(py, "value").unwrap();
f27a4aee9dfa Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3
diff changeset
287 let attr = ast.getattr(py, "attr").unwrap();
f27a4aee9dfa Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3
diff changeset
288
f27a4aee9dfa Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3
diff changeset
289 let value = parse_expr(py, value);
f27a4aee9dfa Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3
diff changeset
290 let attr = get_str(py, attr);
f27a4aee9dfa Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3
diff changeset
291
18
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
292 expr::Attribute(Box::new(value), attr, get_ctx(py, ast))
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
293 } 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
294 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
295 let id = get_str(py, id);
18
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
296 expr::Name(id, get_ctx(py, ast))
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
297 } 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
298 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
299 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
300 expr::NameConstant(value)
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
301 } 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
302 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
303 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
304 expr::Num(n)
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
305 } 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
306 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
307 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
308 expr::Str(s)
7
680d15073f55 Add ast.List literal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 6
diff changeset
309 } else if is_instance(&ast, &list_type) {
680d15073f55 Add ast.List literal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 6
diff changeset
310 let elts = ast.getattr(py, "elts").unwrap();
680d15073f55 Add ast.List literal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 6
diff changeset
311
680d15073f55 Add ast.List literal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 6
diff changeset
312 let mut elements = vec!();
680d15073f55 Add ast.List literal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 6
diff changeset
313 for elt in elts.iter(py).unwrap() {
680d15073f55 Add ast.List literal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 6
diff changeset
314 let elt = elt.unwrap();
680d15073f55 Add ast.List literal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 6
diff changeset
315 elements.push(parse_expr(py, elt));
680d15073f55 Add ast.List literal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 6
diff changeset
316 }
680d15073f55 Add ast.List literal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 6
diff changeset
317
18
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
318 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
319 } 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
320 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
321 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
322
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
323 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
324 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
325
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
326 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
327 } 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
328 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
329 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
330
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
331 let op = parse_boolop(py, op);
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
332 let values = parse_expr_vec(py, values);
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
333
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
334 expr::BoolOp(op, values)
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
335 } else if is_instance(&ast, &bin_op_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
336 let left = ast.getattr(py, "left").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
337 let op = ast.getattr(py, "op").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
338 let right = ast.getattr(py, "right").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
339
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
340 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
341 let op = parse_operator(py, op);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
342 let right = parse_expr(py, right);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
343
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
344 expr::BinOp(Box::new(left), op, Box::new(right))
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
345 } else if is_instance(&ast, &call_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
346 let func = ast.getattr(py, "func").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
347 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
348 let keywords = ast.getattr(py, "keywords").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
349
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
350 let func = parse_expr(py, func);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
351
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
352 let mut arguments = vec!();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
353 for arg in args.iter(py).unwrap() {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
354 let arg = arg.unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
355 arguments.push(parse_expr(py, arg));
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
356 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
357
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
358 /*
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
359 let mut kwargs = vec!();
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
360 for arg in keywords.iter(py).unwrap() {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
361 let arg = arg.unwrap();
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
362 kwargs.push(parse_expr(py, arg));
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
363 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
364 */
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
365
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
366 expr::Call(Box::new(func), arguments, vec!())
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
367 } else if is_instance(&ast, &compare_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
368 let left = ast.getattr(py, "left").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
369 let ops = ast.getattr(py, "ops").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
370 let comparators = ast.getattr(py, "comparators").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
371
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
372 let left = parse_expr(py, left);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
373 let ops = ops.iter(py).unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
374 let comparators = comparators.iter(py).unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
375
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
376 let mut new_ops = vec!();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
377 for op in ops {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
378 let op = op.unwrap();
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
379 let op = parse_cmpop(py, op);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
380 new_ops.push(op);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
381 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
382
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
383 let mut new_comparators = vec!();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
384 for comparator in comparators {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
385 let comparator = comparator.unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
386 let comparator = parse_expr(py, comparator);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
387 new_comparators.push(comparator);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
388 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
389
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
390 expr::Compare(Box::new(left), new_ops, new_comparators)
14
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
391 } else if is_instance(&ast, &listcomp_type) {
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
392 let elt = ast.getattr(py, "elt").unwrap();
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
393 let generators = ast.getattr(py, "generators").unwrap();
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
394 let generators = generators.iter(py).unwrap();
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
395
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
396 let elt = parse_expr(py, elt);
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
397
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
398 let mut new_gens = vec!();
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
399 for gen in generators {
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
400 let gen = gen.unwrap();
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
401 let gen = parse_comprehension(py, gen);
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
402 new_gens.push(gen);
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
403 }
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
404 expr::ListComp(Box::new(elt), new_gens)
16
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
405 } else if is_instance(&ast, &dictcomp_type) {
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
406 let key = ast.getattr(py, "key").unwrap();
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
407 let value = ast.getattr(py, "value").unwrap();
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
408 let generators = ast.getattr(py, "generators").unwrap();
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
409 let generators = generators.iter(py).unwrap();
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
410
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
411 let key = parse_expr(py, key);
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
412 let value = parse_expr(py, value);
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
413
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
414 let mut new_gens = vec!();
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
415 for gen in generators {
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
416 let gen = gen.unwrap();
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
417 let gen = parse_comprehension(py, gen);
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
418 new_gens.push(gen);
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
419 }
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
420 expr::DictComp(Box::new(key), Box::new(value), new_gens)
17
f1c77634a2eb Add ast.Tuple
Bastien Orivel <eijebong@bananium.fr>
parents: 16
diff changeset
421 } else if is_instance(&ast, &tuple_type) {
f1c77634a2eb Add ast.Tuple
Bastien Orivel <eijebong@bananium.fr>
parents: 16
diff changeset
422 let elts = ast.getattr(py, "elts").unwrap();
f1c77634a2eb Add ast.Tuple
Bastien Orivel <eijebong@bananium.fr>
parents: 16
diff changeset
423 let elts = elts.iter(py).unwrap();
f1c77634a2eb Add ast.Tuple
Bastien Orivel <eijebong@bananium.fr>
parents: 16
diff changeset
424
f1c77634a2eb Add ast.Tuple
Bastien Orivel <eijebong@bananium.fr>
parents: 16
diff changeset
425 let mut new_elts = vec!();
f1c77634a2eb Add ast.Tuple
Bastien Orivel <eijebong@bananium.fr>
parents: 16
diff changeset
426 for elt in elts {
f1c77634a2eb Add ast.Tuple
Bastien Orivel <eijebong@bananium.fr>
parents: 16
diff changeset
427 let elt = elt.unwrap();
f1c77634a2eb Add ast.Tuple
Bastien Orivel <eijebong@bananium.fr>
parents: 16
diff changeset
428 let elt = parse_expr(py, elt);
f1c77634a2eb Add ast.Tuple
Bastien Orivel <eijebong@bananium.fr>
parents: 16
diff changeset
429 new_elts.push(elt);
f1c77634a2eb Add ast.Tuple
Bastien Orivel <eijebong@bananium.fr>
parents: 16
diff changeset
430 }
18
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
431 expr::Tuple(new_elts, get_ctx(py, ast))
16
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
432 } else {
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
433 println!("expr {}", ast);
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
434 unreachable!()
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
435 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
436 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
437
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
438 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
439 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
440 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
441
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
442 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
443 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
444 };
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
445
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
446 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
447 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
448 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
449 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
450
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
451 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
452
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
453 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
454 let args = arguments{
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
455 //args: Vec<arg>,
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
456 args: {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
457 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
458 let mut arguments = vec!();
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
459 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
460 let arg = arg.unwrap();
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
461 assert!(is_instance(&arg, &arg_type));
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
462 let arg = get_str(py, arg);
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
463 arguments.push(arg{arg: arg, annotation: None});
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
464 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
465 arguments
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 //vararg: Option<arg>,
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
468 vararg: None,
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
469 //kwonlyargs: Vec<arg>,
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
470 kwonlyargs: vec!(),
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
471 //kw_defaults: Vec<expr>,
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
472 kw_defaults: vec!(),
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
473 //kwarg: Option<arg>,
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
474 kwarg: None,
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
475 //defaults: Vec<expr>
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
476 defaults: vec!()
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
477 };
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
478 args
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
479 } else {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
480 println!("arguments {}", ast);
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
481 panic!()
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 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
484
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
485 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
486 //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
487 //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
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
488
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
489 let builtins_module = py.import("builtins").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
490 let isinstance = builtins_module.get(py, "isinstance").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
491
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
492 let is_instance = |object: &PyObject, type_: &PyObject| {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
493 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
494 };
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
495
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
496 let ast_module = py.import("ast").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
497 let ast_type = ast_module.get(py, "AST").unwrap();
2
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
498 let class_def_type = ast_module.get(py, "ClassDef").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
499 let function_def_type = ast_module.get(py, "FunctionDef").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
500 let global_type = ast_module.get(py, "Global").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
501 let assign_type = ast_module.get(py, "Assign").unwrap();
8
94ff501bf336 Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7
diff changeset
502 let aug_assign_type = ast_module.get(py, "AugAssign").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
503 let return_type = ast_module.get(py, "Return").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
504 let import_from_type = ast_module.get(py, "ImportFrom").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
505 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
506 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
507 let for_type = ast_module.get(py, "For").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
508 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
509 let break_type = ast_module.get(py, "Break").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
510
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
511 assert!(is_instance(&ast, &ast_type));
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
512
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
513 /*
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
514 // TODO: implement Hash for PyObject. (trivial)
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
515 let map = {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
516 let fields = ast.getattr(py, "_fields").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
517 let mut map = HashMap::new();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
518 for field in fields.iter(py).unwrap() {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
519 let field = field.unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
520 let value = ast.getattr(py, field).unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
521 map.insert(field, value);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
522 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
523 map
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
524 };
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
525 */
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
526
2
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
527 if is_instance(&ast, &class_def_type) {
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
528 let name = ast.getattr(py, "name").unwrap();
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
529 let bases = ast.getattr(py, "bases").unwrap();
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
530 //let keywords = ast.getattr(py, "keywords").unwrap();
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
531 let body = ast.getattr(py, "body").unwrap();
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
532 //let decorator_list = ast.getattr(py, "decorator_list").unwrap();
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
533
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
534 let name = get_str(py, name);
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
535
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
536 let mut nodes = vec!();
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
537 for name_node in bases.iter(py).unwrap() {
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
538 let name_node = name_node.unwrap();
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
539 let name_node = parse_expr(py, name_node);
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
540 nodes.push(name_node);
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
541 }
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
542
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
543 let mut statements = vec!();
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
544 for statement in body.iter(py).unwrap() {
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
545 let statement = statement.unwrap();
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
546 let statement = parse_statement(py, statement);
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
547 statements.push(statement);
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
548 }
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
549
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
550 stmt::ClassDef(name, nodes, vec!(), statements, vec!())
2
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
551 } else if is_instance(&ast, &function_def_type) {
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
552 let name = ast.getattr(py, "name").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
553 let args = ast.getattr(py, "args").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
554 let body = ast.getattr(py, "body").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
555
1
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
556 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
557 let args = parse_arguments(py, args);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
558
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
559 let mut statements = vec!();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
560 for statement in body.iter(py).unwrap() {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
561 let statement = parse_statement(py, statement.unwrap());
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
562 statements.push(statement);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
563 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
564
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
565 let decorators = vec!();
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
566 let returns = None;
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
567
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
568 stmt::FunctionDef(name, args, statements, decorators, returns)
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
569 } else if is_instance(&ast, &global_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
570 let names = ast.getattr(py, "names").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
571
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
572 let mut globals = vec!();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
573 for name in names.iter(py).unwrap() {
1
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
574 let name = name.unwrap();
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
575 let name = get_str(py, name);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
576 globals.push(name);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
577 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
578
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
579 stmt::Global(globals)
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
580 } else if is_instance(&ast, &if_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
581 let test = ast.getattr(py, "test").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
582 let body = ast.getattr(py, "body").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
583 let orelse = ast.getattr(py, "orelse").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
584
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
585 let test = parse_expr(py, test);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
586
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
587 let mut statements = vec!();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
588 for statement in body.iter(py).unwrap() {
1
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
589 let statement = statement.unwrap();
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
590 let statement = parse_statement(py, statement);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
591 statements.push(statement);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
592 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
593
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
594 let mut orelse_ = vec!();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
595 for statement in orelse.iter(py).unwrap() {
1
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
596 let statement = statement.unwrap();
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
597 let statement = parse_statement(py, statement);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
598 orelse_.push(statement);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
599 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
600
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
601 stmt::If(test, statements, orelse_)
6
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
602 } else if is_instance(&ast, &while_type) {
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
603 let test = ast.getattr(py, "test").unwrap();
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
604 let body = ast.getattr(py, "body").unwrap();
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
605 let orelse = ast.getattr(py, "orelse").unwrap();
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
606
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
607 let test = parse_expr(py, test);
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
608
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
609 let mut statements = vec!();
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
610 for statement in body.iter(py).unwrap() {
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
611 let statement = statement.unwrap();
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
612 let statement = parse_statement(py, statement);
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
613 statements.push(statement);
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
614 }
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
615
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
616 let mut orelse_ = vec!();
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
617 for statement in orelse.iter(py).unwrap() {
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
618 let statement = statement.unwrap();
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
619 let statement = parse_statement(py, statement);
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
620 orelse_.push(statement);
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
621 }
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
622
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
623 stmt::While(test, statements, orelse_)
5
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
624 } else if is_instance(&ast, &for_type) {
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
625 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
626 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
627 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
628 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
629
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
630 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
631 let iter = parse_expr(py, iter);
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
632
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
633 let mut statements = vec!();
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
634 for statement in body.iter(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
635 let statement = statement.unwrap();
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
636 let statement = parse_statement(py, statement);
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
637 statements.push(statement);
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
638 }
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
639
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
640 let mut orelse_ = vec!();
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
641 for statement in orelse.iter(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
642 let statement = statement.unwrap();
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
643 let statement = parse_statement(py, statement);
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
644 orelse_.push(statement);
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
645 }
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
646
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
647 stmt::For(target, iter, statements, orelse_)
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
648 } else if is_instance(&ast, &assign_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
649 let targets = ast.getattr(py, "targets").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
650 let value = ast.getattr(py, "value").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
651
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
652 let mut arguments = vec!();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
653 for target in targets.iter(py).unwrap() {
1
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
654 let target = target.unwrap();
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
655 let target = parse_expr(py, target);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
656 arguments.push(target);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
657 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
658
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
659 let value = parse_expr(py, value);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
660
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
661 stmt::Assign(arguments, value)
8
94ff501bf336 Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7
diff changeset
662 } else if is_instance(&ast, &aug_assign_type) {
94ff501bf336 Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7
diff changeset
663 let target = ast.getattr(py, "target").unwrap();
94ff501bf336 Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7
diff changeset
664 let op = ast.getattr(py, "op").unwrap();
94ff501bf336 Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7
diff changeset
665 let value = ast.getattr(py, "value").unwrap();
94ff501bf336 Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7
diff changeset
666
94ff501bf336 Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7
diff changeset
667 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
668 let op = parse_operator(py, op);
8
94ff501bf336 Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7
diff changeset
669 let value = parse_expr(py, value);
94ff501bf336 Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7
diff changeset
670
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
671 stmt::AugAssign(target, op, value)
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
672 } else if is_instance(&ast, &import_from_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
673 let module = ast.getattr(py, "module").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
674 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
675 let level = ast.getattr(py, "level").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
676
1
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
677 let module = get_str(py, module);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
678
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
679 let mut names_ = vec!();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
680 for alias in names.iter(py).unwrap() {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
681 let alias = alias.unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
682 let alias = parse_expr(py, alias);
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
683 println!("{:?}", alias);
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
684 // XXX
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
685 //names_.push(alias{name: alias, asname: alias});
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
686 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
687
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
688 stmt::ImportFrom(module, names_, None)
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
689 } else if is_instance(&ast, &return_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
690 let value = ast.getattr(py, "value").unwrap();
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
691 if value == py.None() {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
692 stmt::Return(None)
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
693 } else {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
694 let value = parse_expr(py, value);
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
695 stmt::Return(Some(value))
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
696 }
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
697 } else if is_instance(&ast, &expr_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
698 let value = ast.getattr(py, "value").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
699 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
700 stmt::Expr(value)
6
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
701 } 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
702 stmt::Break
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
703 } else {
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
704 println!("stmt {}", ast);
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
705 panic!()
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
706 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
707 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
708
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
709 #[allow(dead_code)]
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
710 pub fn convert_ast(name: String, module: &PyObject) -> Module {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
711 let gil = Python::acquire_gil();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
712 let py = gil.python();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
713
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
714 let builtins_module = py.import("builtins").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
715 let isinstance = builtins_module.get(py, "isinstance").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
716
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
717 let ast_module = py.import("ast").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
718 let module_type = ast_module.get(py, "Module").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
719
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
720 assert!(isinstance.call(py, (module, module_type), None).unwrap().is_true(py).unwrap());
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
721
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
722 let body = module.getattr(py, "body").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
723 let mut statements = vec!();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
724 for statement in body.iter(py).unwrap() {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
725 let statement = parse_statement(py, statement.unwrap());
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
726 statements.push(statement)
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
727 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
728 Module{name: name, statements: statements}
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
729 }