From ff762d7109c91c99dbe0b89684b736364280b3df Mon Sep 17 00:00:00 2001 From: Windel Bouwman Date: Mon, 15 Jul 2019 21:41:43 +0200 Subject: [PATCH] Address relative import with 3 dots. Closes #1052. --- parser/src/python.lalrpop | 13 +++++++++---- tests/snippets/ast_snippet.py | 10 ++++++++++ vm/src/stdlib/ast.rs | 4 ++-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/parser/src/python.lalrpop b/parser/src/python.lalrpop index 96eda5d4ef..8132ad9f3b 100644 --- a/parser/src/python.lalrpop +++ b/parser/src/python.lalrpop @@ -218,14 +218,19 @@ ImportStatement: ast::LocatedStatement = { }; ImportFromLocation: (usize, Option) = { - => { - (dots.len(), Some(name)) + => { + (dots.iter().sum(), Some(name)) }, - => { - (dots.len(), None) + => { + (dots.iter().sum(), None) }, }; +ImportDots: usize = { + "..." => 3, + "." => 1, +}; + ImportAsNames: Vec = { >> => i, "(" >> ")" => i, diff --git a/tests/snippets/ast_snippet.py b/tests/snippets/ast_snippet.py index dad767b45b..54eb1b308b 100644 --- a/tests/snippets/ast_snippet.py +++ b/tests/snippets/ast_snippet.py @@ -28,3 +28,13 @@ def foo(): assert 'Gt' in str(n.body[0].value.ops[1]) assert n.body[0].value.comparators[0].n == 4 assert n.body[0].value.comparators[1].n == 5 + + +n = ast.parse('from ... import a\n') +print(n) +i = n.body[0] +assert i.level == 3 +assert i.module is None +assert i.names[0].name == 'a' +assert i.names[0].asname is None + diff --git a/vm/src/stdlib/ast.rs b/vm/src/stdlib/ast.rs index 4ba62705dd..1fae217414 100644 --- a/vm/src/stdlib/ast.rs +++ b/vm/src/stdlib/ast.rs @@ -222,8 +222,8 @@ fn statement_to_ast( fn alias_to_ast(vm: &VirtualMachine, alias: &ast::ImportSymbol) -> PyResult { Ok(node!(vm, alias, { - symbol => vm.ctx.new_str(alias.symbol.to_string()), - alias => optional_string_to_py_obj(vm, &alias.alias) + name => vm.ctx.new_str(alias.symbol.to_string()), + asname => optional_string_to_py_obj(vm, &alias.alias) })) }