Mercurial > python-compiler.rs
diff src/ast_convert.rs @ 2:5fc7c2790d8c
Add class support.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Tue, 31 May 2016 02:31:55 +0100 |
parents | b90e49ab734b |
children | 326d7f2a94d4 |
line wrap: on
line diff
--- a/src/ast_convert.rs +++ b/src/ast_convert.rs @@ -188,6 +188,7 @@ fn parse_statement(py: Python, ast: PyOb let ast_module = py.import("ast").unwrap(); let ast_type = ast_module.get(py, "AST").unwrap(); + let class_def_type = ast_module.get(py, "ClassDef").unwrap(); let function_def_type = ast_module.get(py, "FunctionDef").unwrap(); let global_type = ast_module.get(py, "Global").unwrap(); let assign_type = ast_module.get(py, "Assign").unwrap(); @@ -212,7 +213,31 @@ fn parse_statement(py: Python, ast: PyOb }; */ - if is_instance(&ast, &function_def_type) { + if is_instance(&ast, &class_def_type) { + let name = ast.getattr(py, "name").unwrap(); + let bases = ast.getattr(py, "bases").unwrap(); + //let keywords = ast.getattr(py, "keywords").unwrap(); + let body = ast.getattr(py, "body").unwrap(); + //let decorator_list = ast.getattr(py, "decorator_list").unwrap(); + + let name = get_str(py, name); + + let mut nodes = vec!(); + for name_node in bases.iter(py).unwrap() { + let name_node = name_node.unwrap(); + let name_node = parse_expr(py, name_node); + nodes.push(name_node); + } + + let mut statements = vec!(); + for statement in body.iter(py).unwrap() { + let statement = statement.unwrap(); + let statement = parse_statement(py, statement); + statements.push(statement); + } + + Statement::ClassDef(name, nodes, statements) + } else if is_instance(&ast, &function_def_type) { let name = ast.getattr(py, "name").unwrap(); let args = ast.getattr(py, "args").unwrap(); let body = ast.getattr(py, "body").unwrap();