From 306fd5b95b146beba006e56b93a0f11525c72943 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Mon, 2 Jan 2017 23:57:59 +0100 Subject: [PATCH] Fix a recursion issue. --- jedi/evaluate/__init__.py | 10 +++++++--- test/completion/recursion.py | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 2679c635..ba0ff3e1 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -127,9 +127,15 @@ class Evaluator(object): return f.filter_name(filters) return f.find(filters, attribute_lookup=not search_global) + def eval_statement(self, context, stmt, seek_name=None): + with recursion.execution_allowed(self, stmt) as allowed: + if allowed or context.get_root_context() == self.BUILTINS: + return self._eval_stmt(context, stmt, seek_name) + return set() + #@memoize_default(default=[], evaluator_is_first_arg=True) @debug.increase_indent - def eval_statement(self, context, stmt, seek_name=None): + def _eval_stmt(self, context, stmt, seek_name=None): """ The starting point of the completion. A statement always owns a call list, which are the calls, that a statement does. In case multiple @@ -236,13 +242,11 @@ class Evaluator(object): return result else: return self._eval_element_if_evaluated(context, element) - return self._eval_element_cached(context, element) else: if predefined_if_name_dict: return self._eval_element_not_cached(context, element) else: return self._eval_element_if_evaluated(context, element) - return self._eval_element_cached(context, element) def _eval_element_if_evaluated(self, context, element): """ diff --git a/test/completion/recursion.py b/test/completion/recursion.py index 77e5b24f..a3e7670b 100644 --- a/test/completion/recursion.py +++ b/test/completion/recursion.py @@ -49,3 +49,30 @@ class FooListComp(): #? int() FooListComp().recursive[0] + + +class InstanceAttributeIfs: + def b(self): + self.a1 = 1 + self.a2 = 1 + + def c(self): + self.a2 = '' + + def x(self): + self.b() + + if self.a1 == 1: + self.a1 = self.a1 + 1 + if self.a2 == UNDEFINED: + self.a2 = self.a2 + 1 + + #? int() + self.a1 + #? int() str() + self.a2 + +#? int() +InstanceAttributeIfs().a1 +#? int() str() +InstanceAttributeIfs().a2