diff options
author | 2015-05-08 14:47:26 +0000 | |
---|---|---|
committer | 2015-05-08 17:01:16 +0000 | |
commit | e3f4ed7e67c9effb30fcf554fa97026857e394fa (patch) | |
tree | 1fb0802139281877086b57edf8d11e09c3de6660 /src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java | |
parent | 5821646f64394747e8fa68733f362147931e9037 (diff) |
Build language: Support 'not in' operator.
--
MOS_MIGRATED_REVID=93129861
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java | 56 |
1 files changed, 32 insertions, 24 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java index b5bf4f5160..2a0bd54d68 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java @@ -70,6 +70,33 @@ public final class BinaryOperatorExpression extends Expression { } } + private boolean evalIn(Object lval, Object rval) throws EvalException { + if (rval instanceof SkylarkList) { + for (Object obj : (SkylarkList) rval) { + if (obj.equals(lval)) { + return true; + } + } + return false; + } else if (rval instanceof Collection<?>) { + return ((Collection<?>) rval).contains(lval); + } else if (rval instanceof Map<?, ?>) { + return ((Map<?, ?>) rval).containsKey(lval); + } else if (rval instanceof SkylarkNestedSet) { + return ((SkylarkNestedSet) rval).expandedSet().contains(lval); + } else if (rval instanceof String) { + if (lval instanceof String) { + return ((String) rval).contains((String) lval); + } else { + throw new EvalException(getLocation(), + "in operator only works on strings if the left operand is also a string"); + } + } else { + throw new EvalException(getLocation(), + "in operator only works on lists, tuples, sets, dicts and strings"); + } + } + @Override Object eval(Environment env) throws EvalException, InterruptedException { Object lval = lhs.eval(env); @@ -264,30 +291,11 @@ public final class BinaryOperatorExpression extends Expression { } case IN: { - if (rval instanceof SkylarkList) { - for (Object obj : (SkylarkList) rval) { - if (obj.equals(lval)) { - return true; - } - } - return false; - } else if (rval instanceof Collection<?>) { - return ((Collection<?>) rval).contains(lval); - } else if (rval instanceof Map<?, ?>) { - return ((Map<?, ?>) rval).containsKey(lval); - } else if (rval instanceof SkylarkNestedSet) { - return ((SkylarkNestedSet) rval).expandedSet().contains(lval); - } else if (rval instanceof String) { - if (lval instanceof String) { - return ((String) rval).contains((String) lval); - } else { - throw new EvalException(getLocation(), - "in operator only works on strings if the left operand is also a string"); - } - } else { - throw new EvalException(getLocation(), - "in operator only works on lists, tuples, sets, dicts and strings"); - } + return evalIn(lval, rval); + } + + case NOT_IN: { + return !evalIn(lval, rval); } default: { |