1
0
forked from VimPlug/jedi

Simplify precedence.factor_calculate.

This commit is contained in:
Dave Halter
2014-11-05 23:21:32 +01:00
parent ca70d32f23
commit fae798adfe
2 changed files with 34 additions and 39 deletions
+5
View File
@@ -197,6 +197,11 @@ class Evaluator(object):
elif pr.is_node(element, 'testlist_star_expr', 'testlist'): elif pr.is_node(element, 'testlist_star_expr', 'testlist'):
# The implicit tuple in statements. # The implicit tuple in statements.
return [iterable.Array(self, element, pr.Array.TUPLE)] return [iterable.Array(self, element, pr.Array.TUPLE)]
elif pr.is_node(element, 'not_test') or pr.is_node(element, 'factor'):
types = self.eval_element(element.children[-1])
for operator in element.children[:-1]:
types = list(precedence.factor_calculate(self, types, operator))
return types
else: else:
if element.children[0] == 'not': if element.children[0] == 'not':
left = [] left = []
+29 -39
View File
@@ -218,12 +218,9 @@ def _literals_to_types(evaluator, result):
return list(set(result)) return list(set(result))
def process_precedence_element(evaluator, precedence): def process_children(evaluator, children):
if precedence is None: #first = children[0]
return None #if isinstance(first,
else:
if isinstance(precedence, Precedence):
left_objs = process_precedence_element(evaluator, precedence.left)
operator = precedence.operator operator = precedence.operator
lazy_right = lambda: process_precedence_element(evaluator, precedence.right) lazy_right = lambda: process_precedence_element(evaluator, precedence.right)
# handle lazy evaluation of and/or here. # handle lazy evaluation of and/or here.
@@ -242,48 +239,41 @@ def process_precedence_element(evaluator, precedence):
# Otherwise continue, because of uncertainty. # Otherwise continue, because of uncertainty.
return calculate(evaluator, left_objs, precedence.operator, return calculate(evaluator, left_objs, precedence.operator,
lazy_right()) lazy_right())
else:
# normal element, no operators
return evaluator.eval_statement_element(precedence)
def calculate(evaluator, left_result, operator, right_result): def calculate(evaluator, left_result, operator, right_result):
result = [] result = []
if left_result is None and right_result: if not left_result or not right_result:
# Cases like `-1`, `1 + ~1` or `not X`. # illegal slices e.g. cause left/right_result to be None
for right in right_result: result = (left_result or []) + (right_result or [])
obj = _factor_calculate(evaluator, operator, right) result = _literals_to_types(evaluator, result)
if obj is not None:
result.append(obj)
return result
else: else:
if not left_result or not right_result: # I don't think there's a reasonable chance that a string
# illegal slices e.g. cause left/right_result to be None # operation is still correct, once we pass something like six
result = (left_result or []) + (right_result or []) # objects.
result = _literals_to_types(evaluator, result) if len(left_result) * len(right_result) > 6:
result = _literals_to_types(evaluator, left_result + right_result)
else: else:
# I don't think there's a reasonable chance that a string for left in left_result:
# operation is still correct, once we pass something like six for right in right_result:
# objects. result += _element_calculate(evaluator, left, operator, right)
if len(left_result) * len(right_result) > 6:
result = _literals_to_types(evaluator, left_result + right_result)
else:
for left in left_result:
for right in right_result:
result += _element_calculate(evaluator, left, operator, right)
return result return result
def _factor_calculate(evaluator, operator, right): def factor_calculate(evaluator, types, operator):
if _is_number(right): """
if operator == '-': Calculates `+`, `-`, `~` and `not` prefixes.
return create(evaluator, -right.obj) """
if operator == 'not': for typ in types:
value = right.py__bool__() if _is_number(typ):
if value is None: # Uncertainty. if operator == '-':
return None yield create(evaluator, -typ.obj)
return keyword_from_value(not value) if operator == 'not':
return right value = typ.py__bool__()
if value is None: # Uncertainty.
return
yield keyword_from_value(not value)
yield typ
def _is_number(obj): def _is_number(obj):