diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 86141bbf..f3df8469 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -513,16 +513,14 @@ class Evaluator(object): def create_context(self, base_context, node): def from_scope_node(scope_node, child_is_funcdef=None): - is_funcdef = scope_node.type == 'funcdef' - parent_context = None - parent_scope = scope_node.get_parent_scope() - if parent_scope is not None: - parent_context = from_scope_node(parent_scope, child_is_funcdef=is_funcdef) - - # TODO this whole procedure just ignores decorators if scope_node == base_node: return base_context - elif is_funcdef: + + is_funcdef = scope_node.type == 'funcdef' + parent_scope = scope_node.get_parent_scope() + parent_context = from_scope_node(parent_scope, child_is_funcdef=is_funcdef) + + if is_funcdef: if isinstance(parent_context, AnonymousInstance): return AnonymousInstanceFunctionExecution( parent_context, diff --git a/jedi/evaluate/analysis.py b/jedi/evaluate/analysis.py index d57131b5..dfbb6d97 100644 --- a/jedi/evaluate/analysis.py +++ b/jedi/evaluate/analysis.py @@ -100,9 +100,13 @@ def _check_for_setattr(instance): """ Check if there's any setattr method inside an instance. If so, return True. """ - module = instance.get_parent_until() + from jedi.evaluate.representation import ModuleContext + module = instance.get_root_context() + if not isinstance(module, ModuleContext): + return False + try: - stmts = module.used_names['setattr'] + stmts = module.module_node.used_names['setattr'] except KeyError: return False @@ -117,14 +121,10 @@ def add_attribute_error(evaluator, scope, name): # instead of an error, if that happens. if isinstance(scope, AbstractInstanceContext): typ = Warning - try: - scope.get_subscope_by_name('__getattr__') - except KeyError: - try: - scope.get_subscope_by_name('__getattribute__') - except KeyError: - if not _check_for_setattr(scope): - typ = Error + if not (scope.get_function_slot_names('__getattr__') or + scope.get_function_slot_names('__getattribute__')): + if not _check_for_setattr(scope): + typ = Error else: typ = Error diff --git a/jedi/evaluate/dynamic.py b/jedi/evaluate/dynamic.py index e2649539..2a49dab5 100644 --- a/jedi/evaluate/dynamic.py +++ b/jedi/evaluate/dynamic.py @@ -182,7 +182,7 @@ def _check_name_for_execution(evaluator, context, compare_node, name, trailer): if len(params) != 1: continue values = params[0].infer() - nodes = [value.get_node() for value in values] + nodes = [v.get_node() for v in values] if nodes == [compare_node]: # Found a decorator. module_context = context.get_root_context() diff --git a/jedi/evaluate/instance.py b/jedi/evaluate/instance.py index f857e2fe..8e8096ce 100644 --- a/jedi/evaluate/instance.py +++ b/jedi/evaluate/instance.py @@ -258,7 +258,7 @@ class BoundMethod(er.FunctionContext): def get_function_execution(self, arguments): return InstanceFunctionExecution( self._instance, - self.parent_context, + self._class_context.parent_context, self.funcdef, arguments )