mirror of
https://chromium.googlesource.com/chromium/tools/depot_tools.git
synced 2026-01-11 10:41:31 +00:00
Add support for multi argument ands and ors, and the same precedence with
left to right grouping Bug: 905740 Change-Id: I6a0b971556ab66bec841004fbbe8760b9136f216 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/1793775 Reviewed-by: Edward Lesmes <ehmaldonado@chromium.org> Commit-Queue: Anthony Polito <apolito@google.com>
This commit is contained in:
committed by
Commit Bot
parent
cc6f585f05
commit
2ae039a065
@@ -568,33 +568,23 @@ def EvaluateCondition(condition, variables, referenced_variables=None):
|
||||
node, ast.NameConstant): # Since Python 3.4
|
||||
return node.value
|
||||
elif isinstance(node, ast.BoolOp) and isinstance(node.op, ast.Or):
|
||||
if len(node.values) != 2:
|
||||
raise ValueError(
|
||||
'invalid "or": exactly 2 operands required (inside %r)' % (
|
||||
condition))
|
||||
left = _convert(node.values[0])
|
||||
right = _convert(node.values[1])
|
||||
if not isinstance(left, bool):
|
||||
raise ValueError(
|
||||
'invalid "or" operand %r (inside %r)' % (left, condition))
|
||||
if not isinstance(right, bool):
|
||||
raise ValueError(
|
||||
'invalid "or" operand %r (inside %r)' % (right, condition))
|
||||
return left or right
|
||||
bool_values = []
|
||||
for value in node.values:
|
||||
bool_values.append(_convert(value))
|
||||
if not isinstance(bool_values[-1], bool):
|
||||
raise ValueError(
|
||||
'invalid "or" operand %r (inside %r)' % (
|
||||
bool_values[-1], condition))
|
||||
return any(bool_values)
|
||||
elif isinstance(node, ast.BoolOp) and isinstance(node.op, ast.And):
|
||||
if len(node.values) != 2:
|
||||
raise ValueError(
|
||||
'invalid "and": exactly 2 operands required (inside %r)' % (
|
||||
condition))
|
||||
left = _convert(node.values[0])
|
||||
right = _convert(node.values[1])
|
||||
if not isinstance(left, bool):
|
||||
raise ValueError(
|
||||
'invalid "and" operand %r (inside %r)' % (left, condition))
|
||||
if not isinstance(right, bool):
|
||||
raise ValueError(
|
||||
'invalid "and" operand %r (inside %r)' % (right, condition))
|
||||
return left and right
|
||||
bool_values = []
|
||||
for value in node.values:
|
||||
bool_values.append(_convert(value))
|
||||
if not isinstance(bool_values[-1], bool):
|
||||
raise ValueError(
|
||||
'invalid "and" operand %r (inside %r)' % (
|
||||
bool_values[-1], condition))
|
||||
return all(bool_values)
|
||||
elif isinstance(node, ast.UnaryOp) and isinstance(node.op, ast.Not):
|
||||
value = _convert(node.operand)
|
||||
if not isinstance(value, bool):
|
||||
|
||||
Reference in New Issue
Block a user