aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar tomlu <tomlu@google.com>2018-01-25 12:31:53 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-01-25 12:33:49 -0800
commit6e10efac41ea0f85130585d44df2f0565ea8d6fa (patch)
tree74363aa2b367b611d4ceba71cbcb55672d1148ca /src/main/java/com
parenteb0150b5e3b95d011e99e6f531c962831beaa109 (diff)
Add CommandLineItem interface.
This interface makes it clearer in the type system exactly how items that go into a CustomCommandLine are turned into strings. It is a preparatory change to allow command line fingerprints to be more cheaply calculated, but it is valuable in itself from a code quality standpoint. PiperOrigin-RevId: 183274022
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD8
-rw-r--r--src/main/java/com/google/devtools/build/lib/actions/ActionKeyContext.java17
-rw-r--r--src/main/java/com/google/devtools/build/lib/actions/Artifact.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/actions/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/actions/CommandLineItem.java43
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/actions/CustomCommandLine.java43
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/cmdline/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/cmdline/Label.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD2
-rw-r--r--src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCache.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainerConverter.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java12
17 files changed, 131 insertions, 71 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 82fc8d6ba6..745623bd4f 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -468,6 +468,7 @@ java_library(
],
exclude = [
"analysis/BuildInfo.java",
+ "analysis/actions/CommandLineItem.java",
"analysis/TransitiveInfoProvider.java",
"analysis/config/BuildConfigurationOptionDetails.java",
"rules/repository/CoreWorkspaceRules.java",
@@ -482,6 +483,7 @@ java_library(
deps = [
":build-request-options",
"//src/main/java/com/google/devtools/build/lib:base-util",
+ "//src/main/java/com/google/devtools/build/lib:commandline_item",
"//src/main/java/com/google/devtools/build/lib:events",
"//src/main/java/com/google/devtools/build/lib:exitcode-external",
"//src/main/java/com/google/devtools/build/lib:io",
@@ -527,6 +529,11 @@ java_library(
)
java_library(
+ name = "commandline_item",
+ srcs = ["analysis/actions/CommandLineItem.java"],
+)
+
+java_library(
name = "bazel-rules",
srcs = glob(
[
@@ -973,6 +980,7 @@ java_library(
"rules/android/test_suite_property_name.txt",
],
deps = [
+ ":commandline_item",
"//src/main/java/com/google/devtools/build/lib:build-base",
"//src/main/java/com/google/devtools/build/lib:events",
"//src/main/java/com/google/devtools/build/lib:java-compilation",
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionKeyContext.java b/src/main/java/com/google/devtools/build/lib/actions/ActionKeyContext.java
index 6ba29a7655..6378675147 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionKeyContext.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionKeyContext.java
@@ -20,22 +20,15 @@ import com.google.devtools.build.lib.util.Fingerprint;
/** Contains state that aids in action key computation via {@link AbstractAction#computeKey}. */
public class ActionKeyContext {
- private static final class ArtifactNestedSetFingerprintCache
- extends NestedSetFingerprintCache<Artifact> {
- @Override
- protected void addItemFingerprint(Fingerprint fingerprint, Artifact item) {
- fingerprint.addPath(item.getExecPath());
- }
- }
- private final ArtifactNestedSetFingerprintCache artifactNestedSetFingerprintCache =
- new ArtifactNestedSetFingerprintCache();
+ private final NestedSetFingerprintCache nestedSetFingerprintCache =
+ new NestedSetFingerprintCache();
- public void addArtifactsToFingerprint(Fingerprint fingerprint, NestedSet<Artifact> artifacts) {
- artifactNestedSetFingerprintCache.addNestedSetToFingerprint(fingerprint, artifacts);
+ public <T> void addNestedSetToFingerprint(Fingerprint fingerprint, NestedSet<T> nestedSet) {
+ nestedSetFingerprintCache.addNestedSetToFingerprint(fingerprint, nestedSet);
}
public void clear() {
- artifactNestedSetFingerprintCache.clear();
+ nestedSetFingerprintCache.clear();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
index e371ec1670..d45d16d587 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
@@ -27,6 +27,7 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Streams;
import com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType;
+import com.google.devtools.build.lib.analysis.actions.CommandLineItem;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.shell.ShellUtils;
@@ -115,7 +116,11 @@ import javax.annotation.Nullable;
+ "<a href='ctx.html#outputs'>ctx.outputs</a>."
)
public class Artifact
- implements FileType.HasFileType, ActionInput, SkylarkValue, Comparable<Object> {
+ implements FileType.HasFileType,
+ ActionInput,
+ SkylarkValue,
+ Comparable<Object>,
+ CommandLineItem {
/** Compares artifact according to their exec paths. Sorts null values first. */
@SuppressWarnings("ReferenceEquality") // "a == b" is an optimization
@@ -328,6 +333,11 @@ public class Artifact
return getExecPath().filePathForFileTypeMatcher();
}
+ @Override
+ public String expandToCommandLine() {
+ return getExecPathString();
+ }
+
/**
* Returns the artifact owner. May be null.
*/
diff --git a/src/main/java/com/google/devtools/build/lib/actions/BUILD b/src/main/java/com/google/devtools/build/lib/actions/BUILD
index 2c3f3abb0e..f936712ffb 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/actions/BUILD
@@ -17,6 +17,7 @@ java_library(
"cache/*.java",
]),
deps = [
+ "//src/main/java/com/google/devtools/build/lib:commandline_item",
"//src/main/java/com/google/devtools/build/lib:events",
"//src/main/java/com/google/devtools/build/lib:io",
"//src/main/java/com/google/devtools/build/lib:packages-internal",
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/CommandLineItem.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/CommandLineItem.java
new file mode 100644
index 0000000000..c228226e19
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/CommandLineItem.java
@@ -0,0 +1,43 @@
+// Copyright 2018 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.analysis.actions;
+
+/** An interface for an object that customizes how it is expanded into a command line. */
+public interface CommandLineItem {
+ /**
+ * A map function that allows caller customization how a type is expanded into the command line.
+ */
+ interface MapFn<T> {
+ MapFn<Object> DEFAULT = CommandLineItem::expandToCommandLine;
+
+ String expandToCommandLine(T object);
+ }
+
+ /** Expands the object into the command line as a string. */
+ String expandToCommandLine();
+
+ /**
+ * The default method of expanding types.
+ *
+ * <p>If the object is a {@link CommandLineItem} we use its {@link
+ * CommandLineItem#expandToCommandLine} method, else we call {@link Object#toString()}.
+ */
+ static String expandToCommandLine(Object object) {
+ if (object instanceof CommandLineItem) {
+ return ((CommandLineItem) object).expandToCommandLine();
+ } else {
+ return object.toString();
+ }
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/CustomCommandLine.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/CustomCommandLine.java
index f86d5603fc..a987c99917 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/CustomCommandLine.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/CustomCommandLine.java
@@ -42,7 +42,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
-import java.util.function.Function;
import javax.annotation.Nullable;
/** A customizable, serializable class for building memory efficient command lines. */
@@ -77,10 +76,8 @@ public final class CustomCommandLine extends CommandLine {
abstract void eval(ImmutableList.Builder<String> builder);
}
- // TODO(bazel-team): CustomMultiArgv is going to be difficult to expose
- // in Skylark. Maybe we can get rid of them by refactoring JavaCompileAction. It also
- // raises immutability / serialization issues.
- /** Custom Java code producing a List of String arguments. */
+ /** Deprecated. Do not use. TODO(b/64841073): Remove this */
+ @Deprecated
public abstract static class CustomMultiArgv extends StandardArgvFragment {
@Override
@@ -179,17 +176,17 @@ public final class CustomCommandLine extends CommandLine {
}
/** Each argument is mapped using the supplied map function */
- public MappedVectorArg<T> mapped(Function<T, String> mapFn) {
+ public MappedVectorArg<T> mapped(CommandLineItem.MapFn<T> mapFn) {
return new MappedVectorArg<>(this, mapFn);
}
}
/** A vector arg that maps some type T to strings. */
- public static class MappedVectorArg<T> extends VectorArg<String> {
+ static class MappedVectorArg<T> extends VectorArg<String> {
private final Iterable<T> values;
- private final Function<T, String> mapFn;
+ private final CommandLineItem.MapFn<T> mapFn;
- private MappedVectorArg(SimpleVectorArg<T> other, Function<T, String> mapFn) {
+ private MappedVectorArg(SimpleVectorArg<T> other, CommandLineItem.MapFn<T> mapFn) {
super(
other.isNestedSet,
other.isEmpty,
@@ -263,7 +260,7 @@ public final class CustomCommandLine extends CommandLine {
@SuppressWarnings("unchecked")
private static void push(List<Object> arguments, VectorArg<?> vectorArg) {
final Iterable<?> values;
- final Function<?, String> mapFn;
+ final CommandLineItem.MapFn<?> mapFn;
if (vectorArg instanceof SimpleVectorArg) {
values = ((SimpleVectorArg) vectorArg).values;
mapFn = null;
@@ -342,14 +339,12 @@ public final class CustomCommandLine extends CommandLine {
mutatedValues.add(arguments.get(argi++));
}
}
- if (hasMapEach) {
- Function<Object, String> mapFn = (Function<Object, String>) arguments.get(argi++);
- for (int i = 0; i < count; ++i) {
- mutatedValues.set(i, mapFn.apply(mutatedValues.get(i)));
- }
- }
+ CommandLineItem.MapFn<Object> mapFn =
+ hasMapEach
+ ? (CommandLineItem.MapFn<Object>) arguments.get(argi++)
+ : CommandLineItem.MapFn.DEFAULT;
for (int i = 0; i < count; ++i) {
- mutatedValues.set(i, valueToString(mutatedValues.get(i)));
+ mutatedValues.set(i, mapFn.expandToCommandLine(mutatedValues.get(i)));
}
if (hasFormatEach) {
String formatStr = (String) arguments.get(argi++);
@@ -413,7 +408,7 @@ public final class CustomCommandLine extends CommandLine {
String formatStr = (String) arguments.get(argi++);
Object[] args = new Object[argCount];
for (int i = 0; i < argCount; ++i) {
- args[i] = valueToString(arguments.get(argi++));
+ args[i] = CommandLineItem.expandToCommandLine(arguments.get(argi++));
}
builder.add(String.format(formatStr, args));
return argi;
@@ -433,7 +428,7 @@ public final class CustomCommandLine extends CommandLine {
public int eval(List<Object> arguments, int argi, ImmutableList.Builder<String> builder) {
String before = (String) arguments.get(argi++);
Object arg = arguments.get(argi++);
- builder.add(before + valueToString(arg));
+ builder.add(before + CommandLineItem.expandToCommandLine(arg));
return argi;
}
}
@@ -1074,7 +1069,7 @@ public final class CustomCommandLine extends CommandLine {
i = ((ArgvFragment) substitutedArg).eval(arguments, i, builder);
}
} else {
- builder.add(valueToString(substitutedArg));
+ builder.add(CommandLineItem.expandToCommandLine(substitutedArg));
}
}
return builder.build();
@@ -1082,7 +1077,7 @@ public final class CustomCommandLine extends CommandLine {
private void evalSimpleVectorArg(Iterable<?> arg, ImmutableList.Builder<String> builder) {
for (Object value : arg) {
- builder.add(valueToString(value));
+ builder.add(CommandLineItem.expandToCommandLine(value));
}
}
@@ -1101,10 +1096,4 @@ public final class CustomCommandLine extends CommandLine {
return arg;
}
}
-
- private static String valueToString(Object value) {
- return value instanceof Artifact
- ? ((Artifact) value).getExecPath().getPathString()
- : value.toString();
- }
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java
index 7c9d5e249e..e67ff39f09 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java
@@ -19,9 +19,9 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Interner;
import com.google.common.collect.Lists;
-import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.CommandLineExpansionException;
import com.google.devtools.build.lib.analysis.actions.CommandLine;
+import com.google.devtools.build.lib.analysis.actions.CommandLineItem;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.concurrent.BlazeInterners;
import com.google.devtools.build.lib.events.EventHandler;
@@ -148,7 +148,7 @@ class SkylarkCustomCommandLine extends CommandLine {
mutatedValues.addAll(resultAsList);
}
for (int i = 0; i < count; ++i) {
- mutatedValues.set(i, valueToString(mutatedValues.get(i)));
+ mutatedValues.set(i, CommandLineItem.expandToCommandLine(mutatedValues.get(i)));
}
if (hasFormat) {
String formatStr = (String) arguments.get(argi++);
@@ -291,7 +291,7 @@ class SkylarkCustomCommandLine extends CommandLine {
BaseFunction mapFn = (BaseFunction) arguments.get(argi++);
object = applyMapFn(mapFn, object, location, skylarkSemantics, eventHandler);
}
- object = valueToString(object);
+ object = CommandLineItem.expandToCommandLine(object);
if (hasFormat) {
String formatStr = (String) arguments.get(argi++);
Formatter formatter = new Formatter(formatStr, location);
@@ -390,20 +390,12 @@ class SkylarkCustomCommandLine extends CommandLine {
} else if (arg instanceof ScalarArg) {
argi = ((ScalarArg) arg).eval(arguments, argi, result, skylarkSemantics, eventHandler);
} else {
- result.add(valueToString(arg));
+ result.add(CommandLineItem.expandToCommandLine(arg));
}
}
return result.build();
}
- private static String valueToString(Object value) {
- if (value instanceof Artifact) {
- Artifact artifact = (Artifact) value;
- return artifact.getExecPath().getPathString();
- }
- return value.toString();
- }
-
private static class Formatter {
private final String formatStr;
@Nullable private final Location location;
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD
index 2883d4277a..5ce3b757be 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD
@@ -18,6 +18,7 @@ java_library(
visibility = ["//src:__subpackages__"],
deps = [
"//src/main/java/com/google/devtools/build/lib:base-util",
+ "//src/main/java/com/google/devtools/build/lib:commandline_item",
"//src/main/java/com/google/devtools/build/lib:skylarkinterface",
"//src/main/java/com/google/devtools/build/lib:util",
"//src/main/java/com/google/devtools/build/lib/concurrent",
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
index 47a7d7bc17..2fbb2a4217 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
@@ -17,6 +17,7 @@ import com.google.common.base.Preconditions;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Interner;
+import com.google.devtools.build.lib.analysis.actions.CommandLineItem;
import com.google.devtools.build.lib.cmdline.LabelValidator.BadLabelException;
import com.google.devtools.build.lib.concurrent.BlazeInterners;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
@@ -53,7 +54,8 @@ import javax.annotation.Nullable;
)
@Immutable
@ThreadSafe
-public final class Label implements Comparable<Label>, Serializable, SkylarkValue, SkyKey {
+public final class Label
+ implements Comparable<Label>, Serializable, SkylarkValue, SkyKey, CommandLineItem {
public static final PathFragment EXTERNAL_PACKAGE_NAME = PathFragment.create("external");
public static final PathFragment WORKSPACE_FILE_NAME = PathFragment.create("WORKSPACE");
public static final String DEFAULT_REPOSITORY_DIRECTORY = "__main__";
@@ -573,6 +575,11 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkValu
printer.append(getCanonicalForm());
}
+ @Override
+ public String expandToCommandLine() {
+ return getCanonicalForm();
+ }
+
/**
* Specialization of {@link Arrays#hashCode()} that does not require constructing a 2-element
* array.
diff --git a/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD b/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD
index 4de005985c..8e3b861b9d 100644
--- a/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD
@@ -40,6 +40,8 @@ java_library(
srcs = ["NestedSetFingerprintCache.java"],
deps = [
":nestedset",
+ "//src/main/java/com/google/devtools/build/lib:commandline_item",
"//src/main/java/com/google/devtools/build/lib:util",
+ "//third_party:guava",
],
)
diff --git a/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCache.java b/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCache.java
index 8e56d5548a..c19b67e0cd 100644
--- a/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCache.java
+++ b/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCache.java
@@ -14,16 +14,18 @@
package com.google.devtools.build.lib.collect.nestedset;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.devtools.build.lib.analysis.actions.CommandLineItem;
import com.google.devtools.build.lib.util.Fingerprint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/** Computes fingerprints for nested sets, reusing sub-computations from children. */
-public abstract class NestedSetFingerprintCache<T> {
+public class NestedSetFingerprintCache {
private static final byte[] EMPTY_SET_BYTES = new byte[] {};
private Map<Object, byte[]> fingerprints = createMap();
- public void addNestedSetToFingerprint(Fingerprint fingerprint, NestedSet<T> nestedSet) {
+ public <T> void addNestedSetToFingerprint(Fingerprint fingerprint, NestedSet<T> nestedSet) {
fingerprint.addInt(nestedSet.getOrder().ordinal());
Object children = nestedSet.rawChildren();
byte[] bytes = getBytes(children);
@@ -34,6 +36,7 @@ public abstract class NestedSetFingerprintCache<T> {
fingerprints = createMap();
}
+ @SuppressWarnings("unchecked")
private byte[] getBytes(Object children) {
byte[] bytes = fingerprints.get(children);
if (bytes == null) {
@@ -43,7 +46,7 @@ public abstract class NestedSetFingerprintCache<T> {
if (child instanceof Object[]) {
fingerprint.addBytes(getBytes(child));
} else {
- addItemFingerprint(fingerprint, cast(child));
+ addToFingerprint(fingerprint, child);
}
}
bytes = fingerprint.digestAndReset();
@@ -55,7 +58,7 @@ public abstract class NestedSetFingerprintCache<T> {
} else if (children != NestedSet.EMPTY_CHILDREN) {
// Single item
Fingerprint fingerprint = new Fingerprint();
- addItemFingerprint(fingerprint, cast(children));
+ addToFingerprint(fingerprint, children);
bytes = fingerprint.digestAndReset();
} else {
// Empty nested set
@@ -65,14 +68,12 @@ public abstract class NestedSetFingerprintCache<T> {
return bytes;
}
- @SuppressWarnings("unchecked")
- private T cast(Object item) {
- return (T) item;
+ @VisibleForTesting
+ <T> void addToFingerprint(Fingerprint fingerprint, T object) {
+ fingerprint.addString(CommandLineItem.expandToCommandLine(object));
}
private static Map<Object, byte[]> createMap() {
return new ConcurrentHashMap<>();
}
-
- protected abstract void addItemFingerprint(Fingerprint fingerprint, T item);
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java
index 14635e626a..6dbab850f3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java
@@ -166,7 +166,8 @@ public class AndroidResourceMergingActionBuilder {
NestedSetBuilder<Artifact> inputs = createInputsForBuilder(builder);
Preconditions.checkNotNull(primary);
- builder.add("--primaryData", RESOURCE_CONTAINER_TO_ARG_FOR_COMPILED.apply(primary));
+ builder.add(
+ "--primaryData", RESOURCE_CONTAINER_TO_ARG_FOR_COMPILED.expandToCommandLine(primary));
inputs.addAll(primary.getArtifacts());
inputs.add(primary.getCompiledSymbols());
@@ -202,7 +203,7 @@ public class AndroidResourceMergingActionBuilder {
NestedSetBuilder<Artifact> inputs = createInputsForBuilder(builder);
Preconditions.checkNotNull(primary);
- builder.add("--primaryData", RESOURCE_CONTAINER_TO_ARG.apply(primary));
+ builder.add("--primaryData", RESOURCE_CONTAINER_TO_ARG.expandToCommandLine(primary));
inputs.addAll(primary.getArtifacts());
inputs.add(primary.getSymbols());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java
index 80e80ec85e..275af451a8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java
@@ -441,7 +441,7 @@ public class AndroidResourcesProcessorBuilder {
List<Artifact> outs, NestedSetBuilder<Artifact> inputs, Builder builder) {
// Add data
- builder.add("--primaryData", RESOURCE_CONTAINER_TO_ARG.apply(primary));
+ builder.add("--primaryData", RESOURCE_CONTAINER_TO_ARG.expandToCommandLine(primary));
inputs.addAll(primary.getArtifacts());
inputs.add(primary.getManifest());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainerConverter.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainerConverter.java
index bb1ddc5510..fd9ba71a94 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainerConverter.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainerConverter.java
@@ -20,6 +20,7 @@ import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterators;
+import com.google.devtools.build.lib.analysis.actions.CommandLineItem;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine.VectorArg;
import com.google.devtools.build.lib.rules.android.ResourceContainer.ResourceType;
@@ -36,7 +37,7 @@ public class ResourceContainerConverter {
return new Builder();
}
- interface ToArg extends Function<ResourceContainer, String> {
+ interface ToArg extends CommandLineItem.MapFn<ResourceContainer> {
String listSeparator();
}
@@ -128,7 +129,7 @@ public class ResourceContainerConverter {
return new ToArg() {
@Override
- public String apply(ResourceContainer container) {
+ public String expandToCommandLine(ResourceContainer container) {
ImmutableList.Builder<String> cmdPieces = ImmutableList.builder();
if (includeResourceRoots) {
cmdPieces.add(convertRoots(container, ResourceType.RESOURCES));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java
index 284be8cd10..7f520dcaaa 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java
@@ -1081,11 +1081,11 @@ public class CppCompileAction extends AbstractAction
*/
f.addPaths(context.getDeclaredIncludeDirs());
f.addPaths(context.getDeclaredIncludeWarnDirs());
- actionKeyContext.addArtifactsToFingerprint(f, context.getDeclaredIncludeSrcs());
+ actionKeyContext.addNestedSetToFingerprint(f, context.getDeclaredIncludeSrcs());
f.addInt(0); // mark the boundary between input types
- actionKeyContext.addArtifactsToFingerprint(f, getMandatoryInputs());
+ actionKeyContext.addNestedSetToFingerprint(f, getMandatoryInputs());
f.addInt(0);
- actionKeyContext.addArtifactsToFingerprint(f, prunableInputs);
+ actionKeyContext.addNestedSetToFingerprint(f, prunableInputs);
return f.hexDigestAndReset();
}
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/BUILD b/src/main/java/com/google/devtools/build/lib/vfs/BUILD
index f6d2eb427b..5eaf3116e2 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/vfs/BUILD
@@ -19,6 +19,7 @@ java_library(
srcs = PATH_FRAGMENT_SOURCES,
deps = [
"//src/main/java/com/google/devtools/build/lib:base-util",
+ "//src/main/java/com/google/devtools/build/lib:commandline_item",
"//src/main/java/com/google/devtools/build/lib:filetype",
"//src/main/java/com/google/devtools/build/lib:os_util",
"//src/main/java/com/google/devtools/build/lib:skylarkinterface",
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
index 9db3aa3ada..572042a7d7 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
@@ -15,6 +15,7 @@ package com.google.devtools.build.lib.vfs;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.analysis.actions.CommandLineItem;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
@@ -52,7 +53,11 @@ import java.util.Set;
@javax.annotation.concurrent.Immutable
@ThreadSafe
public abstract class PathFragment
- implements Comparable<PathFragment>, Serializable, SkylarkPrintable, FileType.HasFileType {
+ implements Comparable<PathFragment>,
+ Serializable,
+ SkylarkPrintable,
+ FileType.HasFileType,
+ CommandLineItem {
private static final Helper HELPER =
OS.getCurrent() == OS.WINDOWS ? WindowsPathFragment.HELPER : UnixPathFragment.HELPER;
@@ -762,6 +767,11 @@ public abstract class PathFragment
return getBaseName();
}
+ @Override
+ public String expandToCommandLine() {
+ return getPathString();
+ }
+
private static class PathFragmentCodec implements ObjectCodec<PathFragment> {
private final ObjectCodec<String> stringCodec = StringCodecs.asciiOptimized();