diff options
author | Emile Anclin <emile.anclin@logilab.fr> | 2009-09-02 19:54:09 +0200 |
---|---|---|
committer | Emile Anclin <emile.anclin@logilab.fr> | 2009-09-02 19:54:09 +0200 |
commit | 930357399593b05a4db464cd2a6688dfb4618cdb (patch) | |
tree | eee4e80d20ea67cc46efe03c98a8ad37572a4b97 | |
parent | dc5837fbf93e656ec158b072fa2f9520084eb0d1 (diff) | |
download | astroid-git-930357399593b05a4db464cd2a6688dfb4618cdb.tar.gz |
[R] extend_class now extends from a list of classes...
-rw-r--r-- | nodes.py | 2 | ||||
-rw-r--r-- | scoped_nodes.py | 21 | ||||
-rw-r--r-- | utils.py | 25 |
3 files changed, 22 insertions, 26 deletions
@@ -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]) @@ -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): |