Automated rollback of commit 36f093abbfec386ef57f26ac479394f597881169.

*** Reason for rollback ***

re-evaluation that --define should probably not be exposed as a native option

*** Original change description ***

Allow *allowMultiple* options to be *set* by Starlark transitions.

Specifically helpful for --define.

Work towards #5574

RELNOTES: None.
PiperOrigin-RevId: 244357629
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/FunctionTransitionUtil.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/FunctionTransitionUtil.java
index c014b8a6..07f2649 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/FunctionTransitionUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/FunctionTransitionUtil.java
@@ -33,15 +33,12 @@
 import com.google.devtools.build.lib.syntax.Runtime;
 import com.google.devtools.build.lib.syntax.Runtime.NoneType;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
-import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.common.options.OptionDefinition;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsParsingException;
 import java.lang.reflect.Field;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
@@ -257,35 +254,17 @@
           OptionDefinition def = optionInfo.getDefinition();
           Field field = def.getField();
           FragmentOptions options = buildOptions.get(optionInfo.getOptionClass());
-
-          if (!def.allowsMultiple()) {
-            if (optionValue == null || def.getType().isInstance(optionValue)) {
-              field.set(options, optionValue);
-            } else if (optionValue instanceof String) {
-              field.set(options, def.getConverter().convert((String) optionValue));
-            } else {
-              throw new EvalException(
-                  starlarkTransition.getLocationForErrorReporting(),
-                  "Invalid value type for option '" + optionName + "'");
-            }
+          if (optionValue == null || def.getType().isInstance(optionValue)) {
+            field.set(options, optionValue);
+          } else if (optionValue instanceof String) {
+            field.set(options, def.getConverter().convert((String) optionValue));
           } else {
-            SkylarkList rawValues =
-                optionValue instanceof SkylarkList
-                    ? (SkylarkList) optionValue
-                    : SkylarkList.createImmutable(Collections.singletonList(optionValue));
-            List<Object> allValues = new ArrayList<>(rawValues.size());
-            for (Object singleValue : rawValues) {
-              if (singleValue instanceof String) {
-                allValues.add(def.getConverter().convert((String) singleValue));
-              } else {
-                allValues.add(singleValue);
-              }
-            }
-            field.set(options, ImmutableList.copyOf(allValues));
+            throw new EvalException(
+                starlarkTransition.getLocationForErrorReporting(),
+                "Invalid value type for option '" + optionName + "'");
           }
         } catch (IllegalAccessException e) {
-          throw new EvalException(
-              starlarkTransition.getLocationForErrorReporting(),
+          throw new RuntimeException(
               "IllegalAccess for option " + optionName + ": " + e.getMessage());
         } catch (OptionsParsingException e) {
           throw new EvalException(
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/StarlarkRuleTransitionProviderTest.java b/src/test/java/com/google/devtools/build/lib/analysis/StarlarkRuleTransitionProviderTest.java
index c56d4eb..fd9bbe0 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/StarlarkRuleTransitionProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/StarlarkRuleTransitionProviderTest.java
@@ -17,7 +17,6 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration.EmptyToNullLabelConverter;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment;
@@ -29,12 +28,9 @@
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
-import com.google.devtools.common.options.Converters;
 import com.google.devtools.common.options.Option;
 import com.google.devtools.common.options.OptionDocumentationCategory;
 import com.google.devtools.common.options.OptionEffectTag;
-import java.util.List;
-import java.util.Map;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -58,16 +54,6 @@
         effectTags = {OptionEffectTag.NO_OP},
         help = "An option that is sometimes set to null.")
     public Label nullable;
-
-    @Option(
-        name = "allow_multiple",
-        converter = Converters.AssignmentConverter.class,
-        defaultValue = "",
-        allowMultiple = true,
-        documentationCategory = OptionDocumentationCategory.OUTPUT_PARAMETERS,
-        effectTags = {OptionEffectTag.CHANGES_INPUTS, OptionEffectTag.AFFECTS_OUTPUTS},
-        help = "Each --define option specifies an assignment for a build variable.")
-    public List<Map.Entry<String, String>> allowMultiple;
   }
 
   /** Loads a new {link @DummyTestFragment} instance. */
@@ -893,38 +879,4 @@
     assertThat(configuration.getOptions().get(TestOptions.class).testArguments)
         .containsExactly("post-transition");
   }
-
-  @Test
-  public void testWriteNativeOption_allowMultipleOption() throws Exception {
-    writeWhitelistFile();
-    scratch.file(
-        "test/transitions.bzl",
-        "def _impl(settings, attr):",
-        "  return {",
-        "  '//command_line_option:allow_multiple': ['APRIL=SHOWERS', 'MAY=FLOWERS'],",
-        "  }",
-        "my_transition = transition(implementation = _impl, inputs = [],",
-        "  outputs = ['//command_line_option:allow_multiple'])");
-    scratch.file(
-        "test/rules.bzl",
-        "load('//test:transitions.bzl', 'my_transition')",
-        "def _impl(ctx):",
-        "  return []",
-        "my_rule = rule(",
-        "  implementation = _impl,",
-        "  cfg = my_transition,",
-        "  attrs = {",
-        "    '_whitelist_function_transition': attr.label(",
-        "        default = '//tools/whitelists/function_transition_whitelist',",
-        "    ),",
-        "  })");
-    scratch.file("test/BUILD", "load('//test:rules.bzl', 'my_rule')", "my_rule(name = 'test')");
-
-    useConfiguration("--allow_multiple=APRIL=FOOLS");
-
-    BuildConfiguration configuration = getConfiguration(getConfiguredTarget("//test"));
-    assertThat(configuration.getOptions().get(DummyTestOptions.class).allowMultiple)
-        .containsExactly(
-            Maps.immutableEntry("APRIL", "SHOWERS"), Maps.immutableEntry("MAY", "FLOWERS"));
-  }
 }
diff --git a/src/test/shell/bazel/whitelist_test.sh b/src/test/shell/bazel/whitelist_test.sh
index 8c4ea1b..e3c2b12 100755
--- a/src/test/shell/bazel/whitelist_test.sh
+++ b/src/test/shell/bazel/whitelist_test.sh
@@ -99,7 +99,7 @@
     --noimplicit_deps --experimental_starlark_config_transitions \
     >& $TEST_log || fail "failed to query //vinegar"
   expect_log "@secret_ingredient//hotsauce"
-  expect_log "test_arg:\[hotlanta\] -> \[\[tapatio\]\]"
+  expect_log "test_arg:\[hotlanta\] -> \[\[\"tapatio\"\]\]"
 
 }