comparison src/ast_convert.rs @ 1:b90e49ab734b

Factorise conversion of Python str into Rust String.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Tue, 31 May 2016 00:52:00 +0100
parents 211b0df72e64
children 5fc7c2790d8c
comparison
equal deleted inserted replaced
0:211b0df72e64 1:b90e49ab734b
1 use python_ast::{Module, Statement, Expr, BinOp}; 1 use python_ast::{Module, Statement, Expr, BinOp};
2 2
3 use cpython::{Python, PyObject}; 3 use cpython::{Python, PyObject};
4 use cpython::ObjectProtocol; //for call method 4 use cpython::ObjectProtocol; //for call method
5
6 fn get_str(py: Python, object: PyObject) -> String {
7 let pystring = object.str(py).unwrap();
8 let mut string = pystring.to_string(py).unwrap();
9 string.to_mut().to_string()
10 }
5 11
6 fn parse_expr_vec(py: Python, ast: PyObject) -> Vec<Expr> { 12 fn parse_expr_vec(py: Python, ast: PyObject) -> Vec<Expr> {
7 let builtins_module = py.import("builtins").unwrap(); 13 let builtins_module = py.import("builtins").unwrap();
8 let isinstance = builtins_module.get(py, "isinstance").unwrap(); 14 let isinstance = builtins_module.get(py, "isinstance").unwrap();
9 15
82 let alias_type = ast_module.get(py, "alias").unwrap(); 88 let alias_type = ast_module.get(py, "alias").unwrap();
83 89
84 assert!(is_instance(&ast, &ast_type)); 90 assert!(is_instance(&ast, &ast_type));
85 91
86 if is_instance(&ast, &arg_type) { 92 if is_instance(&ast, &arg_type) {
87 let arg = { 93 let arg = ast.getattr(py, "arg").unwrap();
88 let arg = ast.getattr(py, "arg").unwrap(); 94 let arg = get_str(py, arg);
89 let arg = arg.str(py).unwrap();
90 let mut arg = arg.to_string(py).unwrap();
91 arg.to_mut().to_string()
92 };
93 Expr::Name(arg) 95 Expr::Name(arg)
94 } else if is_instance(&ast, &name_type) { 96 } else if is_instance(&ast, &name_type) {
95 let id = { 97 let id = ast.getattr(py, "id").unwrap();
96 let id = ast.getattr(py, "id").unwrap(); 98 let id = get_str(py, id);
97 let id = id.str(py).unwrap();
98 let mut id = id.to_string(py).unwrap();
99 id.to_mut().to_string()
100 };
101 Expr::Name(id) 99 Expr::Name(id)
102 } else if is_instance(&ast, &name_constant_type) { 100 } else if is_instance(&ast, &name_constant_type) {
103 let value = { 101 let value = ast.getattr(py, "value").unwrap();
104 let value = ast.getattr(py, "value").unwrap(); 102 let value = get_str(py, value);
105 let value = value.str(py).unwrap();
106 let mut value = value.to_string(py).unwrap();
107 value.to_mut().to_string()
108 };
109 Expr::NameConstant(value) 103 Expr::NameConstant(value)
110 } else if is_instance(&ast, &num_type) { 104 } else if is_instance(&ast, &num_type) {
111 let n = { 105 let n = ast.getattr(py, "n").unwrap();
112 let n = ast.getattr(py, "n").unwrap(); 106 let n = get_str(py, n);
113 let n = n.str(py).unwrap();
114 let mut n = n.to_string(py).unwrap();
115 n.to_mut().to_string()
116 };
117 Expr::Num(n) 107 Expr::Num(n)
118 } else if is_instance(&ast, &str_type) { 108 } else if is_instance(&ast, &str_type) {
119 let s = { 109 let s = ast.getattr(py, "s").unwrap();
120 let s = ast.getattr(py, "s").unwrap(); 110 let s = get_str(py, s);
121 let s = s.str(py).unwrap();
122 let mut s = s.to_string(py).unwrap();
123 s.to_mut().to_string()
124 };
125 Expr::Str(s) 111 Expr::Str(s)
126 } else if is_instance(&ast, &bin_op_type) { 112 } else if is_instance(&ast, &bin_op_type) {
127 let left = ast.getattr(py, "left").unwrap(); 113 let left = ast.getattr(py, "left").unwrap();
128 let op = ast.getattr(py, "op").unwrap(); 114 let op = ast.getattr(py, "op").unwrap();
129 let right = ast.getattr(py, "right").unwrap(); 115 let right = ast.getattr(py, "right").unwrap();
149 Expr::Call(Box::new(func), arguments) 135 Expr::Call(Box::new(func), arguments)
150 } else if is_instance(&ast, &alias_type) { 136 } else if is_instance(&ast, &alias_type) {
151 let name = ast.getattr(py, "name").unwrap(); 137 let name = ast.getattr(py, "name").unwrap();
152 let asname = ast.getattr(py, "asname").unwrap(); 138 let asname = ast.getattr(py, "asname").unwrap();
153 139
154 let name = { 140 let name = get_str(py, name);
155 let name = name.str(py).unwrap(); 141 let asname = if asname == py.None() {
156 let mut name = name.to_string(py).unwrap(); 142 None
157 name.to_mut().to_string() 143 } else {
158 }; 144 Some(get_str(py, asname))
159
160 let asname = {
161 let asname = asname.str(py).unwrap();
162 let mut asname = asname.to_string(py).unwrap();
163 let asname = asname.to_mut().to_string();
164 if asname == "None" {
165 "".to_string()
166 } else {
167 asname
168 }
169 }; 145 };
170 146
171 Expr::Alias(name, asname) 147 Expr::Alias(name, asname)
172 } else if is_instance(&ast, &compare_type) { 148 } else if is_instance(&ast, &compare_type) {
173 let left = ast.getattr(py, "left").unwrap(); 149 let left = ast.getattr(py, "left").unwrap();
239 if is_instance(&ast, &function_def_type) { 215 if is_instance(&ast, &function_def_type) {
240 let name = ast.getattr(py, "name").unwrap(); 216 let name = ast.getattr(py, "name").unwrap();
241 let args = ast.getattr(py, "args").unwrap(); 217 let args = ast.getattr(py, "args").unwrap();
242 let body = ast.getattr(py, "body").unwrap(); 218 let body = ast.getattr(py, "body").unwrap();
243 219
244 let name = { 220 let name = get_str(py, name);
245 let name = name.str(py).unwrap();
246 let mut name = name.to_string(py).unwrap();
247 name.to_mut().to_string()
248 };
249
250 let args = parse_expr_vec(py, args); 221 let args = parse_expr_vec(py, args);
251 /* 222 /*
252 let mut arguments = vec!(); 223 let mut arguments = vec!();
253 for arg in args.iter(py).unwrap() { 224 for arg in args.iter(py).unwrap() {
254 let arg = parse_expr(py, arg.unwrap()); 225 let arg = parse_expr(py, arg.unwrap());
266 } else if is_instance(&ast, &global_type) { 237 } else if is_instance(&ast, &global_type) {
267 let names = ast.getattr(py, "names").unwrap(); 238 let names = ast.getattr(py, "names").unwrap();
268 239
269 let mut globals = vec!(); 240 let mut globals = vec!();
270 for name in names.iter(py).unwrap() { 241 for name in names.iter(py).unwrap() {
271 let name = { 242 let name = name.unwrap();
272 let name = name.unwrap().str(py).unwrap(); 243 let name = get_str(py, name);
273 let mut name = name.to_string(py).unwrap();
274 name.to_mut().to_string()
275 };
276 globals.push(name); 244 globals.push(name);
277 } 245 }
278 246
279 Statement::Global(globals) 247 Statement::Global(globals)
280 } else if is_instance(&ast, &if_type) { 248 } else if is_instance(&ast, &if_type) {
284 252
285 let test = parse_expr(py, test); 253 let test = parse_expr(py, test);
286 254
287 let mut statements = vec!(); 255 let mut statements = vec!();
288 for statement in body.iter(py).unwrap() { 256 for statement in body.iter(py).unwrap() {
289 let statement = parse_statement(py, statement.unwrap()); 257 let statement = statement.unwrap();
258 let statement = parse_statement(py, statement);
290 statements.push(statement); 259 statements.push(statement);
291 } 260 }
292 261
293 let mut orelse_ = vec!(); 262 let mut orelse_ = vec!();
294 for statement in orelse.iter(py).unwrap() { 263 for statement in orelse.iter(py).unwrap() {
295 let statement = parse_statement(py, statement.unwrap()); 264 let statement = statement.unwrap();
265 let statement = parse_statement(py, statement);
296 orelse_.push(statement); 266 orelse_.push(statement);
297 } 267 }
298 268
299 Statement::If(test, statements, orelse_) 269 Statement::If(test, statements, orelse_)
300 } else if is_instance(&ast, &assign_type) { 270 } else if is_instance(&ast, &assign_type) {
301 let targets = ast.getattr(py, "targets").unwrap(); 271 let targets = ast.getattr(py, "targets").unwrap();
302 let value = ast.getattr(py, "value").unwrap(); 272 let value = ast.getattr(py, "value").unwrap();
303 273
304 let mut arguments = vec!(); 274 let mut arguments = vec!();
305 for target in targets.iter(py).unwrap() { 275 for target in targets.iter(py).unwrap() {
306 let target = parse_expr(py, target.unwrap()); 276 let target = target.unwrap();
277 let target = parse_expr(py, target);
307 arguments.push(target); 278 arguments.push(target);
308 } 279 }
309 280
310 let value = parse_expr(py, value); 281 let value = parse_expr(py, value);
311 282
313 } else if is_instance(&ast, &import_from_type) { 284 } else if is_instance(&ast, &import_from_type) {
314 let module = ast.getattr(py, "module").unwrap(); 285 let module = ast.getattr(py, "module").unwrap();
315 let names = ast.getattr(py, "names").unwrap(); 286 let names = ast.getattr(py, "names").unwrap();
316 //let level = ast.getattr(py, "level").unwrap(); 287 //let level = ast.getattr(py, "level").unwrap();
317 288
318 let module = { 289 let module = get_str(py, module);
319 let module = module.str(py).unwrap();
320 let mut module = module.to_string(py).unwrap();
321 module.to_mut().to_string()
322 };
323 290
324 let mut names_ = vec!(); 291 let mut names_ = vec!();
325 for alias in names.iter(py).unwrap() { 292 for alias in names.iter(py).unwrap() {
326 let alias = alias.unwrap(); 293 let alias = alias.unwrap();
327 let alias = parse_expr(py, alias); 294 let alias = parse_expr(py, alias);