fixes a bug with magic functions of functions

This commit is contained in:
David Halter
2012-11-30 16:52:22 +01:00
parent 11fd817be8
commit 447ae46b2f
2 changed files with 12 additions and 9 deletions

View File

@@ -452,9 +452,9 @@ class Builtin(object):
return self.builtin.parser.module return self.builtin.parser.module
@property @property
def magic_function_names(self): def magic_function_scope(self):
try: try:
return self._magic_function_names return self._magic_function_scope
except AttributeError: except AttributeError:
# depth = 1 because this is not a module # depth = 1 because this is not a module
class Container(object): class Container(object):
@@ -463,11 +463,11 @@ class Builtin(object):
parser = parsing.PyFuzzyParser(source, None) parser = parsing.PyFuzzyParser(source, None)
# needed for caching (because of weakref) # needed for caching (because of weakref)
module = self.magic_func_module = parser.module module = self.magic_func_module = parser.module
module.parent = lambda: self.scope
typ = evaluate.follow_path(iter(['FunctionType']), module, module) typ = evaluate.follow_path(iter(['FunctionType']), module, module)
names = typ.pop().get_defined_names() self._magic_function_scope = s = typ.pop()
self._magic_function_names = names return s
return names
Builtin = Builtin() Builtin = Builtin()

View File

@@ -456,7 +456,10 @@ class Function(use_metaclass(CachedMetaClass, parsing.Base)):
return self._decorated_func return self._decorated_func
def get_magic_method_names(self): def get_magic_method_names(self):
return builtin.Builtin.magic_function_names return builtin.Builtin.magic_function_scope.get_defined_names()
def get_magic_method_scope(self):
return builtin.Builtin.magic_function_scope
def __getattr__(self, name): def __getattr__(self, name):
return getattr(self.base_func, name) return getattr(self.base_func, name)
@@ -1552,13 +1555,13 @@ def follow_path(path, scope, call_scope, position=None):
else: else:
# The function must not be decorated with something else. # The function must not be decorated with something else.
if scope.isinstance(Function): if scope.isinstance(Function):
result = scope.get_magic_method_names() scope = scope.get_magic_method_scope()
else: else:
# This is the typical lookup while chaining things. # This is the typical lookup while chaining things.
if filter_private_variable(scope, call_scope, current): if filter_private_variable(scope, call_scope, current):
return [] return []
result = imports.strip_imports(get_scopes_for_name(scope, current, result = imports.strip_imports(get_scopes_for_name(scope, current,
position=position)) position=position))
return follow_paths(path, set(result), call_scope, position=position) return follow_paths(path, set(result), call_scope, position=position)