aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar tomlu <tomlu@google.com>2018-02-01 07:21:27 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-02-01 07:23:16 -0800
commita904b85376251775d58852a0e8480c0db032bac8 (patch)
tree83e846c6cfebee7259f093661e9313d4fc9338f8
parent5a50a7c403e567b850d5037d1ee0dad96be0b39d (diff)
Allow CustomCommandLine's mapFn to expand each object into multiple items.
This is needed to migrate JavaCompileAction away from CustomMultiArgv. PiperOrigin-RevId: 184136486
-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
-rw-r--r--src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java71
-rw-r--r--src/test/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCacheTest.java32
12 files changed, 155 insertions, 94 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);
+ }
}
diff --git a/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java b/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java
index 7e514bd37f..9e4b9389bc 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java
@@ -37,6 +37,7 @@ import com.google.devtools.build.lib.vfs.Root;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
+import java.util.function.Consumer;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -173,14 +174,14 @@ public class CustomCommandLineTest {
.inOrder();
assertThat(
builder()
- .addAll(VectorArg.of(list(foo("1"), foo("2"))).mapped(Foo::str))
+ .addAll(VectorArg.of(list(foo("1"), foo("2"))).mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("1", "2")
.inOrder();
assertThat(
builder()
- .addAll(VectorArg.of(nestedSet(foo("1"), foo("2"))).mapped(Foo::str))
+ .addAll(VectorArg.of(nestedSet(foo("1"), foo("2"))).mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("1", "2")
@@ -215,14 +216,15 @@ public class CustomCommandLineTest {
.inOrder();
assertThat(
builder()
- .addAll("--arg", VectorArg.of(list(foo("1"), foo("2"))).mapped(Foo::str))
+ .addAll("--arg", VectorArg.of(list(foo("1"), foo("2"))).mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("--arg", "1", "2")
.inOrder();
assertThat(
builder()
- .addAll("--arg", VectorArg.of(nestedSet(foo("1"), foo("2"))).mapped(Foo::str))
+ .addAll(
+ "--arg", VectorArg.of(nestedSet(foo("1"), foo("2"))).mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("--arg", "1", "2")
@@ -276,14 +278,17 @@ public class CustomCommandLineTest {
.inOrder();
assertThat(
builder()
- .addAll(VectorArg.join(":").each(list(foo("1"), foo("2"))).mapped(Foo::str))
+ .addAll(VectorArg.join(":").each(list(foo("1"), foo("2"))).mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("1:2")
.inOrder();
assertThat(
builder()
- .addAll(VectorArg.join(":").each(nestedSet(foo("1"), foo("2"))).mapped(Foo::str))
+ .addAll(
+ VectorArg.join(":")
+ .each(nestedSet(foo("1"), foo("2")))
+ .mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("1:2")
@@ -341,7 +346,8 @@ public class CustomCommandLineTest {
assertThat(
builder()
.addAll(
- "--arg", VectorArg.join(":").each(list(foo("1"), foo("2"))).mapped(Foo::str))
+ "--arg",
+ VectorArg.join(":").each(list(foo("1"), foo("2"))).mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("--arg", "1:2")
@@ -350,7 +356,9 @@ public class CustomCommandLineTest {
builder()
.addAll(
"--arg",
- VectorArg.join(":").each(nestedSet(foo("1"), foo("2"))).mapped(Foo::str))
+ VectorArg.join(":")
+ .each(nestedSet(foo("1"), foo("2")))
+ .mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("--arg", "1:2")
@@ -408,7 +416,10 @@ public class CustomCommandLineTest {
.inOrder();
assertThat(
builder()
- .addAll(VectorArg.format("-D%s").each(list(foo("1"), foo("2"))).mapped(Foo::str))
+ .addAll(
+ VectorArg.format("-D%s")
+ .each(list(foo("1"), foo("2")))
+ .mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("-D1", "-D2")
@@ -416,7 +427,9 @@ public class CustomCommandLineTest {
assertThat(
builder()
.addAll(
- VectorArg.format("-D%s").each(nestedSet(foo("1"), foo("2"))).mapped(Foo::str))
+ VectorArg.format("-D%s")
+ .each(nestedSet(foo("1"), foo("2")))
+ .mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("-D1", "-D2")
@@ -476,7 +489,9 @@ public class CustomCommandLineTest {
builder()
.addAll(
"--arg",
- VectorArg.format("-D%s").each(list(foo("1"), foo("2"))).mapped(Foo::str))
+ VectorArg.format("-D%s")
+ .each(list(foo("1"), foo("2")))
+ .mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("--arg", "-D1", "-D2")
@@ -485,7 +500,9 @@ public class CustomCommandLineTest {
builder()
.addAll(
"--arg",
- VectorArg.format("-D%s").each(nestedSet(foo("1"), foo("2"))).mapped(Foo::str))
+ VectorArg.format("-D%s")
+ .each(nestedSet(foo("1"), foo("2")))
+ .mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("--arg", "-D1", "-D2")
@@ -550,7 +567,7 @@ public class CustomCommandLineTest {
VectorArg.format("-D%s")
.join(":")
.each(list(foo("1"), foo("2")))
- .mapped(Foo::str))
+ .mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("-D1:-D2")
@@ -561,7 +578,7 @@ public class CustomCommandLineTest {
VectorArg.format("-D%s")
.join(":")
.each(nestedSet(foo("1"), foo("2")))
- .mapped(Foo::str))
+ .mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("-D1:-D2")
@@ -628,7 +645,7 @@ public class CustomCommandLineTest {
VectorArg.format("-D%s")
.join(":")
.each(list(foo("1"), foo("2")))
- .mapped(Foo::str))
+ .mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("--arg", "-D1:-D2")
@@ -640,7 +657,7 @@ public class CustomCommandLineTest {
VectorArg.format("-D%s")
.join(":")
.each(nestedSet(foo("1"), foo("2")))
- .mapped(Foo::str))
+ .mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("--arg", "-D1:-D2")
@@ -698,7 +715,10 @@ public class CustomCommandLineTest {
.inOrder();
assertThat(
builder()
- .addAll(VectorArg.addBefore("-D").each(list(foo("1"), foo("2"))).mapped(Foo::str))
+ .addAll(
+ VectorArg.addBefore("-D")
+ .each(list(foo("1"), foo("2")))
+ .mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("-D", "1", "-D", "2")
@@ -706,7 +726,9 @@ public class CustomCommandLineTest {
assertThat(
builder()
.addAll(
- VectorArg.addBefore("-D").each(nestedSet(foo("1"), foo("2"))).mapped(Foo::str))
+ VectorArg.addBefore("-D")
+ .each(nestedSet(foo("1"), foo("2")))
+ .mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("-D", "1", "-D", "2")
@@ -772,7 +794,7 @@ public class CustomCommandLineTest {
VectorArg.addBefore("-D")
.format("D%s")
.each(list(foo("1"), foo("2")))
- .mapped(Foo::str))
+ .mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("-D", "D1", "-D", "D2")
@@ -783,7 +805,7 @@ public class CustomCommandLineTest {
VectorArg.addBefore("-D")
.format("D%s")
.each(nestedSet(foo("1"), foo("2")))
- .mapped(Foo::str))
+ .mapped(Foo::expandToStr))
.build()
.arguments())
.containsExactly("-D", "D1", "-D", "D2")
@@ -915,7 +937,10 @@ public class CustomCommandLineTest {
.add(builder().addAll(VectorArg.addBefore("--foo=%s").each(values)).build())
.add(builder().addAll(VectorArg.join("--foo=%s").each(values)).build())
.add(builder().addAll(VectorArg.format("--foo=%s").each(values)).build())
- .add(builder().addAll(VectorArg.of(values).mapped(s -> s + "_mapped")).build())
+ .add(
+ builder()
+ .addAll(VectorArg.of(values).mapped((s, args) -> args.accept(s + "_mapped")))
+ .build())
.build();
// Ensure all these command lines have distinct keys
@@ -992,8 +1017,8 @@ public class CustomCommandLineTest {
this.str = str;
}
- static String str(Foo foo) {
- return foo.str;
+ static void expandToStr(Foo foo, Consumer<String> args) {
+ args.accept(foo.str);
}
}
}
diff --git a/src/test/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCacheTest.java b/src/test/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCacheTest.java
index 99bc4bbd9c..feba06b6bd 100644
--- a/src/test/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCacheTest.java
+++ b/src/test/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCacheTest.java
@@ -23,6 +23,7 @@ import com.google.devtools.build.lib.analysis.actions.CommandLineItem.CapturingM
import com.google.devtools.build.lib.analysis.actions.CommandLineItem.MapFn;
import com.google.devtools.build.lib.testutil.MoreAsserts;
import com.google.devtools.build.lib.util.Fingerprint;
+import java.util.function.Consumer;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -102,7 +103,7 @@ public class NestedSetFingerprintCacheTest {
cache.addNestedSetToFingerprint(
CommandLineItem.MapFn.DEFAULT, explicitDefaultMapFnFingerprint, a);
Fingerprint mappedFingerprint = new Fingerprint();
- cache.addNestedSetToFingerprint(s -> s + "_mapped", mappedFingerprint, a);
+ cache.addNestedSetToFingerprint((s, args) -> args.accept(s + "_mapped"), mappedFingerprint, a);
String defaultMapFnDigest = defaultMapFnFingerprint.hexDigestAndReset();
String explicitDefaultMapFnDigest = explicitDefaultMapFnFingerprint.hexDigestAndReset();
@@ -124,24 +125,25 @@ public class NestedSetFingerprintCacheTest {
// Make sure a normal method reference doesn't get blacklisted.
for (int i = 0; i < 2; ++i) {
cache.addNestedSetToFingerprint(
- NestedSetFingerprintCacheTest::simpleMapFn, new Fingerprint(), nestedSet);
+ NestedSetFingerprintCacheTest::simpleExpand, new Fingerprint(), nestedSet);
}
// Try again to make sure Java synthesizes a new class for a second method reference.
for (int i = 0; i < 2; ++i) {
cache.addNestedSetToFingerprint(
- NestedSetFingerprintCacheTest::simpleMapFn2, new Fingerprint(), nestedSet);
+ NestedSetFingerprintCacheTest::simpleExpand2, new Fingerprint(), nestedSet);
}
// Make sure a non-capturing lambda doesn't get blacklisted
for (int i = 0; i < 2; ++i) {
- cache.addNestedSetToFingerprint(s -> s + "_mapped", new Fingerprint(), nestedSet);
+ cache.addNestedSetToFingerprint(
+ (s, args) -> args.accept(s + "_mapped"), new Fingerprint(), nestedSet);
}
// Make sure a CapturingMapFn doesn't get blacklisted
for (int i = 0; i < 2; ++i) {
cache.addNestedSetToFingerprint(
- (CapturingMapFn<String>) object -> object, new Fingerprint(), nestedSet);
+ (CapturingMapFn<String>) (s, args) -> args.accept(s + 1), new Fingerprint(), nestedSet);
}
// Make sure a ParametrizedMapFn doesn't get blacklisted until it exceeds its instance count
@@ -159,7 +161,7 @@ public class NestedSetFingerprintCacheTest {
() -> {
for (int i = 0; i < 2; ++i) {
StringJoiner str = new StringJoiner("hello");
- cache.addNestedSetToFingerprint(str::join, new Fingerprint(), nestedSet);
+ cache.addNestedSetToFingerprint(str::expand, new Fingerprint(), nestedSet);
}
});
@@ -170,7 +172,7 @@ public class NestedSetFingerprintCacheTest {
for (int i = 0; i < 2; ++i) {
final int capturedVariable = i;
cache.addNestedSetToFingerprint(
- s -> s + capturedVariable, new Fingerprint(), nestedSet);
+ (s, args) -> args.accept(s + capturedVariable), new Fingerprint(), nestedSet);
}
});
}
@@ -183,8 +185,8 @@ public class NestedSetFingerprintCacheTest {
}
@Override
- public String expandToCommandLine(String object) {
- return object + i;
+ public void expandToCommandLine(String object, Consumer<String> args) {
+ args.accept(object + i);
}
@Override
@@ -217,16 +219,16 @@ public class NestedSetFingerprintCacheTest {
this.str = str;
}
- private String join(String other) {
- return str + other;
+ private void expand(String other, Consumer<String> args) {
+ args.accept(str + other);
}
}
- private static String simpleMapFn(String o) {
- return o + "_mapped";
+ private static void simpleExpand(String o, Consumer<String> args) {
+ args.accept(o + "_mapped");
}
- private static String simpleMapFn2(String o) {
- return o + "_mapped2";
+ private static void simpleExpand2(String o, Consumer<String> args) {
+ args.accept(o + "_mapped2");
}
}