annotate src/ast_convert.rs @ 87:624393ed3b0b

Don’t cast anything to str, except Num for now.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Wed, 22 Jun 2016 23:05:24 +0100
parents a7b1db623f41
children 5923cd4bfc36
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
86
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 83
diff changeset
1 use python_ast::{Module, stmt, expr, expr_context, cmpop, boolop, operator, unaryop, arguments, arg, alias, comprehension, keyword, withitem, excepthandler, slice, name_constant};
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
2
86
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 83
diff changeset
3 use cpython::{Python, PyObject, PyBool, PyResult};
0
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 {
87
624393ed3b0b Don’t cast anything to str, except Num for now.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 86
diff changeset
7 object.extract(py).unwrap()
624393ed3b0b Don’t cast anything to str, except Num for now.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 86
diff changeset
8 }
624393ed3b0b Don’t cast anything to str, except Num for now.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 86
diff changeset
9
624393ed3b0b Don’t cast anything to str, except Num for now.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 86
diff changeset
10 fn convert_to_str(py: Python, object: PyObject) -> String {
1
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
11 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
12 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
13 string.to_mut().to_string()
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
14 }
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
15
18
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
16 fn get_ctx(py: Python, object: PyObject) -> expr_context {
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
17 let builtins_module = py.import("builtins").unwrap();
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
18 let isinstance = builtins_module.get(py, "isinstance").unwrap();
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 is_instance = |object: &PyObject, type_: &PyObject| {
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
21 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
22 };
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 ast_module = py.import("ast").unwrap();
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
25 let store_type = ast_module.get(py, "Store").unwrap();
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
26 let load_type = ast_module.get(py, "Load").unwrap();
21
7af637f444d1 Add ast.Delete
Bastien Orivel <eijebong@bananium.fr>
parents: 20
diff changeset
27 let del_type = ast_module.get(py, "Del").unwrap();
18
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
28
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
29 let ctx = object.getattr(py, "ctx").unwrap();
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
30 if is_instance(&ctx, &store_type) {
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
31 expr_context::Store
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
32 } else if is_instance(&ctx, &load_type) {
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
33 expr_context::Load
21
7af637f444d1 Add ast.Delete
Bastien Orivel <eijebong@bananium.fr>
parents: 20
diff changeset
34 } else if is_instance(&ctx, &del_type) {
7af637f444d1 Add ast.Delete
Bastien Orivel <eijebong@bananium.fr>
parents: 20
diff changeset
35 expr_context::Del
18
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
36 } else{
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
37 unreachable!();
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
38 }
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
39 }
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
40
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
41 fn parse_list<T, F: Fn(Python, PyObject) -> T>(py: Python, list: PyObject, parse: F) -> Vec<T> {
19
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
42 let mut exprs = vec!();
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
43 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
44 let item = item.unwrap();
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
45 let item = parse(py, item);
19
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
46 exprs.push(item);
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
47 }
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
48 exprs
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
49 }
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
50
44
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
51 fn parse_alias(py: Python, ast: PyObject) -> alias {
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
52 let ast_alias = get_str(py, ast.getattr(py, "name").unwrap());
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
53 let asname = ast.getattr(py, "asname").unwrap();
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
54 if asname == py.None() {
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
55 alias{name: ast_alias, asname: None}
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
56 } else {
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
57 alias{name: ast_alias, asname: Some(get_str(py, asname))}
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
58 }
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
59 }
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
60
59
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
61 fn parse_withitem(py: Python, ast: PyObject) -> withitem {
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
62 let context_expr = ast.getattr(py, "context_expr").unwrap();
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
63 let optional_vars = ast.getattr(py, "optional_vars").unwrap();
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
64
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
65 let context_expr = parse_expr(py, context_expr);
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
66
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
67 if optional_vars == py.None() {
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
68 withitem{context_expr: context_expr, optional_vars: None}
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
69 } else {
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
70 let optional_vars = parse_expr(py, optional_vars);
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
71 withitem{context_expr: context_expr, optional_vars: Some(optional_vars)}
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
72 }
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
73 }
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
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 {
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
178 let target = ast.getattr(py, "target").unwrap();
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
179 let iter = ast.getattr(py, "iter").unwrap();
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
180 let ifs = ast.getattr(py, "ifs").unwrap();
14
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
181
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
182 let target = parse_expr(py, target);
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
183 let iter = parse_expr(py, iter);
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
184 let ifs = parse_list(py, ifs, parse_expr);
14
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
185
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
186 comprehension {target: target, iter: iter, ifs: ifs}
14
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
187 }
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
188
53
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
189 fn parse_keyword(py: Python, ast: PyObject) -> keyword {
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
190 let arg = ast.getattr(py, "arg").unwrap();
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
191 let value = ast.getattr(py, "value").unwrap();
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
192
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
193 let arg = if arg == py.None() {
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
194 None
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
195 } else {
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
196 let arg = get_str(py, arg);
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
197 Some(arg)
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
198 };
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
199 let value = parse_expr(py, value);
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
200
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
201 keyword {arg: arg, value: value}
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
202 }
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
203
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
204 fn parse_operator(py: Python, ast: PyObject) -> operator {
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
205 let builtins_module = py.import("builtins").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
206 let isinstance = builtins_module.get(py, "isinstance").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
207
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
208 let is_instance = |object: &PyObject, type_: &PyObject| {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
209 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
210 };
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
211
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
212 let ast_module = py.import("ast").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
213 let ast_type = ast_module.get(py, "AST").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
214 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
215 let sub_type = ast_module.get(py, "Sub").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
216 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
217 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
218 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
219 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
220 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
221 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
222 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
223 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
224 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
225 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
226 let floordiv_type = ast_module.get(py, "FloorDiv").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
227
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
228 assert!(is_instance(&ast, &ast_type));
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
229
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
230 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
231 operator::Add
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
232 } else if is_instance(&ast, &sub_type) {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
233 operator::Sub
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
234 } 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
235 operator::Mult
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
236 } else if is_instance(&ast, &matmult_type) {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
237 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
238 } 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
239 operator::Div
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
240 } else if is_instance(&ast, &mod_type) {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
241 operator::Mod
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
242 } else if is_instance(&ast, &pow_type) {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
243 operator::Pow
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
244 } else if is_instance(&ast, &lshift_type) {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
245 operator::LShift
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
246 } else if is_instance(&ast, &rshift_type) {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
247 operator::RShift
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
248 } else if is_instance(&ast, &bitor_type) {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
249 operator::BitOr
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
250 } else if is_instance(&ast, &bitxor_type) {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
251 operator::BitXor
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
252 } 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
253 operator::BitAnd
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
254 } 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
255 operator::FloorDiv
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
256 } else {
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
257 println!("operator {}", ast);
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
258 panic!()
0
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
68
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
262 fn parse_excepthandler(py: Python, ast: PyObject) -> excepthandler {
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
263 let type_ = ast.getattr(py, "type").unwrap();
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
264 let name = ast.getattr(py, "name").unwrap();
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
265 let body = ast.getattr(py, "body").unwrap();
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
266
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
267 let type_ = parse_optional_expr(py, type_);
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
268 let name = if name == py.None() { None } else { Some(get_str(py, name)) };
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
269 let body = parse_list(py, body, parse_statement);
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
270
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
271 excepthandler{type_: type_, name: name, body: body}
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
272 }
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
273
82
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
274 fn parse_slice(py: Python, ast: PyObject) -> slice {
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
275 let builtins_module = py.import("builtins").unwrap();
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
276 let isinstance = builtins_module.get(py, "isinstance").unwrap();
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
277
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
278 let is_instance = |object: &PyObject, type_: &PyObject| {
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
279 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap();
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
280 };
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
281
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
282 let ast_module = py.import("ast").unwrap();
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
283 let ast_type = ast_module.get(py, "AST").unwrap();
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
284 let index_type = ast_module.get(py, "Index").unwrap();
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
285 let slice_type = ast_module.get(py, "Slice").unwrap();
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
286 let ext_slice_type = ast_module.get(py, "ExtSlice").unwrap();
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
287
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
288 assert!(is_instance(&ast, &ast_type));
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
289
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
290 if is_instance(&ast, &index_type) {
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
291 let value = ast.getattr(py, "value").unwrap();
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
292 let value = parse_expr(py, value);
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
293
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
294 slice::Index(value)
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
295 } else if is_instance(&ast, &slice_type) {
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
296 let lower = ast.getattr(py, "lower").unwrap();
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
297 let upper = ast.getattr(py, "upper").unwrap();
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
298 let step = ast.getattr(py, "step").unwrap();
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
299
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
300 let lower = parse_optional_expr(py, lower);
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
301 let upper = parse_optional_expr(py, upper);
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
302 let step = parse_optional_expr(py, step);
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
303 slice::Slice(lower, upper, step)
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
304 } else if is_instance(&ast, &ext_slice_type) {
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
305 let dims = ast.getattr(py, "dims").unwrap();
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
306 let dims = parse_list(py, dims, parse_slice);
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
307
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
308 slice::ExtSlice(dims)
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
309 } else {
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
310 unreachable!()
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
311 }
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
312 }
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
313
61
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
314 fn parse_optional_expr(py: Python, ast: PyObject) -> Option<expr> {
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
315 if ast == py.None() {
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
316 None
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
317 } else {
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
318 let ast = parse_expr(py, ast);
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
319 Some(ast)
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
320 }
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
321 }
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
322
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
323 fn parse_expr(py: Python, ast: PyObject) -> expr {
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
324 let builtins_module = py.import("builtins").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
325 let isinstance = builtins_module.get(py, "isinstance").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
326
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
327 let is_instance = |object: &PyObject, type_: &PyObject| {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
328 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
329 };
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
330
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
331 let ast_module = py.import("ast").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
332 let ast_type = ast_module.get(py, "AST").unwrap();
5
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
333 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
334 let bool_op_type = ast_module.get(py, "BoolOp").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
335 let bin_op_type = ast_module.get(py, "BinOp").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
336 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
337 let attribute_type = ast_module.get(py, "Attribute").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
338 let name_type = ast_module.get(py, "Name").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
339 let num_type = ast_module.get(py, "Num").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
340 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
341 let list_type = ast_module.get(py, "List").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
342 let compare_type = ast_module.get(py, "Compare").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
343 let call_type = ast_module.get(py, "Call").unwrap();
14
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
344 let listcomp_type = ast_module.get(py, "ListComp").unwrap();
16
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
345 let dictcomp_type = ast_module.get(py, "DictComp").unwrap();
17
f1c77634a2eb Add ast.Tuple
Bastien Orivel <eijebong@bananium.fr>
parents: 16
diff changeset
346 let tuple_type = ast_module.get(py, "Tuple").unwrap();
52
d9838e8b3ec5 Add ast.Ellipsis.
Bastien Orivel <eijebong@bananium.fr>
parents: 51
diff changeset
347 let ellipsis_type = ast_module.get(py, "Ellipsis").unwrap();
73
2a6629ea82b5 Add ast.Await.
Bastien Orivel <eijebong@bananium.fr>
parents: 72
diff changeset
348 let await_type = ast_module.get(py, "Await").unwrap();
74
97537c90d92d Add ast.Yield.
Bastien Orivel <eijebong@bananium.fr>
parents: 73
diff changeset
349 let yield_type = ast_module.get(py, "Yield").unwrap();
75
1abc8ca9f30b Add ast.YieldFrom.
Bastien Orivel <eijebong@bananium.fr>
parents: 74
diff changeset
350 let yield_from_type = ast_module.get(py, "YieldFrom").unwrap();
76
efd42fc280e8 Add ast.Set.
Bastien Orivel <eijebong@bananium.fr>
parents: 75
diff changeset
351 let set_type = ast_module.get(py, "Set").unwrap();
77
7d1406181aae Add ast.SetComp.
Bastien Orivel <eijebong@bananium.fr>
parents: 76
diff changeset
352 let setcomp_type = ast_module.get(py, "SetComp").unwrap();
78
f1a845e4121b Add ast.GeneratorExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 77
diff changeset
353 let generatorexp_type = ast_module.get(py, "GeneratorExp").unwrap();
79
6bf54bff8dbd Add ast.Lambda.
Bastien Orivel <eijebong@bananium.fr>
parents: 78
diff changeset
354 let lambda_type = ast_module.get(py, "Lambda").unwrap();
80
c6d3f0dabbba Add ast.IfExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 79
diff changeset
355 let ifexp_type = ast_module.get(py, "IfExp").unwrap();
81
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
356 let dict_type = ast_module.get(py, "Dict").unwrap();
82
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
357 let subscript_type = ast_module.get(py, "Subscript").unwrap();
83
e59cd5754268 Add ast.Starred.
Bastien Orivel <eijebong@bananium.fr>
parents: 82
diff changeset
358 let starred_type = ast_module.get(py, "Starred").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
359
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
360 assert!(is_instance(&ast, &ast_type));
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
361
56
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
362 if is_instance(&ast, &attribute_type) {
4
f27a4aee9dfa Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3
diff changeset
363 let value = ast.getattr(py, "value").unwrap();
f27a4aee9dfa Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3
diff changeset
364 let attr = ast.getattr(py, "attr").unwrap();
f27a4aee9dfa Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3
diff changeset
365
f27a4aee9dfa Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3
diff changeset
366 let value = parse_expr(py, value);
f27a4aee9dfa Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3
diff changeset
367 let attr = get_str(py, attr);
f27a4aee9dfa Add ast.Attribute.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3
diff changeset
368
18
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
369 expr::Attribute(Box::new(value), attr, get_ctx(py, ast))
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
370 } 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
371 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
372 let id = get_str(py, id);
18
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
373 expr::Name(id, get_ctx(py, ast))
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
374 } 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
375 let value = ast.getattr(py, "value").unwrap();
86
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 83
diff changeset
376 let boolean: PyResult<PyBool> = value.extract(py);
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 83
diff changeset
377 let constant = match boolean {
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 83
diff changeset
378 Ok(boolean) => if boolean.is_true() {
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 83
diff changeset
379 name_constant::True
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 83
diff changeset
380 } else {
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 83
diff changeset
381 name_constant::False
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 83
diff changeset
382 },
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 83
diff changeset
383 Err(_) => {
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 83
diff changeset
384 assert!(value == py.None());
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 83
diff changeset
385 name_constant::None_
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 83
diff changeset
386 }
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 83
diff changeset
387 };
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 83
diff changeset
388 expr::NameConstant(constant)
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
389 } 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
390 let n = ast.getattr(py, "n").unwrap();
87
624393ed3b0b Don’t cast anything to str, except Num for now.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 86
diff changeset
391 // FIXME: we should convert these to either bigint, double or complex.
624393ed3b0b Don’t cast anything to str, except Num for now.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 86
diff changeset
392 // TODO: find a suitable bigint library.
624393ed3b0b Don’t cast anything to str, except Num for now.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 86
diff changeset
393 let n = convert_to_str(py, n);
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
394 expr::Num(n)
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
395 } 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
396 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
397 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
398 expr::Str(s)
7
680d15073f55 Add ast.List literal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 6
diff changeset
399 } else if is_instance(&ast, &list_type) {
680d15073f55 Add ast.List literal.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 6
diff changeset
400 let elts = ast.getattr(py, "elts").unwrap();
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
401 let elements = parse_list(py, elts, parse_expr);
18
51ef651266b1 Fix expr_contexts.
Bastien Orivel <eijebong@bananium.fr>
parents: 17
diff changeset
402 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
403 } 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
404 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
405 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
406
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
407 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
408 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
409
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
410 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
411 } 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
412 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
413 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
414
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
415 let op = parse_boolop(py, op);
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
416 let values = parse_list(py, values, parse_expr);
19
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
417
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 18
diff changeset
418 expr::BoolOp(op, values)
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
419 } else if is_instance(&ast, &bin_op_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
420 let left = ast.getattr(py, "left").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
421 let op = ast.getattr(py, "op").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
422 let right = ast.getattr(py, "right").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
423
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
424 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
425 let op = parse_operator(py, op);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
426 let right = parse_expr(py, right);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
427
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
428 expr::BinOp(Box::new(left), op, Box::new(right))
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
429 } else if is_instance(&ast, &call_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
430 let func = ast.getattr(py, "func").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
431 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
432 let keywords = ast.getattr(py, "keywords").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
433
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
434 let func = parse_expr(py, func);
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
435 let args = parse_list(py, args, parse_expr);
53
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
436 let keywords = parse_list(py, keywords, parse_keyword);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
437
53
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
438 expr::Call(Box::new(func), args, keywords)
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
439 } else if is_instance(&ast, &compare_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
440 let left = ast.getattr(py, "left").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
441 let ops = ast.getattr(py, "ops").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
442 let comparators = ast.getattr(py, "comparators").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
443
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
444 let left = parse_expr(py, left);
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
445 let ops = parse_list(py, ops, parse_cmpop);
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
446 let comparators = parse_list(py, comparators, parse_expr);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
447
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
448 expr::Compare(Box::new(left), ops, comparators)
14
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
449 } else if is_instance(&ast, &listcomp_type) {
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
450 let elt = ast.getattr(py, "elt").unwrap();
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
451 let generators = ast.getattr(py, "generators").unwrap();
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
452
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
453 let elt = parse_expr(py, elt);
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
454 let generators = parse_list(py, generators, parse_comprehension);
14
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
455
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
456 expr::ListComp(Box::new(elt), generators)
16
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
457 } else if is_instance(&ast, &dictcomp_type) {
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
458 let key = ast.getattr(py, "key").unwrap();
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
459 let value = ast.getattr(py, "value").unwrap();
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
460 let generators = ast.getattr(py, "generators").unwrap();
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
461
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
462 let key = parse_expr(py, key);
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
463 let value = parse_expr(py, value);
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
464 let generators = parse_list(py, generators, parse_comprehension);
16
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
465
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
466 expr::DictComp(Box::new(key), Box::new(value), generators)
17
f1c77634a2eb Add ast.Tuple
Bastien Orivel <eijebong@bananium.fr>
parents: 16
diff changeset
467 } else if is_instance(&ast, &tuple_type) {
f1c77634a2eb Add ast.Tuple
Bastien Orivel <eijebong@bananium.fr>
parents: 16
diff changeset
468 let elts = ast.getattr(py, "elts").unwrap();
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
469 let elts = parse_list(py, elts, parse_expr);
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
470 expr::Tuple(elts, get_ctx(py, ast))
52
d9838e8b3ec5 Add ast.Ellipsis.
Bastien Orivel <eijebong@bananium.fr>
parents: 51
diff changeset
471 } else if is_instance(&ast, &ellipsis_type) {
d9838e8b3ec5 Add ast.Ellipsis.
Bastien Orivel <eijebong@bananium.fr>
parents: 51
diff changeset
472 expr::Ellipsis
73
2a6629ea82b5 Add ast.Await.
Bastien Orivel <eijebong@bananium.fr>
parents: 72
diff changeset
473 } else if is_instance(&ast, &await_type) {
2a6629ea82b5 Add ast.Await.
Bastien Orivel <eijebong@bananium.fr>
parents: 72
diff changeset
474 let value = ast.getattr(py, "value").unwrap();
2a6629ea82b5 Add ast.Await.
Bastien Orivel <eijebong@bananium.fr>
parents: 72
diff changeset
475 let value = parse_expr(py, value);
2a6629ea82b5 Add ast.Await.
Bastien Orivel <eijebong@bananium.fr>
parents: 72
diff changeset
476
2a6629ea82b5 Add ast.Await.
Bastien Orivel <eijebong@bananium.fr>
parents: 72
diff changeset
477 expr::Await(Box::new(value))
74
97537c90d92d Add ast.Yield.
Bastien Orivel <eijebong@bananium.fr>
parents: 73
diff changeset
478 } else if is_instance(&ast, &yield_type) {
97537c90d92d Add ast.Yield.
Bastien Orivel <eijebong@bananium.fr>
parents: 73
diff changeset
479 let value = ast.getattr(py, "value").unwrap();
97537c90d92d Add ast.Yield.
Bastien Orivel <eijebong@bananium.fr>
parents: 73
diff changeset
480 let value = parse_optional_expr(py, value);
97537c90d92d Add ast.Yield.
Bastien Orivel <eijebong@bananium.fr>
parents: 73
diff changeset
481
97537c90d92d Add ast.Yield.
Bastien Orivel <eijebong@bananium.fr>
parents: 73
diff changeset
482 expr::Yield(Box::new(value))
75
1abc8ca9f30b Add ast.YieldFrom.
Bastien Orivel <eijebong@bananium.fr>
parents: 74
diff changeset
483 } else if is_instance(&ast, &yield_from_type) {
1abc8ca9f30b Add ast.YieldFrom.
Bastien Orivel <eijebong@bananium.fr>
parents: 74
diff changeset
484 let value = ast.getattr(py, "value").unwrap();
1abc8ca9f30b Add ast.YieldFrom.
Bastien Orivel <eijebong@bananium.fr>
parents: 74
diff changeset
485 let value = parse_expr(py, value);
1abc8ca9f30b Add ast.YieldFrom.
Bastien Orivel <eijebong@bananium.fr>
parents: 74
diff changeset
486
1abc8ca9f30b Add ast.YieldFrom.
Bastien Orivel <eijebong@bananium.fr>
parents: 74
diff changeset
487 expr::YieldFrom(Box::new(value))
76
efd42fc280e8 Add ast.Set.
Bastien Orivel <eijebong@bananium.fr>
parents: 75
diff changeset
488 } else if is_instance(&ast, &set_type) {
efd42fc280e8 Add ast.Set.
Bastien Orivel <eijebong@bananium.fr>
parents: 75
diff changeset
489 let elts = ast.getattr(py, "elts").unwrap();
efd42fc280e8 Add ast.Set.
Bastien Orivel <eijebong@bananium.fr>
parents: 75
diff changeset
490 let elements = parse_list(py, elts, parse_expr);
efd42fc280e8 Add ast.Set.
Bastien Orivel <eijebong@bananium.fr>
parents: 75
diff changeset
491
efd42fc280e8 Add ast.Set.
Bastien Orivel <eijebong@bananium.fr>
parents: 75
diff changeset
492 expr::Set(elements)
77
7d1406181aae Add ast.SetComp.
Bastien Orivel <eijebong@bananium.fr>
parents: 76
diff changeset
493 } else if is_instance(&ast, &setcomp_type) {
7d1406181aae Add ast.SetComp.
Bastien Orivel <eijebong@bananium.fr>
parents: 76
diff changeset
494 let elt = ast.getattr(py, "elt").unwrap();
7d1406181aae Add ast.SetComp.
Bastien Orivel <eijebong@bananium.fr>
parents: 76
diff changeset
495 let generators = ast.getattr(py, "generators").unwrap();
7d1406181aae Add ast.SetComp.
Bastien Orivel <eijebong@bananium.fr>
parents: 76
diff changeset
496
7d1406181aae Add ast.SetComp.
Bastien Orivel <eijebong@bananium.fr>
parents: 76
diff changeset
497 let elt = parse_expr(py, elt);
7d1406181aae Add ast.SetComp.
Bastien Orivel <eijebong@bananium.fr>
parents: 76
diff changeset
498 let generators = parse_list(py, generators, parse_comprehension);
7d1406181aae Add ast.SetComp.
Bastien Orivel <eijebong@bananium.fr>
parents: 76
diff changeset
499
7d1406181aae Add ast.SetComp.
Bastien Orivel <eijebong@bananium.fr>
parents: 76
diff changeset
500 expr::SetComp(Box::new(elt), generators)
78
f1a845e4121b Add ast.GeneratorExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 77
diff changeset
501 } else if is_instance(&ast, &generatorexp_type) {
f1a845e4121b Add ast.GeneratorExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 77
diff changeset
502 let elt = ast.getattr(py, "elt").unwrap();
f1a845e4121b Add ast.GeneratorExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 77
diff changeset
503 let generators = ast.getattr(py, "generators").unwrap();
f1a845e4121b Add ast.GeneratorExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 77
diff changeset
504
f1a845e4121b Add ast.GeneratorExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 77
diff changeset
505 let elt = parse_expr(py, elt);
f1a845e4121b Add ast.GeneratorExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 77
diff changeset
506 let generators = parse_list(py, generators, parse_comprehension);
f1a845e4121b Add ast.GeneratorExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 77
diff changeset
507
f1a845e4121b Add ast.GeneratorExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 77
diff changeset
508 expr::GeneratorExp(Box::new(elt), generators)
79
6bf54bff8dbd Add ast.Lambda.
Bastien Orivel <eijebong@bananium.fr>
parents: 78
diff changeset
509 } else if is_instance(&ast, &lambda_type) {
6bf54bff8dbd Add ast.Lambda.
Bastien Orivel <eijebong@bananium.fr>
parents: 78
diff changeset
510 let args = ast.getattr(py, "args").unwrap();
6bf54bff8dbd Add ast.Lambda.
Bastien Orivel <eijebong@bananium.fr>
parents: 78
diff changeset
511 let body = ast.getattr(py, "body").unwrap();
6bf54bff8dbd Add ast.Lambda.
Bastien Orivel <eijebong@bananium.fr>
parents: 78
diff changeset
512
6bf54bff8dbd Add ast.Lambda.
Bastien Orivel <eijebong@bananium.fr>
parents: 78
diff changeset
513 let args = parse_arguments(py, args);
6bf54bff8dbd Add ast.Lambda.
Bastien Orivel <eijebong@bananium.fr>
parents: 78
diff changeset
514 let body = parse_expr(py, body);
6bf54bff8dbd Add ast.Lambda.
Bastien Orivel <eijebong@bananium.fr>
parents: 78
diff changeset
515
6bf54bff8dbd Add ast.Lambda.
Bastien Orivel <eijebong@bananium.fr>
parents: 78
diff changeset
516 expr::Lambda(Box::new(args), Box::new(body))
80
c6d3f0dabbba Add ast.IfExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 79
diff changeset
517 } else if is_instance(&ast, &ifexp_type) {
c6d3f0dabbba Add ast.IfExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 79
diff changeset
518 let test = ast.getattr(py, "test").unwrap();
c6d3f0dabbba Add ast.IfExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 79
diff changeset
519 let body = ast.getattr(py, "body").unwrap();
c6d3f0dabbba Add ast.IfExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 79
diff changeset
520 let orelse = ast.getattr(py, "orelse").unwrap();
c6d3f0dabbba Add ast.IfExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 79
diff changeset
521
c6d3f0dabbba Add ast.IfExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 79
diff changeset
522 let test = parse_expr(py, test);
c6d3f0dabbba Add ast.IfExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 79
diff changeset
523 let body = parse_expr(py, body);
c6d3f0dabbba Add ast.IfExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 79
diff changeset
524 let orelse = parse_expr(py, orelse);
c6d3f0dabbba Add ast.IfExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 79
diff changeset
525
c6d3f0dabbba Add ast.IfExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 79
diff changeset
526 expr::IfExp(Box::new(test), Box::new(body), Box::new(orelse))
81
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
527 } else if is_instance(&ast, &dict_type) {
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
528 let keys = ast.getattr(py, "keys").unwrap();
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
529 let values = ast.getattr(py, "values").unwrap();
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
530
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
531 let keys = parse_list(py, keys, parse_optional_expr);
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
532 let values = parse_list(py, values, parse_expr);
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
533
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
534 expr::Dict(keys, values)
82
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
535 } else if is_instance(&ast, &subscript_type) {
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
536 let value = ast.getattr(py, "value").unwrap();
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
537 let slice = ast.getattr(py, "slice").unwrap();
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
538 let ctx = get_ctx(py, ast);
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
539
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
540 let value = parse_expr(py, value);
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
541 let slice = parse_slice(py, slice);
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
542
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
543 expr::Subscript(Box::new(value), Box::new(slice), ctx)
83
e59cd5754268 Add ast.Starred.
Bastien Orivel <eijebong@bananium.fr>
parents: 82
diff changeset
544 } else if is_instance(&ast, &starred_type) {
e59cd5754268 Add ast.Starred.
Bastien Orivel <eijebong@bananium.fr>
parents: 82
diff changeset
545 let value = ast.getattr(py, "value").unwrap();
e59cd5754268 Add ast.Starred.
Bastien Orivel <eijebong@bananium.fr>
parents: 82
diff changeset
546 let ctx = get_ctx(py, ast);
e59cd5754268 Add ast.Starred.
Bastien Orivel <eijebong@bananium.fr>
parents: 82
diff changeset
547
e59cd5754268 Add ast.Starred.
Bastien Orivel <eijebong@bananium.fr>
parents: 82
diff changeset
548 let value = parse_expr(py, value);
e59cd5754268 Add ast.Starred.
Bastien Orivel <eijebong@bananium.fr>
parents: 82
diff changeset
549
e59cd5754268 Add ast.Starred.
Bastien Orivel <eijebong@bananium.fr>
parents: 82
diff changeset
550 expr::Starred(Box::new(value), ctx)
16
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 15
diff changeset
551 } else {
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
552 println!("expr {}", ast);
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
553 unreachable!()
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
554 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
555 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
556
56
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
557 fn parse_arg(py: Python, ast: PyObject) -> arg {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
558 let arg = ast.getattr(py, "arg").unwrap();
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
559 let annotation = ast.getattr(py, "annotation").unwrap();
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
560
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
561 let arg = get_str(py, arg);
61
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
562 let annotation = parse_optional_expr(py, annotation);
56
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
563
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
564 arg{arg: arg, annotation: annotation}
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
565 }
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
566
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
567 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
568 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
569 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
570
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
571 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
572 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
573 };
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
574
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
575 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
576 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
577 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
578 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
579
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
580 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
581
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
582 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
583 let args = arguments{
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
584 //args: Vec<arg>,
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
585 args: {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
586 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
587 let mut arguments = vec!();
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
588 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
589 let arg = arg.unwrap();
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
590 assert!(is_instance(&arg, &arg_type));
56
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
591 let arg = parse_arg(py, arg);
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
592 arguments.push(arg);
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
593 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
594 arguments
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
595 },
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
596 //vararg: Option<arg>,
56
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
597 vararg: {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
598 let vararg = ast.getattr(py, "vararg").unwrap();
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
599 if vararg == py.None() {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
600 None
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
601 } else {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
602 let arg = parse_arg(py, vararg);
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
603 Some(arg)
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
604 }
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
605 },
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
606 //kwonlyargs: Vec<arg>,
56
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
607 kwonlyargs: {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
608 let kwonlyargs = ast.getattr(py, "kwonlyargs").unwrap();
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
609 let mut arguments = vec!();
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
610 for arg in kwonlyargs.iter(py).unwrap() {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
611 let arg = arg.unwrap();
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
612 assert!(is_instance(&arg, &arg_type));
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
613 let arg = parse_arg(py, arg);
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
614 arguments.push(arg);
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
615 }
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
616 arguments
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
617 },
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
618 //kw_defaults: Vec<Option<expr>>,
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
619 kw_defaults: {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
620 let kw_defaults = ast.getattr(py, "kw_defaults").unwrap();
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
621 let mut arguments = vec!();
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
622 for arg in kw_defaults.iter(py).unwrap() {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
623 let arg = arg.unwrap();
61
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
624 let arg = parse_optional_expr(py, arg);
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
625
56
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
626 arguments.push(arg);
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
627 }
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
628 arguments
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
629 },
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
630 //kwarg: Option<arg>,
56
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
631 kwarg: {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
632 let kwarg = ast.getattr(py, "kwarg").unwrap();
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
633 if kwarg == py.None() {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
634 None
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
635 } else {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
636 let arg = parse_arg(py, kwarg);
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
637 Some(arg)
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
638 }
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
639 },
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
640 //defaults: Vec<expr>
56
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
641 defaults: {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
642 let defaults = ast.getattr(py, "defaults").unwrap();
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
643 let mut arguments = vec!();
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
644 for arg in defaults.iter(py).unwrap() {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
645 let arg = arg.unwrap();
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
646 let arg = parse_expr(py, arg);
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
647 arguments.push(arg);
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
648 }
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
649 arguments
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
650 }
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
651 };
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
652 args
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
653 } else {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
654 println!("arguments {}", ast);
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
655 panic!()
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
656 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
657 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
658
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
659 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
660 //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
661 //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
662
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
663 let builtins_module = py.import("builtins").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
664 let isinstance = builtins_module.get(py, "isinstance").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
665
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
666 let is_instance = |object: &PyObject, type_: &PyObject| {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
667 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
668 };
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
669
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
670 let ast_module = py.import("ast").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
671 let ast_type = ast_module.get(py, "AST").unwrap();
2
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
672 let class_def_type = ast_module.get(py, "ClassDef").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
673 let function_def_type = ast_module.get(py, "FunctionDef").unwrap();
69
a73eaf42bea1 Add ast.AsyncDefFunction.
Bastien Orivel <eijebong@bananium.fr>
parents: 68
diff changeset
674 let async_function_def_type = ast_module.get(py, "AsyncFunctionDef").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
675 let global_type = ast_module.get(py, "Global").unwrap();
51
ded1907b7a69 Add ast.Nonlocal.
Bastien Orivel <eijebong@bananium.fr>
parents: 50
diff changeset
676 let nonlocal_type = ast_module.get(py, "Nonlocal").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
677 let assign_type = ast_module.get(py, "Assign").unwrap();
8
94ff501bf336 Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7
diff changeset
678 let aug_assign_type = ast_module.get(py, "AugAssign").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
679 let return_type = ast_module.get(py, "Return").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
680 let import_from_type = ast_module.get(py, "ImportFrom").unwrap();
47
38f59b0efc2c Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 44
diff changeset
681 let import_type = ast_module.get(py, "Import").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
682 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
683 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
684 let for_type = ast_module.get(py, "For").unwrap();
71
2c1e2ce41263 Add ast.AsyncFor.
Bastien Orivel <eijebong@bananium.fr>
parents: 69
diff changeset
685 let async_for_type = ast_module.get(py, "AsyncFor").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
686 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
687 let break_type = ast_module.get(py, "Break").unwrap();
21
7af637f444d1 Add ast.Delete
Bastien Orivel <eijebong@bananium.fr>
parents: 20
diff changeset
688 let delete_type = ast_module.get(py, "Delete").unwrap();
49
141f1769e1f0 Add ast.Pass.
Bastien Orivel <eijebong@bananium.fr>
parents: 48
diff changeset
689 let pass_type = ast_module.get(py, "Pass").unwrap();
50
5edbc24b625f Add ast.Continue.
Bastien Orivel <eijebong@bananium.fr>
parents: 49
diff changeset
690 let continue_type = ast_module.get(py, "Continue").unwrap();
57
e5a808ec31c0 Add ast.Assert.
Bastien Orivel <eijebong@bananium.fr>
parents: 56
diff changeset
691 let assert_type = ast_module.get(py, "Assert").unwrap();
59
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
692 let with_type = ast_module.get(py, "With").unwrap();
72
7ac23f4336b1 Add ast.AsyncWith.
Bastien Orivel <eijebong@bananium.fr>
parents: 71
diff changeset
693 let async_with_type = ast_module.get(py, "AsyncWith").unwrap();
60
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
694 let raise_type = ast_module.get(py, "Raise").unwrap();
68
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
695 let try_type = ast_module.get(py, "Try").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
696
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
697 assert!(is_instance(&ast, &ast_type));
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
698
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
699 /*
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
700 // TODO: implement Hash for PyObject. (trivial)
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
701 let map = {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
702 let fields = ast.getattr(py, "_fields").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
703 let mut map = HashMap::new();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
704 for field in fields.iter(py).unwrap() {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
705 let field = field.unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
706 let value = ast.getattr(py, field).unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
707 map.insert(field, value);
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 map
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
710 };
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
711 */
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
712
2
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
713 if is_instance(&ast, &class_def_type) {
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
714 let name = ast.getattr(py, "name").unwrap();
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
715 let bases = ast.getattr(py, "bases").unwrap();
67
8ce78e2ba48c Implement class keywords.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
716 let keywords = ast.getattr(py, "keywords").unwrap();
2
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
717 let body = ast.getattr(py, "body").unwrap();
65
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
718 let decorator_list = ast.getattr(py, "decorator_list").unwrap();
2
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
719
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
720 let name = get_str(py, name);
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
721 let bases = parse_list(py, bases, parse_expr);
67
8ce78e2ba48c Implement class keywords.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
722 let keywords = parse_list(py, keywords, parse_keyword);
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
723 let body = parse_list(py, body, parse_statement);
65
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
724 let decorator_list = parse_list(py, decorator_list, parse_expr);
2
5fc7c2790d8c Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
725
67
8ce78e2ba48c Implement class keywords.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
726 stmt::ClassDef(name, bases, keywords, body, decorator_list)
69
a73eaf42bea1 Add ast.AsyncDefFunction.
Bastien Orivel <eijebong@bananium.fr>
parents: 68
diff changeset
727 } else if is_instance(&ast, &function_def_type) || is_instance(&ast, &async_function_def_type) {
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
728 let name = ast.getattr(py, "name").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
729 let args = ast.getattr(py, "args").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
730 let body = ast.getattr(py, "body").unwrap();
64
53817b39f139 Add FunctionDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
731 let decorator_list = ast.getattr(py, "decorator_list").unwrap();
63
5df52b40fe54 Implement FunctionDef.returns.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 61
diff changeset
732 let returns = ast.getattr(py, "returns").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
733
1
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
734 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
735 let args = parse_arguments(py, args);
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
736 let body = parse_list(py, body, parse_statement);
64
53817b39f139 Add FunctionDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
737 let decorator_list = parse_list(py, decorator_list, parse_expr);
63
5df52b40fe54 Implement FunctionDef.returns.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 61
diff changeset
738 let returns = parse_optional_expr(py, returns);
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
739
69
a73eaf42bea1 Add ast.AsyncDefFunction.
Bastien Orivel <eijebong@bananium.fr>
parents: 68
diff changeset
740 stmt::FunctionDef(name, args, body, decorator_list, returns, is_instance(&ast, &async_function_def_type))
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
741 } else if is_instance(&ast, &global_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
742 let names = ast.getattr(py, "names").unwrap();
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
743 let names = parse_list(py, names, get_str);
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
744 stmt::Global(names)
51
ded1907b7a69 Add ast.Nonlocal.
Bastien Orivel <eijebong@bananium.fr>
parents: 50
diff changeset
745 } else if is_instance(&ast, &nonlocal_type) {
ded1907b7a69 Add ast.Nonlocal.
Bastien Orivel <eijebong@bananium.fr>
parents: 50
diff changeset
746 let names = ast.getattr(py, "names").unwrap();
ded1907b7a69 Add ast.Nonlocal.
Bastien Orivel <eijebong@bananium.fr>
parents: 50
diff changeset
747 let names = parse_list(py, names, get_str);
ded1907b7a69 Add ast.Nonlocal.
Bastien Orivel <eijebong@bananium.fr>
parents: 50
diff changeset
748 stmt::Nonlocal(names)
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
749 } else if is_instance(&ast, &if_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
750 let test = ast.getattr(py, "test").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
751 let body = ast.getattr(py, "body").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
752 let orelse = ast.getattr(py, "orelse").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
753
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
754 let test = parse_expr(py, test);
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
755 let body = parse_list(py, body, parse_statement);
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
756 let orelse = parse_list(py, orelse, parse_statement);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
757
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
758 stmt::If(test, body, orelse)
6
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
759 } else if is_instance(&ast, &while_type) {
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
760 let test = ast.getattr(py, "test").unwrap();
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
761 let body = ast.getattr(py, "body").unwrap();
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
762 let orelse = ast.getattr(py, "orelse").unwrap();
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
763
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
764 let test = parse_expr(py, test);
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
765 let body = parse_list(py, body, parse_statement);
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
766 let orelse = parse_list(py, orelse, parse_statement);
6
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
767
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
768 stmt::While(test, body, orelse)
71
2c1e2ce41263 Add ast.AsyncFor.
Bastien Orivel <eijebong@bananium.fr>
parents: 69
diff changeset
769 } else if is_instance(&ast, &for_type) || is_instance(&ast, &async_for_type) {
5
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
770 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
771 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
772 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
773 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
774
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
775 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
776 let iter = parse_expr(py, iter);
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
777 let body = parse_list(py, body, parse_statement);
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
778 let orelse = parse_list(py, orelse, parse_statement);
5
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
779
71
2c1e2ce41263 Add ast.AsyncFor.
Bastien Orivel <eijebong@bananium.fr>
parents: 69
diff changeset
780 stmt::For(target, iter, body, orelse, is_instance(&ast, &async_for_type))
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
781 } else if is_instance(&ast, &assign_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
782 let targets = ast.getattr(py, "targets").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
783 let value = ast.getattr(py, "value").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
784
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
785 let targets = parse_list(py, targets, parse_expr);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
786 let value = parse_expr(py, value);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
787
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
788 stmt::Assign(targets, value)
8
94ff501bf336 Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7
diff changeset
789 } else if is_instance(&ast, &aug_assign_type) {
94ff501bf336 Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7
diff changeset
790 let target = ast.getattr(py, "target").unwrap();
94ff501bf336 Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7
diff changeset
791 let op = ast.getattr(py, "op").unwrap();
94ff501bf336 Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7
diff changeset
792 let value = ast.getattr(py, "value").unwrap();
94ff501bf336 Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7
diff changeset
793
94ff501bf336 Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7
diff changeset
794 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
795 let op = parse_operator(py, op);
8
94ff501bf336 Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7
diff changeset
796 let value = parse_expr(py, value);
94ff501bf336 Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7
diff changeset
797
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
798 stmt::AugAssign(target, op, value)
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
799 } else if is_instance(&ast, &import_from_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
800 let module = ast.getattr(py, "module").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
801 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
802 let level = ast.getattr(py, "level").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
803
1
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
804 let module = get_str(py, module);
44
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
805 let names = parse_list(py, names, parse_alias);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
806
48
039f85b187f2 Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents: 47
diff changeset
807 if level == py.None() {
039f85b187f2 Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents: 47
diff changeset
808 stmt::ImportFrom(module, names, None)
039f85b187f2 Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents: 47
diff changeset
809 } else {
039f85b187f2 Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents: 47
diff changeset
810 let level = level.extract(py).unwrap();
039f85b187f2 Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents: 47
diff changeset
811 stmt::ImportFrom(module, names, Some(level))
039f85b187f2 Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents: 47
diff changeset
812 }
47
38f59b0efc2c Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 44
diff changeset
813 } else if is_instance(&ast, &import_type) {
38f59b0efc2c Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 44
diff changeset
814 let names = ast.getattr(py, "names").unwrap();
38f59b0efc2c Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 44
diff changeset
815 let names = parse_list(py, names, parse_alias);
38f59b0efc2c Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 44
diff changeset
816
38f59b0efc2c Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 44
diff changeset
817 stmt::Import(names)
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
818 } else if is_instance(&ast, &return_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
819 let value = ast.getattr(py, "value").unwrap();
61
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
820 let value = parse_optional_expr(py, value);
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
821
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
822 stmt::Return(value)
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
823 } else if is_instance(&ast, &expr_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
824 let value = ast.getattr(py, "value").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
825 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
826 stmt::Expr(value)
6
6f2bf13f4cb5 Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 5
diff changeset
827 } 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
828 stmt::Break
21
7af637f444d1 Add ast.Delete
Bastien Orivel <eijebong@bananium.fr>
parents: 20
diff changeset
829 } else if is_instance(&ast, &delete_type) {
7af637f444d1 Add ast.Delete
Bastien Orivel <eijebong@bananium.fr>
parents: 20
diff changeset
830 let targets = ast.getattr(py, "targets").unwrap();
7af637f444d1 Add ast.Delete
Bastien Orivel <eijebong@bananium.fr>
parents: 20
diff changeset
831 let targets = parse_list(py, targets, parse_expr);
7af637f444d1 Add ast.Delete
Bastien Orivel <eijebong@bananium.fr>
parents: 20
diff changeset
832 stmt::Delete(targets)
49
141f1769e1f0 Add ast.Pass.
Bastien Orivel <eijebong@bananium.fr>
parents: 48
diff changeset
833 } else if is_instance(&ast, &pass_type) {
141f1769e1f0 Add ast.Pass.
Bastien Orivel <eijebong@bananium.fr>
parents: 48
diff changeset
834 stmt::Pass
50
5edbc24b625f Add ast.Continue.
Bastien Orivel <eijebong@bananium.fr>
parents: 49
diff changeset
835 } else if is_instance(&ast, &continue_type) {
5edbc24b625f Add ast.Continue.
Bastien Orivel <eijebong@bananium.fr>
parents: 49
diff changeset
836 stmt::Continue
57
e5a808ec31c0 Add ast.Assert.
Bastien Orivel <eijebong@bananium.fr>
parents: 56
diff changeset
837 } else if is_instance(&ast, &assert_type) {
e5a808ec31c0 Add ast.Assert.
Bastien Orivel <eijebong@bananium.fr>
parents: 56
diff changeset
838 let test = ast.getattr(py, "test").unwrap();
e5a808ec31c0 Add ast.Assert.
Bastien Orivel <eijebong@bananium.fr>
parents: 56
diff changeset
839 let msg = ast.getattr(py, "msg").unwrap();
e5a808ec31c0 Add ast.Assert.
Bastien Orivel <eijebong@bananium.fr>
parents: 56
diff changeset
840
61
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
841 let test = parse_expr(py, test);
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
842 let msg = parse_optional_expr(py, msg);
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
843
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
844 stmt::Assert(test, msg)
72
7ac23f4336b1 Add ast.AsyncWith.
Bastien Orivel <eijebong@bananium.fr>
parents: 71
diff changeset
845 } else if is_instance(&ast, &with_type) || is_instance(&ast, &async_with_type) {
59
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
846 let items = ast.getattr(py, "items").unwrap();
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
847 let body = ast.getattr(py, "body").unwrap();
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
848
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
849 let items = parse_list(py, items, parse_withitem);
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
850 let body = parse_list(py, body, parse_statement);
72
7ac23f4336b1 Add ast.AsyncWith.
Bastien Orivel <eijebong@bananium.fr>
parents: 71
diff changeset
851 stmt::With(items, body, is_instance(&ast, &async_with_type))
60
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
852 } else if is_instance(&ast, &raise_type) {
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
853 let exc = ast.getattr(py, "exc").unwrap();
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
854 let cause = ast.getattr(py, "cause").unwrap();
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
855
61
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
856 let exc = parse_optional_expr(py, exc);
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
857 let cause = parse_optional_expr(py, cause);
60
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
858
61
6b73843c5b4a Add a parse_optional_expr function and use it instead of let var = if var == py.None() { None } else { Some(parse_expr(var) };
Bastien Orivel <eijebong@bananium.fr>
parents: 60
diff changeset
859 stmt::Raise(exc, cause)
68
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
860 } else if is_instance(&ast, &try_type) {
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
861 let body = ast.getattr(py, "body").unwrap();
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
862 let excepthandlers = ast.getattr(py, "handlers").unwrap();
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
863 let orelse = ast.getattr(py, "orelse").unwrap();
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
864 let finalbody = ast.getattr(py, "finalbody").unwrap();
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
865
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
866 let body = parse_list(py, body, parse_statement);
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
867 let excepthandlers = parse_list(py, excepthandlers, parse_excepthandler);
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
868 let orelse = parse_list(py, orelse, parse_statement);
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
869 let finalbody = parse_list(py, finalbody, parse_statement);
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
870
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
871 stmt::Try(body, excepthandlers, orelse, finalbody)
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
872 } else {
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
873 println!("stmt {}", ast);
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
874 panic!()
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
875 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
876 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
877
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
878 #[allow(dead_code)]
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
879 pub fn convert_ast(name: String, module: &PyObject) -> Module {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
880 let gil = Python::acquire_gil();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
881 let py = gil.python();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
882
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
883 let builtins_module = py.import("builtins").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
884 let isinstance = builtins_module.get(py, "isinstance").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
885
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
886 let ast_module = py.import("ast").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
887 let module_type = ast_module.get(py, "Module").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
888
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
889 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
890
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
891 let body = module.getattr(py, "body").unwrap();
20
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
892 let body = parse_list(py, body, parse_statement);
ace12d6b9855 Replace every loop in ast_convert with parse_list.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 19
diff changeset
893 Module{name: name, statements: body}
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
894 }