diff --git a/jedi/evaluate/compiled/__init__.py b/jedi/evaluate/compiled/__init__.py index ff6935c3..b7686809 100644 --- a/jedi/evaluate/compiled/__init__.py +++ b/jedi/evaluate/compiled/__init__.py @@ -48,6 +48,9 @@ class CompiledObject(Base): def py__mro__(self, evaluator): return tuple(create(evaluator, cls) for cls in self.obj.__mro__) + def py__bool__(self): + return bool(self.obj) + @property def doc(self): return inspect.getdoc(self.obj) or '' diff --git a/jedi/evaluate/flow_analysis.py b/jedi/evaluate/flow_analysis.py index 403837cb..c3f80d43 100644 --- a/jedi/evaluate/flow_analysis.py +++ b/jedi/evaluate/flow_analysis.py @@ -2,8 +2,12 @@ from jedi.parser.representation import Flow class Status(object): - def __init__(self, value): + lookup_table = {} + + def __init__(self, value, name): self._value = value + self._name = name + Status.lookup_table[value] = self def __eq__(self, other): return self._value == other.value @@ -15,20 +19,27 @@ class Status(object): if UNSURE in (self, other): return other else: - return REACHABLE if self._value and other._value else NOT_REACHABLE + return REACHABLE if self._value and other._value else UNREACHABLE + + def __repr__(self): + return '<%s: %s>' % (type(self).__name__, self._name) -NOT_REACHABLE = Status(True) -REACHABLE = Status(False) -UNSURE = Status(None) +REACHABLE = Status(True, 'reachable') +UNREACHABLE = Status(False, 'unreachable') +UNSURE = Status(None, 'unsure') def break_check(evaluator, base_scope, element_scope): reachable = REACHABLE if isinstance(element_scope, Flow): if element_scope.command == 'if' and element_scope.inputs: - result = evaluator.eval_statement(element_scope.inputs[0]) - print(result) + 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()] + else: + return UNSURE if base_scope != element_scope.parent: return reachable & break_check(base_scope, element_scope.parent) diff --git a/jedi/evaluate/representation.py b/jedi/evaluate/representation.py index ef285ae7..8274170f 100644 --- a/jedi/evaluate/representation.py +++ b/jedi/evaluate/representation.py @@ -476,7 +476,7 @@ class FunctionExecution(Executed): continue check = flow_analysis.break_check(self._evaluator, self, r.parent.parent) - if check is not flow_analysis.NOT_REACHABLE: + if check is not flow_analysis.UNREACHABLE: types += self._evaluator.eval_statement(r) if check is flow_analysis.REACHABLE: break