changeset 48:039f85b187f2

Also handle relative imports.
author Bastien Orivel <eijebong@bananium.fr>
date Tue, 07 Jun 2016 13:34:12 +0200
parents 38f59b0efc2c
children 141f1769e1f0
files src/ast_convert.rs src/ast_dump.rs src/python_ast.rs tests/test_parse_files/test_import_from.py
diffstat 4 files changed, 30 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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 {
--- a/src/python_ast.rs
+++ b/src/python_ast.rs
@@ -58,7 +58,7 @@ pub enum stmt {
     Import(Vec<alias>),
 
     // ImportFrom(identifier? module, alias* names, int? level)
-    ImportFrom(String, Vec<alias>, Option<i32>),  // TODO: check the size of level.
+    ImportFrom(String, Vec<alias>, Option<i32>),
 
     // Global(identifier* names)
     Global(Vec<String>),
--- 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