From e3bb0ccc2e89cfab5c3e2be567681722f22dfb4c Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Wed, 6 Aug 2014 12:10:36 +0200 Subject: [PATCH] fix a keyword statement issue --- jedi/evaluate/flow_analysis.py | 8 ++++---- jedi/evaluate/representation.py | 11 ++++++++--- jedi/parser/__init__.py | 3 ++- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/jedi/evaluate/flow_analysis.py b/jedi/evaluate/flow_analysis.py index c3f80d43..b2d3fcbe 100644 --- a/jedi/evaluate/flow_analysis.py +++ b/jedi/evaluate/flow_analysis.py @@ -37,10 +37,10 @@ def break_check(evaluator, base_scope, element_scope): types = evaluator.eval_statement(element_scope.inputs[0]) values = set(x.py__bool__() for x in types) if len(values) == 1: - return Status.lookup_table[values.pop()] + reachable = Status.lookup_table[values.pop()] else: return UNSURE - if base_scope != element_scope.parent: - return reachable & break_check(base_scope, element_scope.parent) - return UNSURE + if base_scope != element_scope and base_scope != element_scope.parent: + return reachable & break_check(evaluator, base_scope, element_scope.parent) + return reachable diff --git a/jedi/evaluate/representation.py b/jedi/evaluate/representation.py index 8274170f..2299b91b 100644 --- a/jedi/evaluate/representation.py +++ b/jedi/evaluate/representation.py @@ -79,6 +79,10 @@ class Instance(use_metaclass(CachedMetaClass, Executed)): return actual + def py__bool__(self): + # Signalize that we don't know about the bool type. + return None + @memoize_default() def _get_method_execution(self, func): func = get_instance_el(self._evaluator, self, func, True) @@ -472,12 +476,13 @@ class FunctionExecution(Executed): types = list(docstrings.find_return_types(self._evaluator, func)) for r in self.returns: - if r is None: + # r is a KeywordStatement + if r.stmt is None: continue - check = flow_analysis.break_check(self._evaluator, self, r.parent.parent) + check = flow_analysis.break_check(self._evaluator, self, r.parent) if check is not flow_analysis.UNREACHABLE: - types += self._evaluator.eval_statement(r) + types += self._evaluator.eval_statement(r.stmt) if check is flow_analysis.REACHABLE: break return types diff --git a/jedi/parser/__init__.py b/jedi/parser/__init__.py index 7d7aecc0..e3a52b62 100644 --- a/jedi/parser/__init__.py +++ b/jedi/parser/__init__.py @@ -568,11 +568,12 @@ class Parser(object): kw_stmt = pr.KeywordStatement(tok_str, s, use_as_parent_scope, stmt) self._scope.statements.append(kw_stmt) - func.returns.append(stmt) + func.returns.append(kw_stmt) # start_pos is the one of the return statement stmt.start_pos = s except AttributeError: debug.warning('return in non-function') + stmt = None elif tok_str == 'assert': stmt, tok = self._parse_statement() if stmt is not None: