diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BUILD b/src/main/java/com/google/devtools/build/lib/analysis/BUILD index 208da8fe11db81..64993b41dd59e5 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/BUILD +++ b/src/main/java/com/google/devtools/build/lib/analysis/BUILD @@ -1699,6 +1699,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec:serialization-constant", "//src/main/java/com/google/devtools/build/lib/util", "//src/main/java/com/google/devtools/common/options", + "//third_party:error_prone_annotations", "//third_party:guava", "//third_party:jsr305", "//third_party/protobuf:protobuf_java", diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java index ba866b34e7fdd2..08065c4457bb31 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java @@ -16,6 +16,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.collect.ImmutableMap.toImmutableMap; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.MoreObjects; @@ -230,14 +231,16 @@ public ImmutableMap getStarlarkOptions() { */ @Override public BuildOptions clone() { - ImmutableMap.Builder, FragmentOptions> nativeOptionsBuilder = - ImmutableMap.builderWithExpectedSize(fragmentOptionsMap.size()); - for (Map.Entry, FragmentOptions> entry : - fragmentOptionsMap.entrySet()) { - nativeOptionsBuilder.put(entry.getKey(), entry.getValue().clone()); - } - return new BuildOptions( - nativeOptionsBuilder.buildOrThrow(), ImmutableMap.copyOf(starlarkOptionsMap)); + ImmutableMap, FragmentOptions> nativeOptions = + fragmentOptionsMap.entrySet().stream() + .collect( + toImmutableMap( + Map.Entry::getKey, + // Explicitly clone native options because FragmentOptions is mutable. + e -> e.getValue().clone())); + // Note that this assumes that starlark option values are immutable. + ImmutableMap starlarkOptions = ImmutableMap.copyOf(starlarkOptionsMap); + return new BuildOptions(nativeOptions, starlarkOptions); } @Override