Expose `compilation_info.javac_options_list` for migration

Once usages are migrated, `compilation_info.javac_options` can be changed to a `Depset`.

PiperOrigin-RevId: 560953670
Change-Id: I92c7a872358845d16a15ceeeb17bc7911edede54
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCompilationInfoProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCompilationInfoProviderApi.java
index e832d2f..3147b5b 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCompilationInfoProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCompilationInfoProviderApi.java
@@ -33,6 +33,17 @@
   ImmutableList<String> getJavacOpts();
 
   @StarlarkMethod(
+      name = "javac_options_list",
+      structField = true,
+      doc =
+          "A list of options to java compiler. This exists temporarily for migration purposes. "
+              + "javac_options will return a depset in the future, and this method will be dropped "
+              + "once all usages have been updated to handle depsets.")
+  default ImmutableList<String> getJavacOptsList() {
+    return getJavacOpts();
+  }
+
+  @StarlarkMethod(
       name = "runtime_classpath",
       structField = true,
       doc = "Run-time classpath for this Java target.")
diff --git a/src/main/starlark/builtins_bzl/common/java/compile_action.bzl b/src/main/starlark/builtins_bzl/common/java/compile_action.bzl
index fdc29b5..1e26d64 100644
--- a/src/main/starlark/builtins_bzl/common/java/compile_action.bzl
+++ b/src/main/starlark/builtins_bzl/common/java/compile_action.bzl
@@ -159,7 +159,7 @@
         runfiles = [output_class_jar] if source_files or source_jars or resources else [],
         # TODO(ilist): collect compile_jars from JavaInfo in deps & exports
         compilation_classpath = java_info.compilation_info.compilation_classpath,
-        javac_options = java_info.compilation_info.javac_options,
+        javac_options = java_info.compilation_info.javac_options_list,
         plugins = _collect_plugins(deps, plugins),
     )
 
diff --git a/src/main/starlark/builtins_bzl/common/java/java_common_internal_for_builtins.bzl b/src/main/starlark/builtins_bzl/common/java/java_common_internal_for_builtins.bzl
index 5ad6ab1..1589264 100644
--- a/src/main/starlark/builtins_bzl/common/java/java_common_internal_for_builtins.bzl
+++ b/src/main/starlark/builtins_bzl/common/java/java_common_internal_for_builtins.bzl
@@ -314,6 +314,7 @@
 
     compilation_info = struct(
         javac_options = all_javac_opts_list,
+        javac_options_list = all_javac_opts_list,
         # needs to be flattened because the public API is a list
         boot_classpath = (bootclasspath.bootclasspath if bootclasspath else java_toolchain.bootclasspath).to_list(),
         # we only add compile time jars from deps, and not exports
diff --git a/src/main/starlark/builtins_bzl/common/java/java_info.bzl b/src/main/starlark/builtins_bzl/common/java/java_info.bzl
index d17736d..aef76c5 100644
--- a/src/main/starlark/builtins_bzl/common/java/java_info.bzl
+++ b/src/main/starlark/builtins_bzl/common/java/java_info.bzl
@@ -82,6 +82,10 @@
     fields = {
         "boot_classpath": "Boot classpath for this Java target.",
         "javac_options": "Options to the java compiler.",
+        "javac_options_list": """A list of options to java compiler. This exists
+            temporarily for migration purposes. javac_options will return a depset
+            in the future, and this method will be dropped once all usages have
+            been updated to handle depsets.""",
         "compilation_classpath": "Compilation classpath for this Java target.",
         "runtime_classpath": "Run-time classpath for this Java target.",
     },
@@ -92,6 +96,7 @@
     runtime_classpath = depset(),
     boot_classpath = None,
     javac_options = [],
+    javac_options_list = [],
 )
 
 def merge(
@@ -228,6 +233,7 @@
         compilation_info = _JavaCompilationInfo(
             boot_classpath = None,
             javac_options = [],
+            javac_options_list = [],
             compilation_classpath = java_info.transitive_compile_time_jars,
             runtime_classpath = java_info.transitive_runtime_jars,
         )
@@ -467,6 +473,7 @@
         result.update(
             compilation_info = _JavaCompilationInfo(
                 javac_options = _java_common_internal.intern_javac_opts(compilation_info.javac_options),
+                javac_options_list = _java_common_internal.intern_javac_opts(compilation_info.javac_options_list),
                 boot_classpath = compilation_info.boot_classpath,
                 compilation_classpath = compilation_info.compilation_classpath,
                 runtime_classpath = compilation_info.runtime_classpath,
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java
index 2cf1014..e16cbca 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java
@@ -2166,7 +2166,7 @@
     scratch.file(
         "foo/BUILD",
         "load(':extension.bzl', 'my_rule')",
-        "java_library(name = 'my_java_lib_a', srcs = ['java/A.java'])",
+        "java_library(name = 'my_java_lib_a', srcs = ['java/A.java'], javacopts = ['opt1'])",
         "my_rule(name = 'my_starlark_rule', dep = ':my_java_lib_a')");
     assertNoEvents();
     ConfiguredTarget myRuleTarget = getConfiguredTarget("//foo:my_starlark_rule");
@@ -2182,6 +2182,35 @@
             prettyArtifactNames(
                 javaCompilationInfoProvider.getRuntimeClasspath().getSet(Artifact.class)))
         .containsExactly("foo/libmy_java_lib_a.jar");
+    assertThat(javaCompilationInfoProvider.getJavacOpts()).contains("opt1");
+    assertThat(javaCompilationInfoProvider.getJavacOptsList()).contains("opt1");
+  }
+
+  @Test
+  public void javaInfoStarlarkCompilationInfoJavacOpts() throws Exception {
+    scratch.file(
+        "foo/extension.bzl",
+        "result = provider()",
+        "def _impl(ctx):",
+        "  return [result(property = ctx.attr.dep[JavaInfo].compilation_info.javac_options_list)]",
+        "my_rule = rule(_impl, attrs = { 'dep' : attr.label() })");
+    scratch.file(
+        "foo/BUILD",
+        "load(':extension.bzl', 'my_rule')",
+        "java_library(name = 'my_java_lib_a', srcs = ['java/A.java'], javacopts = ['opt1',"
+            + " 'opt2'])",
+        "my_rule(name = 'my_starlark_rule', dep = ':my_java_lib_a')");
+    assertNoEvents();
+    ConfiguredTarget myRuleTarget = getConfiguredTarget("//foo:my_starlark_rule");
+
+    StructImpl info =
+        (StructImpl)
+            myRuleTarget.get(
+                new StarlarkProvider.Key(Label.parseCanonical("//foo:extension.bzl"), "result"));
+    Sequence<String> javacOptionsList =
+        Sequence.cast(info.getValue("property"), String.class, "javac_options_list");
+
+    assertThat(javacOptionsList).containsAtLeast("opt1", "opt2").inOrder();
   }
 
   /* Test inspired by {@link AbstractJavaLibraryConfiguredTargetTest#testNeverlink}.*/