comparison src/ast_convert.rs @ 53:1a815946c2e5

Implement keywords in expr::Call, and add some tests.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Sun, 12 Jun 2016 02:37:28 +0100
parents d9838e8b3ec5
children c3cc16b933d2
comparison
equal deleted inserted replaced
52:d9838e8b3ec5 53:1a815946c2e5
1 use python_ast::{Module, stmt, expr, expr_context, cmpop, boolop, operator, unaryop, arguments, arg, alias, comprehension}; 1 use python_ast::{Module, stmt, expr, expr_context, cmpop, boolop, operator, unaryop, arguments, arg, alias, comprehension, keyword};
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 5
6 fn get_str(py: Python, object: PyObject) -> String { 6 fn get_str(py: Python, object: PyObject) -> String {
164 let target = parse_expr(py, target); 164 let target = parse_expr(py, target);
165 let iter = parse_expr(py, iter); 165 let iter = parse_expr(py, iter);
166 let ifs = parse_list(py, ifs, parse_expr); 166 let ifs = parse_list(py, ifs, parse_expr);
167 167
168 comprehension {target: target, iter: iter, ifs: ifs} 168 comprehension {target: target, iter: iter, ifs: ifs}
169 }
170
171 fn parse_keyword(py: Python, ast: PyObject) -> keyword {
172 let arg = ast.getattr(py, "arg").unwrap();
173 let value = ast.getattr(py, "value").unwrap();
174
175 let arg = if arg == py.None() {
176 None
177 } else {
178 let arg = get_str(py, arg);
179 Some(arg)
180 };
181 let value = parse_expr(py, value);
182
183 keyword {arg: arg, value: value}
169 } 184 }
170 185
171 fn parse_operator(py: Python, ast: PyObject) -> operator { 186 fn parse_operator(py: Python, ast: PyObject) -> operator {
172 let builtins_module = py.import("builtins").unwrap(); 187 let builtins_module = py.import("builtins").unwrap();
173 let isinstance = builtins_module.get(py, "isinstance").unwrap(); 188 let isinstance = builtins_module.get(py, "isinstance").unwrap();
318 let args = ast.getattr(py, "args").unwrap(); 333 let args = ast.getattr(py, "args").unwrap();
319 let keywords = ast.getattr(py, "keywords").unwrap(); 334 let keywords = ast.getattr(py, "keywords").unwrap();
320 335
321 let func = parse_expr(py, func); 336 let func = parse_expr(py, func);
322 let args = parse_list(py, args, parse_expr); 337 let args = parse_list(py, args, parse_expr);
323 338 let keywords = parse_list(py, keywords, parse_keyword);
324 /* 339
325 let mut kwargs = vec!(); 340 expr::Call(Box::new(func), args, keywords)
326 for arg in keywords.iter(py).unwrap() {
327 let arg = arg.unwrap();
328 kwargs.push(parse_expr(py, arg));
329 }
330 */
331
332 expr::Call(Box::new(func), args, vec!())
333 } else if is_instance(&ast, &compare_type) { 341 } else if is_instance(&ast, &compare_type) {
334 let left = ast.getattr(py, "left").unwrap(); 342 let left = ast.getattr(py, "left").unwrap();
335 let ops = ast.getattr(py, "ops").unwrap(); 343 let ops = ast.getattr(py, "ops").unwrap();
336 let comparators = ast.getattr(py, "comparators").unwrap(); 344 let comparators = ast.getattr(py, "comparators").unwrap();
337 345