1.1 --- a/micropython/inspect.py Tue Oct 08 20:54:09 2013 +0200
1.2 +++ b/micropython/inspect.py Tue Oct 08 22:44:44 2013 +0200
1.3 @@ -224,17 +224,26 @@
1.4 # Module import declarations.
1.5
1.6 elif isinstance(n, compiler.ast.From):
1.7 - modname = self.get_module_name(n)
1.8 + modname, names = self.get_module_name(n)
1.9 +
1.10 + # Perform whole module relative imports.
1.11
1.12 - # Load the mentioned module.
1.13 + if not modname:
1.14 + for name, alias in names:
1.15 + self.record_import(name, n)
1.16
1.17 - self.record_import(modname, n)
1.18 + # Otherwise, perform normal "from" imports.
1.19
1.20 - # Speculatively load modules for names beneath the module.
1.21 + else:
1.22 + # Load the mentioned module.
1.23 +
1.24 + self.record_import(modname, n)
1.25
1.26 - for name, alias in n.names:
1.27 - subname = modname + "." + name
1.28 - self.record_import(subname, n)
1.29 + # Speculatively load modules for names beneath the module.
1.30 +
1.31 + for name, alias in n.names:
1.32 + subname = modname + "." + name
1.33 + self.record_import(subname, n)
1.34
1.35 elif isinstance(n, compiler.ast.Import):
1.36
1.37 @@ -256,19 +265,23 @@
1.38 def get_module_name(self, node):
1.39
1.40 """
1.41 - Return the module name from the given 'node', calculated using any
1.42 - relative import information.
1.43 + Using the given From 'node', calculate any relative import information,
1.44 + returning a tuple containing a module to import along with any names to
1.45 + import based on the node's name information.
1.46 +
1.47 + Where the returned module is given as None, whole module imports should
1.48 + be performed for the returned modules using the returned names.
1.49 """
1.50
1.51 # Absolute import.
1.52
1.53 if node.level == 0:
1.54 - return node.modname
1.55 + return node.modname, node.names
1.56
1.57 # Relative to this module.
1.58
1.59 elif node.level == 1:
1.60 - return "%s.%s" % (self.full_name(), node.modname)
1.61 + basename = self.full_name()
1.62
1.63 # Relative to an ancestor of this module.
1.64
1.65 @@ -276,8 +289,17 @@
1.66 path = self.full_name().split(".")
1.67 if node.level > len(path):
1.68 raise InspectError("Relative import %r involves too many levels up from module %r" % (("." * node.level + node.modname), self.full_name()))
1.69 - else:
1.70 - return "%s.%s" % (".".join(path[:-node.level+1]), node.modname)
1.71 + basename = ".".join(path[:-node.level+1])
1.72 +
1.73 + # Name imports from a module.
1.74 +
1.75 + if node.modname:
1.76 + return "%s.%s" % (basename, node.modname), node.names
1.77 +
1.78 + # Relative whole module imports.
1.79 +
1.80 + else:
1.81 + return None, [("%s.%s" % (basename, name), alias) for name, alias in node.names]
1.82
1.83 def get_module_paths(self, name):
1.84
1.85 @@ -1152,7 +1174,11 @@
1.86 self.resume_broken_branches()
1.87
1.88 def visitFrom(self, node):
1.89 - modname = self.get_module_name(node)
1.90 + modname, names = self.get_module_name(node)
1.91 +
1.92 + if not modname:
1.93 + return self._visitImport(names)
1.94 +
1.95 module = self.complete_import(modname, True)
1.96
1.97 for name, alias in node.names:
1.98 @@ -1259,7 +1285,10 @@
1.99 return make_instance() # either outcome is possible
1.100
1.101 def visitImport(self, node):
1.102 - for name, alias in node.names:
1.103 + self._visitImport(node.names)
1.104 +
1.105 + def _visitImport(self, names):
1.106 + for name, alias in names:
1.107 module = self.complete_import(name, alias)
1.108 if alias is not None:
1.109 self.store(alias, module or UnresolvedName(None, name, self))
2.1 --- a/tests/relative/subpackage/__init__.py Tue Oct 08 20:54:09 2013 +0200
2.2 +++ b/tests/relative/subpackage/__init__.py Tue Oct 08 22:44:44 2013 +0200
2.3 @@ -2,5 +2,8 @@
2.4
2.5 from ..upper import x
2.6 from .sibling import y
2.7 +from . import whole
2.8 +
2.9 +z = whole.x
2.10
2.11 # vim: tabstop=4 expandtab shiftwidth=4
4.1 --- a/tests/relative_import.py Tue Oct 08 20:54:09 2013 +0200
4.2 +++ b/tests/relative_import.py Tue Oct 08 22:44:44 2013 +0200
4.3 @@ -4,5 +4,6 @@
4.4
4.5 result_123 = relative.subpackage.x
4.6 result_456 = relative.subpackage.y
4.7 +result_789 = relative.subpackage.z
4.8
4.9 # vim: tabstop=4 expandtab shiftwidth=4