summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--inference.py20
-rw-r--r--node_classes.py44
2 files changed, 27 insertions, 37 deletions
diff --git a/inference.py b/inference.py
index 66b0aa6d..2909113f 100644
--- a/inference.py
+++ b/inference.py
@@ -209,26 +209,6 @@ def infer_callfunc(self, context=None):
nodes.CallFunc.infer = path_wrapper(raise_if_nothing_infered(infer_callfunc))
-def do_import_module(node, modname):
- """return the ast for a module whose name is <modname> imported by <node>
- """
- # handle special case where we are on a package node importing a module
- # using the same name as the package, which may end in an infinite loop
- # on relative imports
- # XXX: no more needed ?
- mymodule = node.root()
- level = getattr(node, 'level', None) # Import as no level
- if mymodule.absolute_modname(modname, level) == mymodule.name:
- # FIXME: I don't know what to do here...
- raise InferenceError('module importing itself: %s' % modname)
- try:
- return mymodule.import_module(modname, level=level)
- except (ASTNGBuildingException, SyntaxError):
- raise InferenceError(modname)
-nodes.Import.do_import_module = do_import_module
-nodes.From.do_import_module = do_import_module
-
-
def infer_import(self, context=None, asname=True):
"""infer an Import node: return the imported module/object"""
name = context.lookupname
diff --git a/node_classes.py b/node_classes.py
index 5e2e4184..4a391f4a 100644
--- a/node_classes.py
+++ b/node_classes.py
@@ -1,5 +1,6 @@
#
-from logilab.astng import NotFoundError, NoDefault
+from logilab.astng import (ASTNGBuildingException, InferenceError,
+ NotFoundError, NoDefault)
from logilab.astng._nodes import *
from logilab.astng.lookup import LookupMixIn, LocalsDictMixIn
@@ -238,8 +239,26 @@ class ForNG(For, BlockRangeMixIn, StmtMixIn, NodeNG):
def _blockstart_toline(self):
return self.iter.tolineno
-class FromNG(From, StmtMixIn, NodeNG):
- """class representing a From node"""
+
+class FromImportMixIn(object):
+ """MixIn for From and Import Nodes"""
+
+ def do_import_module(node, modname):
+ """return the ast for a module whose name is <modname> imported by <node>
+ """
+ # handle special case where we are on a package node importing a module
+ # using the same name as the package, which may end in an infinite loop
+ # on relative imports
+ # XXX: no more needed ?
+ mymodule = node.root()
+ level = getattr(node, 'level', None) # Import as no level
+ if mymodule.absolute_modname(modname, level) == mymodule.name:
+ # FIXME: I don't know what to do here...
+ raise InferenceError('module importing itself: %s' % modname)
+ try:
+ return mymodule.import_module(modname, level=level)
+ except (ASTNGBuildingException, SyntaxError):
+ raise InferenceError(modname)
def real_name(self, asname):
"""get name from 'as' name"""
@@ -255,6 +274,10 @@ class FromNG(From, StmtMixIn, NodeNG):
raise NotFoundError(asname)
+class FromNG(From, FromImportMixIn, StmtMixIn, NodeNG):
+ """class representing a From node"""
+
+
class GenExprNG(GenExpr, LocalsDictMixIn, NodeNG):
"""class representing a GenExpr node"""
@@ -287,22 +310,9 @@ class IfExpNG(IfExp, NodeNG):
"""class representing an IfExp node"""
-class ImportNG(Import, StmtMixIn, NodeNG):
+class ImportNG(Import, FromImportMixIn, StmtMixIn, NodeNG):
"""class representing an Import node"""
- def real_name(self, asname):
- """get name from 'as' name"""
- for index in range(len(self.names)):
- name, _asname = self.names[index]
- if name == '*':
- return asname
- if not _asname:
- name = name.split('.', 1)[0]
- _asname = name
- if asname == _asname:
- return name
- raise NotFoundError(asname)
-
class IndexNG(Index, NodeNG):
"""class representing an Index node"""