diff options
author | tomlu <tomlu@google.com> | 2018-02-01 07:21:27 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-02-01 07:23:16 -0800 |
commit | a904b85376251775d58852a0e8480c0db032bac8 (patch) | |
tree | 83e846c6cfebee7259f093661e9313d4fc9338f8 | |
parent | 5a50a7c403e567b850d5037d1ee0dad96be0b39d (diff) |
Allow CustomCommandLine's mapFn to expand each object into multiple items.
This is needed to migrate JavaCompileAction away from CustomMultiArgv.
PiperOrigin-RevId: 184136486
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"); } } |