annotate src/python_dump.rs @ 14:719a27f1c1c7

Add ast.ListComp
author Bastien Orivel <eijebong@bananium.fr>
date Thu, 02 Jun 2016 20:40:24 +0200
parents ddf372373a77
children a0b23123901b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
1 extern crate cpython;
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
2
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
3 use std::iter;
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
4
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
5 use cpython::{Python, PyObject};
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
6 use cpython::ObjectProtocol; //for call method
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
7
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
8 fn dump(py: Python, indent: usize, ast: PyObject) -> String {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
9 let builtins_module = py.import("builtins").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
10 let isinstance = builtins_module.get(py, "isinstance").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
11
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
12 let is_instance = |object: &PyObject, type_: &PyObject| {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
13 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
14 };
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
15
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
16 let ast_module = py.import("ast").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
17 let ast_type = ast_module.get(py, "AST").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
18 let function_def_type = ast_module.get(py, "FunctionDef").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
19 let arguments_type = ast_module.get(py, "arguments").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
20 let arg_type = ast_module.get(py, "arg").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
21 let assign_type = ast_module.get(py, "Assign").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
22 let return_type = ast_module.get(py, "Return").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
23 let bin_op_type = ast_module.get(py, "BinOp").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
24 let name_constant_type = ast_module.get(py, "NameConstant").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
25 let name_type = ast_module.get(py, "Name").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
26 let num_type = ast_module.get(py, "Num").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
27 let str_type = ast_module.get(py, "Str").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
28 let add_type = ast_module.get(py, "Add").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
29 let mult_type = ast_module.get(py, "Mult").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
30 let eq_type = ast_module.get(py, "Eq").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
31 let lt_type = ast_module.get(py, "Lt").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
32 let if_type = ast_module.get(py, "If").unwrap();
5
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
33 let for_type = ast_module.get(py, "For").unwrap();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
34 let compare_type = ast_module.get(py, "Compare").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
35 let expr_type = ast_module.get(py, "Expr").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
36 let call_type = ast_module.get(py, "Call").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
37 let import_from_type = ast_module.get(py, "ImportFrom").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
38 let alias_type = ast_module.get(py, "alias").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
39
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
40 assert!(is_instance(&ast, &ast_type));
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
41
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
42 /*
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
43 // TODO: implement Hash for PyObject. (trivial)
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
44 let map = {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
45 let fields = ast.getattr(py, "_fields").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
46 let mut map = HashMap::new();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
47 for field in fields.iter(py).unwrap() {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
48 let field = field.unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
49 let value = ast.getattr(py, field).unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
50 map.insert(field, value);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
51 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
52 map
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
53 };
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
54 */
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
55
1
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
56 fn get_str(py: Python, object: PyObject) -> String {
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
57 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
58 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
59 string.to_mut().to_string()
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
60 }
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
61
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
62 if is_instance(&ast, &function_def_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
63 let name = ast.getattr(py, "name").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
64 let args = ast.getattr(py, "args").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
65 let body = ast.getattr(py, "body").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
66 let args = dump(py, indent, args);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
67 let declaration = format!("def {}({}):", name, args);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
68 let mut statements = vec!("".to_string());
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
69 for statement in body.iter(py).unwrap() {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
70 let statement = dump(py, indent + 1, statement.unwrap());
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
71 statements.push(statement);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
72 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
73 let indent: String = iter::repeat(" ").take(indent + 1).collect();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
74 let indent = format!("\n{}", indent);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
75 let indent = indent.as_str();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
76 let body = statements.join(indent);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
77 format!("{}{}", declaration, body)
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
78 } else if is_instance(&ast, &if_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
79 let test = ast.getattr(py, "test").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
80 let body = ast.getattr(py, "body").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
81
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
82 let test = dump(py, indent, test);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
83
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
84 let declaration = format!("if {}:", test);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
85 let mut statements = vec!("".to_string());
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
86 for statement in body.iter(py).unwrap() {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
87 let statement = dump(py, indent + 1, statement.unwrap());
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
88 statements.push(statement);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
89 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
90 let indent: String = iter::repeat(" ").take(indent + 1).collect();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
91 let indent = format!("\n{}", indent);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
92 let indent = indent.as_str();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
93 let body = statements.join(indent);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
94 format!("{}{}", declaration, body)
5
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
95 } else if is_instance(&ast, &for_type) {
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
96 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: 1
diff changeset
97 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: 1
diff changeset
98 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: 1
diff changeset
99 //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: 1
diff changeset
100
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
101 let target = dump(py, indent, target);
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
102 let iter = dump(py, indent, iter);
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
103
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
104 let declaration = format!("for {} in {}:", target, iter);
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
105 let mut statements = vec!("".to_string());
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
106 for statement in body.iter(py).unwrap() {
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
107 let statement = dump(py, indent + 1, statement.unwrap());
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
108 statements.push(statement);
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
109 }
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
110 let indent: String = iter::repeat(" ").take(indent + 1).collect();
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
111 let indent = format!("\n{}", indent);
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
112 let indent = indent.as_str();
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
113 let body = statements.join(indent);
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1
diff changeset
114 format!("{}{}", declaration, body)
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
115 } else if is_instance(&ast, &arguments_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
116 let args_list = ast.getattr(py, "args").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
117 let mut arguments = vec!();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
118 for arg in args_list.iter(py).unwrap() {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
119 let arg = arg.unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
120 arguments.push(dump(py, indent, arg));
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
121 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
122 format!("{}", arguments.join(", "))
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
123 } else if is_instance(&ast, &arg_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
124 let arg = ast.getattr(py, "arg").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
125 format!("{}", arg)
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
126 } else if is_instance(&ast, &compare_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
127 let left = ast.getattr(py, "left").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
128 let ops = ast.getattr(py, "ops").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
129 let comparators = ast.getattr(py, "comparators").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
130
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
131 let left = dump(py, indent, left);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
132 let ops = ops.iter(py).unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
133 let comparators = comparators.iter(py).unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
134
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
135 let mut comparisons = vec!();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
136 for (op, comparator) in ops.zip(comparators) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
137 let op = op.unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
138 let comparator = comparator.unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
139
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
140 let op = dump(py, indent, op);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
141 let comparator = dump(py, indent, comparator);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
142
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
143 comparisons.push(format!("{} {}", op, comparator));
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
144 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
145 format!("{} {}", left, comparisons.join(" "))
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
146 } else if is_instance(&ast, &assign_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
147 let targets = ast.getattr(py, "targets").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
148 let value = ast.getattr(py, "value").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
149 let mut cibles = vec!();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
150 for target in targets.iter(py).unwrap() {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
151 let target = target.unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
152 let target = dump(py, indent, target);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
153 cibles.push(target.to_string());
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
154 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
155 let value = dump(py, indent, value);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
156 format!("{} = {}", cibles.join(", "), value)
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
157 } else if is_instance(&ast, &return_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
158 let value = ast.getattr(py, "value").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
159 let value = dump(py, indent, value);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
160 format!("return {}", value)
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
161 } else if is_instance(&ast, &bin_op_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
162 let left = ast.getattr(py, "left").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
163 let op = ast.getattr(py, "op").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
164 let right = ast.getattr(py, "right").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
165
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
166 let left = dump(py, indent, left);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
167 let op = dump(py, indent, op);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
168 let right = dump(py, indent, right);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
169
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
170 format!("{} {} {}", left, op, right)
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
171 } else if is_instance(&ast, &name_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
172 let id = ast.getattr(py, "id").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
173 format!("{}", id)
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
174 } else if is_instance(&ast, &name_constant_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
175 let value = ast.getattr(py, "value").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
176 format!("{}", value)
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
177 } else if is_instance(&ast, &expr_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
178 let value = ast.getattr(py, "value").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
179 let value = dump(py, indent, value);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
180 format!("{}", value)
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
181 } else if is_instance(&ast, &call_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
182 let func = ast.getattr(py, "func").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
183 let args = ast.getattr(py, "args").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
184 //let keywords = ast.getattr(py, "keywords").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
185
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
186 let func = dump(py, indent, func);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
187
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
188 let mut arguments = vec!();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
189 for arg in args.iter(py).unwrap() {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
190 let arg = arg.unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
191 arguments.push(dump(py, indent, arg));
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
192 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
193
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
194 format!("{}({})", func, arguments.join(", "))
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
195 } else if is_instance(&ast, &import_from_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
196 let module = ast.getattr(py, "module").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
197 let names = ast.getattr(py, "names").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
198 //let level = ast.getattr(py, "level").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
199
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
200 let mut arguments = vec!();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
201 for name in names.iter(py).unwrap() {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
202 let name = name.unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
203 arguments.push(dump(py, indent, name));
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
204 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
205
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
206 format!("from {} import {}", module, arguments.join(", "))
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
207 } else if is_instance(&ast, &alias_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
208 let name = ast.getattr(py, "name").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
209 let asname = ast.getattr(py, "asname").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
210
1
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
211 let name = get_str(py, name);
b90e49ab734b Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
212 let asname = get_str(py, asname);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
213
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
214 if asname == "None" {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
215 format!("{}", name)
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
216 } else {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
217 format!("{} as {}", name, asname)
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
218 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
219 } else if is_instance(&ast, &num_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
220 let n = ast.getattr(py, "n").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
221 format!("{}", n)
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
222 } else if is_instance(&ast, &str_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
223 let s = ast.getattr(py, "s").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
224 format!("\"{}\"", s)
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
225 } else if is_instance(&ast, &add_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
226 format!("+")
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
227 } else if is_instance(&ast, &mult_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
228 format!("*")
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
229 } else if is_instance(&ast, &eq_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
230 format!("==")
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
231 } else if is_instance(&ast, &lt_type) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
232 format!("<")
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
233 } else {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
234 format!("unknown {}", ast)
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
235 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
236 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
237
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
238 #[allow(dead_code)]
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
239 pub fn dump_module(module: &PyObject) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
240 let gil = Python::acquire_gil();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
241 let py = gil.python();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
242
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
243 let builtins_module = py.import("builtins").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
244 let isinstance = builtins_module.get(py, "isinstance").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
245
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
246 let ast_module = py.import("ast").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
247 let module_type = ast_module.get(py, "Module").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
248
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
249 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
250
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
251 let body = module.getattr(py, "body").unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
252 for statement in body.iter(py).unwrap() {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
253 println!("{}", dump(py, 0, statement.unwrap()));
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
254 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
255 }