Make multi-value BuildOptions fields immutable. Addresses #6723 PiperOrigin-RevId: 222464467
diff --git a/src/main/java/com/google/devtools/common/options/OptionValueDescription.java b/src/main/java/com/google/devtools/common/options/OptionValueDescription.java index a54893b..541712e 100644 --- a/src/main/java/com/google/devtools/common/options/OptionValueDescription.java +++ b/src/main/java/com/google/devtools/common/options/OptionValueDescription.java
@@ -290,17 +290,14 @@ } @Override - public List<Object> getValue() { + public ImmutableList<Object> getValue() { // Sort the results by option priority and return them in a new list. The generic type of // the list is not known at runtime, so we can't use it here. - return optionValues - .asMap() - .entrySet() - .stream() + return optionValues.asMap().entrySet().stream() .sorted(Comparator.comparing(Map.Entry::getKey)) .map(Map.Entry::getValue) .flatMap(Collection::stream) - .collect(Collectors.toList()); + .collect(ImmutableList.toImmutableList()); } @Override
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/config/BuildOptionsTest.java b/src/test/java/com/google/devtools/build/lib/analysis/config/BuildOptionsTest.java index e897c11..c5bcd36 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/config/BuildOptionsTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/config/BuildOptionsTest.java
@@ -19,6 +19,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Options; import com.google.devtools.build.lib.analysis.config.BuildOptions.OptionsDiff; import com.google.devtools.build.lib.analysis.config.BuildOptions.OptionsDiffForReconstruction; import com.google.devtools.build.lib.rules.android.AndroidConfiguration; @@ -28,6 +29,7 @@ import com.google.devtools.build.lib.rules.python.PythonOptions; import com.google.devtools.build.lib.skyframe.serialization.testutils.TestUtils; import com.google.devtools.common.options.OptionsParser; +import java.util.AbstractMap; import java.util.stream.Collectors; import org.junit.Test; import org.junit.runner.RunWith; @@ -327,4 +329,15 @@ .isEqualTo( TestUtils.toBytes(diff, ImmutableMap.of(BuildOptions.OptionsDiffCache.class, cache))); } + + @Test + public void testMultiValueOptionImmutability() throws Exception { + BuildOptions options = + BuildOptions.of(TEST_OPTIONS, OptionsParser.newOptionsParser(TEST_OPTIONS)); + BuildConfiguration.Options coreOptions = options.get(Options.class); + assertThrows( + UnsupportedOperationException.class, + () -> + coreOptions.commandLineBuildVariables.add(new AbstractMap.SimpleEntry<>("foo", "bar"))); + } }