aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar gregce <gregce@google.com>2017-05-31 21:14:41 +0200
committerGravatar László Csomor <laszlocsomor@google.com>2017-06-01 14:08:25 +0200
commit7fa955b83d86d8f03d339c58446806b6e0e51bf1 (patch)
treed1cd72008983e38ef33cec30d71b84b647dd57eb /src
parent7e0cc9e72f2e7dfbcebdbe49af74ed42d0e8f33a (diff)
Make SelectorList.toString() user-friendly.
This also guarantees consistency between toString() calls to lib.syntax.SelectorList and lib.packages.BuildType.SelectorList. PiperOrigin-RevId: 157617509
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/BuildType.java17
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/SelectorList.java15
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java17
3 files changed, 48 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BuildType.java b/src/main/java/com/google/devtools/build/lib/packages/BuildType.java
index 5df9d83625..6a32c68d57 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BuildType.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/BuildType.java
@@ -23,6 +23,7 @@ import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.packages.License.DistributionType;
import com.google.devtools.build.lib.packages.License.LicenseParsingException;
+import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.Printer;
import com.google.devtools.build.lib.syntax.Runtime;
import com.google.devtools.build.lib.syntax.SelectorValue;
@@ -30,7 +31,6 @@ import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.syntax.Type.ConversionException;
import com.google.devtools.build.lib.syntax.Type.DictType;
import com.google.devtools.build.lib.syntax.Type.LabelClass;
-import com.google.devtools.build.lib.syntax.Type.LabelVisitor;
import com.google.devtools.build.lib.syntax.Type.ListType;
import java.util.ArrayList;
import java.util.Collections;
@@ -520,6 +520,21 @@ public final class BuildType {
}
return keys.build();
}
+
+ @Override
+ public String toString() {
+ // Convert to a lib.syntax.SelectorList to guarantee consistency with callers that serialize
+ // directly on that type.
+ List<SelectorValue> selectorValueList = new ArrayList<>();
+ for (Selector<T> element : elements) {
+ selectorValueList.add(new SelectorValue(element.getEntries(), element.getNoMatchError()));
+ }
+ try {
+ return com.google.devtools.build.lib.syntax.SelectorList.of(selectorValueList).toString();
+ } catch (EvalException e) {
+ throw new IllegalStateException("this list should have been validated on creation");
+ }
+ }
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SelectorList.java b/src/main/java/com/google/devtools/build/lib/syntax/SelectorList.java
index 0feb423453..5e72aedcd5 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SelectorList.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SelectorList.java
@@ -17,8 +17,10 @@ import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
+import com.google.devtools.build.lib.util.Preconditions;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
/**
@@ -97,6 +99,19 @@ public final class SelectorList implements SkylarkValue {
return new SelectorList(type1, builder.build());
}
+ /**
+ * Creates a list consisting of the given selects.
+ */
+ public static SelectorList of(List<SelectorValue> selectors) throws EvalException {
+ Preconditions.checkArgument(!selectors.isEmpty());
+ Iterator<SelectorValue> it = selectors.iterator();
+ SelectorList list = SelectorList.of(it.next());
+ while (it.hasNext()) {
+ list = SelectorList.concat(null, list, it.next());
+ }
+ return list;
+ }
+
// TODO(bazel-team): match on the List interface, not the actual implementation. For now,
// we verify this is the right class through test coverage.
private static final Class<?> NATIVE_LIST_TYPE = ArrayList.class;
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
index 8eeeb23bb4..c2010d571a 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
@@ -495,6 +495,23 @@ public class SkylarkRuleContextTest extends SkylarkTestCase {
}
@Test
+ public void existingRuleWithSelect() throws Exception {
+ scratch.file(
+ "test/existing_rule.bzl",
+ "def macro():",
+ " s = select({'//foo': ['//bar']})",
+ " native.cc_library(name = 'x', srcs = s)",
+ " print(native.existing_rule('x')['srcs'])");
+ scratch.file(
+ "test/BUILD",
+ "load('//test:existing_rule.bzl', 'macro')",
+ "macro()",
+ "cc_library(name = 'a', srcs = [])");
+ getConfiguredTarget("//test:a");
+ assertContainsEvent("selector({\"//foo:foo\": [\"//bar:bar\"]})");
+ }
+
+ @Test
public void testGetRule() throws Exception {
scratch.file("test/skylark/BUILD");
scratch.file(