Mercurial > python-compiler.rs
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 |