summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nodes.py2
-rw-r--r--scoped_nodes.py21
-rw-r--r--utils.py25
3 files changed, 22 insertions, 26 deletions
diff --git a/nodes.py b/nodes.py
index 500f3890..6445b556 100644
--- a/nodes.py
+++ b/nodes.py
@@ -338,7 +338,7 @@ class NodeNG:
# extend all classes instead of base Node class which is an unextendable type
# in 2.6
for cls in ALL_NODES:
- extend_class(cls, NodeNG)
+ extend_class(cls, [NodeNG])
INDENT = " "
diff --git a/scoped_nodes.py b/scoped_nodes.py
index 057ebabf..f288195a 100644
--- a/scoped_nodes.py
+++ b/scoped_nodes.py
@@ -165,14 +165,11 @@ class LocalsDictMixIn(object):
__contains__ = has_key
-extend_class(Module, LocalsDictMixIn)
-extend_class(Class, LocalsDictMixIn)
-extend_class(Function, LocalsDictMixIn)
-extend_class(Lambda, LocalsDictMixIn)
+
# GenExpr has its own locals but isn't a frame
+extend_class(GenExpr, [LocalsDictMixIn])
-extend_class(GenExpr, LocalsDictMixIn)
def frame(self):
return self.parent.frame()
GenExpr.frame = frame
@@ -352,7 +349,7 @@ class ModuleNG(object):
except AttributeError:
return [name for name in self.keys() if not name.startswith('_')]
-extend_class(Module, ModuleNG)
+extend_class(Module, [LocalsDictMixIn, ModuleNG])
# Function ###################################################################
@@ -385,12 +382,10 @@ class LambdaNG(object):
return names
-extend_class(Lambda, LambdaNG)
-extend_class(Function, LambdaNG)
-
+extend_class(Lambda, [LocalsDictMixIn, LambdaNG])
-class FunctionNG(LambdaNG):
+class FunctionNG(object):
"""/!\ this class should not be used directly /!\ it's
only used as a methods and attribute container, and update the
original class from the compiler.ast module using its dictionary
@@ -472,7 +467,7 @@ class FunctionNG(LambdaNG):
except StopIteration:
return False
-extend_class(Function, FunctionNG)
+extend_class(Function, [LocalsDictMixIn, LambdaNG, FunctionNG])
def _rec_get_names(args, names=None):
@@ -555,7 +550,7 @@ def _format_args(args, defaults=None):
values[-1] += '=' + defaults[i-default_offset].as_string()
return ', '.join(values)
-extend_class(Arguments, ArgumentsNG)
+extend_class(Arguments, [ArgumentsNG])
# Class ######################################################################
@@ -842,4 +837,4 @@ class ClassNG(object):
if not found:
raise InferenceError()
-extend_class(Class, ClassNG)
+extend_class(Class, [LocalsDictMixIn, ClassNG])
diff --git a/utils.py b/utils.py
index 664cb6d8..83ef2f89 100644
--- a/utils.py
+++ b/utils.py
@@ -24,20 +24,21 @@ __docformat__ = "restructuredtext en"
from logilab.astng._exceptions import IgnoreChild
-def extend_class(original, addons):
- """add methods and attribute defined in the addons class to the original
+def extend_class(original, class_addons):
+ """add methods and attribute defined in the addon classes to the original
class
"""
- brain = addons.__dict__.copy()
- for special_key in ('__doc__', '__module__', '__dict__'):
- if special_key in addons.__dict__:
- del brain[special_key]
- try:
- original.__dict__.update(brain)
- except AttributeError:
- # dictproxy object
- for k, v in brain.iteritems():
- setattr(original, k, v)
+ for addons in class_addons:
+ brain = addons.__dict__.copy()
+ for special_key in ('__doc__', '__module__', '__dict__'):
+ if special_key in addons.__dict__:
+ del brain[special_key]
+ try:
+ original.__dict__.update(brain)
+ except AttributeError:
+ # dictproxy object
+ for k, v in brain.iteritems():
+ setattr(original, k, v)
class ASTVisitor(object):