aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/actions/CommandLineItem.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/actions/CustomCommandLine.java84
-rw-r--r--src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCache.java4
-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.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/OneVersionCheckActionBuilder.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/util/Fingerprint.java8
10 files changed, 90 insertions, 56 deletions
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
index f1418d9c10..6564a5b97d 100644
--- 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
@@ -13,15 +13,19 @@
// limitations under the License.
package com.google.devtools.build.lib.analysis.actions;
+import java.util.function.Consumer;
+
/** 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;
+ MapFn<Object> DEFAULT =
+ (Object object, Consumer<String> args) ->
+ args.accept(CommandLineItem.expandToCommandLine(object));
- String expandToCommandLine(T object);
+ void expandToCommandLine(T object, Consumer<String> args);
}
/**
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 eb0c1c72c4..a772b3ad9f 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
@@ -22,7 +22,6 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Interner;
import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
import com.google.devtools.build.lib.actions.ActionKeyContext;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.Artifact.ArtifactExpander;
@@ -45,6 +44,7 @@ import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.UUID;
+import java.util.function.Consumer;
import javax.annotation.Nullable;
/** A customizable, serializable class for building memory efficient command lines. */
@@ -308,6 +308,9 @@ public final class CustomCommandLine extends CommandLine {
}
vectorArgFragment = VectorArgFragment.interner.intern(vectorArgFragment);
arguments.add(vectorArgFragment);
+ if (vectorArgFragment.hasMapEach) {
+ arguments.add(mapFn);
+ }
if (vectorArgFragment.isNestedSet) {
arguments.add(values);
} else {
@@ -315,9 +318,6 @@ public final class CustomCommandLine extends CommandLine {
arguments.add(vectorArg.count);
Iterables.addAll(arguments, values);
}
- if (vectorArgFragment.hasMapEach) {
- arguments.add(mapFn);
- }
if (vectorArgFragment.hasFormatEach) {
arguments.add(vectorArg.formatEach);
}
@@ -360,26 +360,38 @@ public final class CustomCommandLine extends CommandLine {
@SuppressWarnings("unchecked")
@Override
public int eval(List<Object> arguments, int argi, ImmutableList.Builder<String> builder) {
- final List<Object> mutatedValues;
- final int count;
+ final List<String> mutatedValues;
+ CommandLineItem.MapFn<Object> mapFn =
+ hasMapEach ? (CommandLineItem.MapFn<Object>) arguments.get(argi++) : null;
if (isNestedSet) {
- Iterable<Object> values = (Iterable<Object>) arguments.get(argi++);
- mutatedValues = Lists.newArrayList(values);
- count = mutatedValues.size();
+ NestedSet<Object> values = (NestedSet<Object>) arguments.get(argi++);
+ Collection<Object> collection = values.toCollection();
+ mutatedValues = new ArrayList<>(collection.size());
+ if (mapFn != null) {
+ Consumer<String> args = mutatedValues::add; // Hoist out of loop to reduce GC
+ for (Object object : collection) {
+ mapFn.expandToCommandLine(object, args);
+ }
+ } else {
+ for (Object object : collection) {
+ mutatedValues.add(CommandLineItem.expandToCommandLine(object));
+ }
+ }
} else {
- count = (Integer) arguments.get(argi++);
+ int count = (Integer) arguments.get(argi++);
mutatedValues = new ArrayList<>(count);
- for (int i = 0; i < count; ++i) {
- mutatedValues.add(arguments.get(argi++));
+ if (mapFn != null) {
+ Consumer<String> args = mutatedValues::add; // Hoist out of loop to reduce GC
+ for (int i = 0; i < count; ++i) {
+ mapFn.expandToCommandLine(arguments.get(argi++), args);
+ }
+ } else {
+ for (int i = 0; i < count; ++i) {
+ mutatedValues.add(CommandLineItem.expandToCommandLine(arguments.get(argi++)));
+ }
}
}
- CommandLineItem.MapFn<Object> mapFn =
- hasMapEach
- ? (CommandLineItem.MapFn<Object>) arguments.get(argi++)
- : CommandLineItem.MapFn.DEFAULT;
- for (int i = 0; i < count; ++i) {
- mutatedValues.set(i, mapFn.expandToCommandLine(mutatedValues.get(i)));
- }
+ final int count = mutatedValues.size();
if (hasFormatEach) {
String formatStr = (String) arguments.get(argi++);
for (int i = 0; i < count; ++i) {
@@ -390,14 +402,14 @@ public final class CustomCommandLine extends CommandLine {
String beforeEach = (String) arguments.get(argi++);
for (int i = 0; i < count; ++i) {
builder.add(beforeEach);
- builder.add((String) mutatedValues.get(i));
+ builder.add(mutatedValues.get(i));
}
} else if (hasJoinWith) {
String joinWith = (String) arguments.get(argi++);
builder.add(Joiner.on(joinWith).join(mutatedValues));
} else {
for (int i = 0; i < count; ++i) {
- builder.add((String) mutatedValues.get(i));
+ builder.add(mutatedValues.get(i));
}
}
return argi;
@@ -410,25 +422,25 @@ public final class CustomCommandLine extends CommandLine {
int argi,
ActionKeyContext actionKeyContext,
Fingerprint fingerprint) {
+ CommandLineItem.MapFn<Object> mapFn =
+ hasMapEach ? (CommandLineItem.MapFn<Object>) arguments.get(argi++) : null;
if (isNestedSet) {
NestedSet<Object> values = (NestedSet<Object>) arguments.get(argi++);
- CommandLineItem.MapFn<Object> mapFn =
- hasMapEach
- ? (CommandLineItem.MapFn<Object>) arguments.get(argi++)
- : CommandLineItem.MapFn.DEFAULT;
- actionKeyContext.addNestedSetToFingerprint(mapFn, fingerprint, values);
+ if (mapFn != null) {
+ actionKeyContext.addNestedSetToFingerprint(mapFn, fingerprint, values);
+ } else {
+ actionKeyContext.addNestedSetToFingerprint(fingerprint, values);
+ }
} else {
int count = (Integer) arguments.get(argi++);
- CommandLineItem.MapFn<Object> mapFn =
- hasMapEach
- ? (CommandLineItem.MapFn<Object>)
- arguments.get(argi + count) // Peek ahead to mapFn
- : CommandLineItem.MapFn.DEFAULT;
- for (int i = 0; i < count; ++i) {
- fingerprint.addString(mapFn.expandToCommandLine(arguments.get(argi++)));
- }
- if (hasMapEach) {
- ++argi; // Consume mapFn
+ if (mapFn != null) {
+ for (int i = 0; i < count; ++i) {
+ mapFn.expandToCommandLine(arguments.get(argi++), fingerprint);
+ }
+ } else {
+ for (int i = 0; i < count; ++i) {
+ fingerprint.addString(CommandLineItem.expandToCommandLine(arguments.get(argi++)));
+ }
}
}
if (hasFormatEach) {
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 083ef06269..cd23964909 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
@@ -60,7 +60,7 @@ public class NestedSetFingerprintCache {
private <T> void addNestedSetToFingerprintSlow(
MapFn<? super T> mapFn, Fingerprint fingerprint, NestedSet<T> nestedSet) {
for (T object : nestedSet) {
- fingerprint.addString(mapFn.expandToCommandLine(object));
+ mapFn.expandToCommandLine(object, fingerprint);
}
}
@@ -92,7 +92,7 @@ public class NestedSetFingerprintCache {
@VisibleForTesting
<T> void addToFingerprint(
CommandLineItem.MapFn<? super T> mapFn, Fingerprint fingerprint, T object) {
- fingerprint.addString(mapFn.expandToCommandLine(object));
+ mapFn.expandToCommandLine(object, fingerprint);
}
private static Map<CommandLineItem.MapFn<?>, DigestMap> createMap() {
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 71612341af..e8199ba4e6 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
@@ -167,8 +167,7 @@ public class AndroidResourceMergingActionBuilder {
NestedSetBuilder<Artifact> inputs = createInputsForBuilder(builder);
Preconditions.checkNotNull(primary);
- builder.add(
- "--primaryData", RESOURCE_CONTAINER_TO_ARG_FOR_COMPILED.expandToCommandLine(primary));
+ builder.add("--primaryData", RESOURCE_CONTAINER_TO_ARG_FOR_COMPILED.map(primary));
inputs.addAll(primary.getArtifacts());
inputs.add(primary.getCompiledSymbols());
@@ -204,7 +203,7 @@ public class AndroidResourceMergingActionBuilder {
NestedSetBuilder<Artifact> inputs = createInputsForBuilder(builder);
Preconditions.checkNotNull(primary);
- builder.add("--primaryData", RESOURCE_CONTAINER_TO_ARG.expandToCommandLine(primary));
+ builder.add("--primaryData", RESOURCE_CONTAINER_TO_ARG.map(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 2f97a4b2a5..a79a9ba0c1 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
@@ -442,7 +442,7 @@ public class AndroidResourcesProcessorBuilder {
List<Artifact> outs, NestedSetBuilder<Artifact> inputs, Builder builder) {
// Add data
- builder.add("--primaryData", RESOURCE_CONTAINER_TO_ARG.expandToCommandLine(primary));
+ builder.add("--primaryData", RESOURCE_CONTAINER_TO_ARG.map(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 e653fb6015..077b15fe8e 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
@@ -29,6 +29,7 @@ import com.google.devtools.build.lib.rules.android.ResourceContainer.ResourceTyp
import com.google.devtools.build.lib.rules.android.ResourceContainerConverter.ToArg.Includes;
import java.util.HashSet;
import java.util.Set;
+import java.util.function.Consumer;
/**
* Factory for functions to convert a {@link ResourceContainer} to a commandline argument, or a
@@ -91,7 +92,11 @@ public class ResourceContainerConverter {
}
@Override
- public String expandToCommandLine(ResourceContainer container) {
+ public void expandToCommandLine(ResourceContainer container, Consumer<String> args) {
+ args.accept(map(container));
+ }
+
+ String map(ResourceContainer container) {
ImmutableList.Builder<String> cmdPieces = ImmutableList.builder();
if (includes.contains(Includes.ResourceRoots)) {
cmdPieces.add(convertRoots(container, ResourceType.RESOURCES));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/OneVersionCheckActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/OneVersionCheckActionBuilder.java
index 3595728475..4a24106972 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/OneVersionCheckActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/OneVersionCheckActionBuilder.java
@@ -27,6 +27,7 @@ import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.rules.java.JavaConfiguration.OneVersionEnforcementLevel;
+import java.util.function.Consumer;
/** Utility for generating a call to the one-version binary. */
public final class OneVersionCheckActionBuilder {
@@ -110,12 +111,12 @@ public final class OneVersionCheckActionBuilder {
return outputArtifact;
}
- public static VectorArg<String> jarAndTargetVectorArg(NestedSet<Artifact> jarsToCheck) {
- return VectorArg.of(jarsToCheck).mapped(OneVersionCheckActionBuilder::jarAndTargetArg);
+ static VectorArg<String> jarAndTargetVectorArg(NestedSet<Artifact> jarsToCheck) {
+ return VectorArg.of(jarsToCheck).mapped(OneVersionCheckActionBuilder::expandToJarAndTarget);
}
- private static String jarAndTargetArg(Artifact jar) {
- return jar.getExecPathString() + "," + getArtifactOwnerGeneralizedLabel(jar);
+ private static void expandToJarAndTarget(Artifact jar, Consumer<String> args) {
+ args.accept(jar.getExecPathString() + "," + getArtifactOwnerGeneralizedLabel(jar));
}
private static String getArtifactOwnerGeneralizedLabel(Artifact artifact) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java
index 29470d125f..0b819fc311 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java
@@ -30,6 +30,7 @@ import com.google.devtools.build.lib.analysis.actions.ParamFileInfo;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import java.util.function.Consumer;
/**
* Helper class to create singlejar actions - singlejar can merge multiple zip files without
@@ -175,13 +176,13 @@ public final class SingleJarActionBuilder {
}
@Override
- public String expandToCommandLine(Artifact resource) {
+ public void expandToCommandLine(Artifact resource, Consumer<String> args) {
String execPath = resource.getExecPathString();
String resourcePath =
semantics.getDefaultJavaResourcePath(resource.getRootRelativePath()).getPathString();
StringBuilder sb = new StringBuilder(execPath.length() + resourcePath.length() + 1);
sb.append(execPath).append(":").append(resourcePath);
- return sb.toString();
+ args.accept(sb.toString());
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java
index 849265738e..8b496160ce 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java
@@ -49,6 +49,7 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.function.Consumer;
import javax.annotation.Nullable;
/** Constructs actions to run the protocol compiler to generate sources from .proto files. */
@@ -578,14 +579,15 @@ public class ProtoCompileActionBuilder {
@Nullable NestedSet<Artifact> protosInDirectDependencies,
NestedSet<Artifact> transitiveImports) {
commandLine.addAll(
- VectorArg.of(transitiveImports).mapped(ProtoCompileActionBuilder::transitiveImportArg));
+ VectorArg.of(transitiveImports)
+ .mapped(ProtoCompileActionBuilder::expandTransitiveImportArg));
if (protosInDirectDependencies != null) {
if (!protosInDirectDependencies.isEmpty()) {
commandLine.addAll(
"--direct_dependencies",
VectorArg.join(":")
.each(protosInDirectDependencies)
- .mapped(ProtoCompileActionBuilder::getPathIgnoringRepository));
+ .mapped(ProtoCompileActionBuilder::expandToPathIgnoringRepository));
} else {
// The proto compiler requires an empty list to turn on strict deps checking
commandLine.add("--direct_dependencies=");
@@ -593,8 +595,12 @@ public class ProtoCompileActionBuilder {
}
}
- private static String transitiveImportArg(Artifact artifact) {
- return "-I" + getPathIgnoringRepository(artifact) + "=" + artifact.getExecPathString();
+ private static void expandTransitiveImportArg(Artifact artifact, Consumer<String> args) {
+ args.accept("-I" + getPathIgnoringRepository(artifact) + "=" + artifact.getExecPathString());
+ }
+
+ private static void expandToPathIgnoringRepository(Artifact artifact, Consumer<String> args) {
+ args.accept(getPathIgnoringRepository(artifact));
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/util/Fingerprint.java b/src/main/java/com/google/devtools/build/lib/util/Fingerprint.java
index ddb71b4aaf..a2bafa6f6a 100644
--- a/src/main/java/com/google/devtools/build/lib/util/Fingerprint.java
+++ b/src/main/java/com/google/devtools/build/lib/util/Fingerprint.java
@@ -26,6 +26,7 @@ import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import java.util.UUID;
+import java.util.function.Consumer;
import javax.annotation.Nullable;
/**
@@ -33,7 +34,7 @@ import javax.annotation.Nullable;
*
* @see java.security.MessageDigest
*/
-public final class Fingerprint {
+public final class Fingerprint implements Consumer<String> {
private static final MessageDigest MD5_PROTOTYPE;
private static final boolean MD5_PROTOTYPE_SUPPORTS_CLONE;
@@ -299,4 +300,9 @@ public final class Fingerprint {
public static String md5Digest(String input) {
return hexDigest(cloneOrCreateMd5().digest(input.getBytes(StandardCharsets.UTF_8)));
}
+
+ @Override
+ public void accept(String s) {
+ addString(s);
+ }
}