diff options
author | gregce <gregce@google.com> | 2017-05-31 21:14:41 +0200 |
---|---|---|
committer | László Csomor <laszlocsomor@google.com> | 2017-06-01 14:08:25 +0200 |
commit | 7fa955b83d86d8f03d339c58446806b6e0e51bf1 (patch) | |
tree | d1cd72008983e38ef33cec30d71b84b647dd57eb /src | |
parent | 7e0cc9e72f2e7dfbcebdbe49af74ed42d0e8f33a (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')
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( |