forked from VimPlug/jedi
Simplify precedence.factor_calculate.
This commit is contained in:
@@ -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
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user