aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java
diff options
context:
space:
mode:
authorGravatar Laurent Le Brun <laurentlb@google.com>2015-05-08 14:47:26 +0000
committerGravatar Han-Wen Nienhuys <hanwen@google.com>2015-05-08 17:01:16 +0000
commite3f4ed7e67c9effb30fcf554fa97026857e394fa (patch)
tree1fb0802139281877086b57edf8d11e09c3de6660 /src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java
parent5821646f64394747e8fa68733f362147931e9037 (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.java56
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: {