# HG changeset patch # User Bastien Orivel # Date 1465299252 -7200 # Node ID 039f85b187f2730eede3e1bee8c2ff4a7fe15e8a # Parent 38f59b0efc2c77a83818c8ca9927cedc89173bd3 Also handle relative imports. diff --git a/src/ast_convert.rs b/src/ast_convert.rs --- a/src/ast_convert.rs +++ b/src/ast_convert.rs @@ -545,7 +545,12 @@ fn parse_statement(py: Python, ast: PyOb let module = get_str(py, module); let names = parse_list(py, names, parse_alias); - stmt::ImportFrom(module, names, None) + if level == py.None() { + stmt::ImportFrom(module, names, None) + } else { + let level = level.extract(py).unwrap(); + stmt::ImportFrom(module, names, Some(level)) + } } else if is_instance(&ast, &import_type) { let names = ast.getattr(py, "names").unwrap(); let names = parse_list(py, names, parse_alias); diff --git a/src/ast_dump.rs b/src/ast_dump.rs --- a/src/ast_dump.rs +++ b/src/ast_dump.rs @@ -190,16 +190,28 @@ impl stmt { Some(expr) => format!(" {}", expr.to_string()), None => "".to_string() }), - stmt::ImportFrom(module, names, level) => format!("{}from {} import {}", current_indent, module.to_string(), { - let mut names_ = vec!(); - for name in names { - match name.asname { - None => names_.push(name.name), - Some(asname) => names_.push(format!("{} as {}", name.name, asname)) + stmt::ImportFrom(module, names, level) => { + format!("{}from {}{} import {}", + current_indent, + { + match level { + None => String::new(), + Some(level) => { let dots: String = iter::repeat(".").take(level as usize).collect(); dots } + } + }, + module.to_string(), + { + let mut names_ = vec!(); + for name in names { + match name.asname { + None => names_.push(name.name), + Some(asname) => names_.push(format!("{} as {}", name.name, asname)) + } + } + names_.join(", ") } - } - names_.join(", ") - }), + ) + }, stmt::Import(names) => format!("{}import {}", current_indent, { let mut names_ = vec!(); for name in names { diff --git a/src/python_ast.rs b/src/python_ast.rs --- a/src/python_ast.rs +++ b/src/python_ast.rs @@ -58,7 +58,7 @@ pub enum stmt { Import(Vec), // ImportFrom(identifier? module, alias* names, int? level) - ImportFrom(String, Vec, Option), // TODO: check the size of level. + ImportFrom(String, Vec, Option), // Global(identifier* names) Global(Vec), diff --git a/tests/test_parse_files/test_import_from.py b/tests/test_parse_files/test_import_from.py --- a/tests/test_parse_files/test_import_from.py +++ b/tests/test_parse_files/test_import_from.py @@ -1,1 +1,3 @@ from mod import func as name, func2 as name2 +from .mod import func as name, func2 as name2 +from ..mod import func as name, func2 as name2