Fix javacopts expansion

We need to perform location expansion first, otherwise `$(location ...)` is treated as a make variable.

Actually fixes https://github.com/bazelbuild/rules_java/issues/345

PiperOrigin-RevId: 868123902
Change-Id: I74d38c34f55990d4afc76498567a7740f58aa39e
diff --git a/java/common/rules/impl/compile_action.bzl b/java/common/rules/impl/compile_action.bzl
index 098c55b..f553a83 100644
--- a/java/common/rules/impl/compile_action.bzl
+++ b/java/common/rules/impl/compile_action.bzl
@@ -136,9 +136,9 @@
       or resources present, whereas runfiles in this case are empty.
     """
     expanded_javacopts = javacopts
+    expanded_javacopts = [ctx.expand_location(opt) for opt in expanded_javacopts]
     if semantics.expand_javacopts_make_variables:
         expanded_javacopts = [ctx.expand_make_variables("javacopts", opt, {}) for opt in expanded_javacopts]
-    expanded_javacopts = [ctx.expand_location(opt) for opt in expanded_javacopts]
     java_info = _compile_private_for_builtins(
         ctx,
         output = output_class_jar,
diff --git a/test/java/bazel/rules/java_binary_tests.bzl b/test/java/bazel/rules/java_binary_tests.bzl
index 2d015b6..737acea 100644
--- a/test/java/bazel/rules/java_binary_tests.bzl
+++ b/test/java/bazel/rules/java_binary_tests.bzl
@@ -77,11 +77,32 @@
     assert_java_info.compilation_info().javac_options().not_contains("$(MY_CUSTOM_OPT)")
     assert_java_info.compilation_info().javac_options().contains("MY_OPT_VALUE")
 
+def _test_java_binary_javacopts_location_expansion(name):
+    util.helper_target(
+        java_binary,
+        name = name + "/bin",
+        srcs = ["A.java"],
+        javacopts = ["-XepOpt:foo=$(location :A.java)"],
+    )
+
+    analysis_test(
+        name = name,
+        impl = _test_java_binary_javacopts_location_expansion_impl,
+        target = name + "/bin",
+    )
+
+def _test_java_binary_javacopts_location_expansion_impl(env, target):
+    assert_java_info = java_info_subject.from_target(env, target)
+    assert_java_info.compilation_info().javac_options().contains(
+        "-XepOpt:foo={package}/A.java",
+    )
+
 def java_binary_tests(name):
     test_suite(
         name = name,
         tests = [
             _test_java_binary_cross_compilation_to_unix,
             _test_java_binary_javacopts_make_variable_expansion,
+            _test_java_binary_javacopts_location_expansion,
         ],
     )
diff --git a/test/java/testutil/java_info_subject.bzl b/test/java/testutil/java_info_subject.bzl
index e924243..e0ec805 100644
--- a/test/java/testutil/java_info_subject.bzl
+++ b/test/java/testutil/java_info_subject.bzl
@@ -58,7 +58,7 @@
         compilation_classpath = lambda: subjects.depset_file(self.actual.compilation_classpath, self.meta.derive("compilation_classpath")),
         runtime_classpath = lambda: subjects.depset_file(self.actual.runtime_classpath, self.meta.derive("runtime_classpath")),
         runtime_classpath_list = lambda: subjects.collection(self.actual.runtime_classpath.to_list(), self.meta.derive("runtime_classpath.to_list()"), format = True),
-        javac_options = lambda: subjects.collection(helper.tokenize_javacopts(opts = self.actual.javac_options), self.meta.derive("javac_options")),
+        javac_options = lambda: subjects.collection(helper.tokenize_javacopts(opts = self.actual.javac_options), self.meta.derive("javac_options"), format = True),
     )
     return public