From 222c1c7fec500679fca011d84fed4187275a6d7f Mon Sep 17 00:00:00 2001 From: Vince Rose Date: Tue, 2 Dec 2025 10:12:14 -0700 Subject: [PATCH 1/4] Make java library earlier on classpath Co-Authored-By: Farid Zakaria --- scala/private/phases/phase_compile.bzl | 2 +- .../test/java_classpath_order/BUILD | 24 ++++++++++++++++++ .../test/java_classpath_order/Original.scala | 6 +++++ .../java_classpath_order/Overridable.java | 8 ++++++ .../java_classpath_order/VerifyOverride.scala | 25 +++++++++++++++++++ 5 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 test/src/main/scala/scalarules/test/java_classpath_order/BUILD create mode 100644 test/src/main/scala/scalarules/test/java_classpath_order/Original.scala create mode 100644 test/src/main/scala/scalarules/test/java_classpath_order/Overridable.java create mode 100644 test/src/main/scala/scalarules/test/java_classpath_order/VerifyOverride.scala diff --git a/scala/private/phases/phase_compile.bzl b/scala/private/phases/phase_compile.bzl index 185f7219d..5a4d51843 100644 --- a/scala/private/phases/phase_compile.bzl +++ b/scala/private/phases/phase_compile.bzl @@ -254,7 +254,7 @@ def _compile_or_empty( full_jars.append(java_jar.jar) if java_jar: - merged_provider = java_common.merge([scala_compilation_provider, java_jar.java_compilation_provider]) + merged_provider = java_common.merge([java_jar.java_compilation_provider, scala_compilation_provider]) else: merged_provider = scala_compilation_provider diff --git a/test/src/main/scala/scalarules/test/java_classpath_order/BUILD b/test/src/main/scala/scalarules/test/java_classpath_order/BUILD new file mode 100644 index 000000000..ef96e8d92 --- /dev/null +++ b/test/src/main/scala/scalarules/test/java_classpath_order/BUILD @@ -0,0 +1,24 @@ +load("//scala:scala.bzl", "scala_library", "scala_test") + +# Original library with the class to be shadowed +scala_library( + name = "original", + srcs = ["Original.scala"], +) + +# Library that shadows the Overridable class with a Java file +# The Java file (Overridable.java) should take precedence over +# the Overridable class from the :original dependency +scala_library( + name = "with_java_override", + srcs = ["Overridable.java"], + deps = [":original"], +) + +# Test that verifies the Java override works correctly +scala_test( + name = "verify_override_test", + srcs = ["VerifyOverride.scala"], + deps = [":with_java_override"], +) + diff --git a/test/src/main/scala/scalarules/test/java_classpath_order/Original.scala b/test/src/main/scala/scalarules/test/java_classpath_order/Original.scala new file mode 100644 index 000000000..e29c13ab0 --- /dev/null +++ b/test/src/main/scala/scalarules/test/java_classpath_order/Original.scala @@ -0,0 +1,6 @@ +package scalarules.test.java_classpath_order + +class Overridable { + def getValue(): String = "original" +} + diff --git a/test/src/main/scala/scalarules/test/java_classpath_order/Overridable.java b/test/src/main/scala/scalarules/test/java_classpath_order/Overridable.java new file mode 100644 index 000000000..007b9bed0 --- /dev/null +++ b/test/src/main/scala/scalarules/test/java_classpath_order/Overridable.java @@ -0,0 +1,8 @@ +package scalarules.test.java_classpath_order; + +public class Overridable { + public String getValue() { + return "overridden"; + } +} + diff --git a/test/src/main/scala/scalarules/test/java_classpath_order/VerifyOverride.scala b/test/src/main/scala/scalarules/test/java_classpath_order/VerifyOverride.scala new file mode 100644 index 000000000..2d91c3c29 --- /dev/null +++ b/test/src/main/scala/scalarules/test/java_classpath_order/VerifyOverride.scala @@ -0,0 +1,25 @@ +package scalarules.test.java_classpath_order + +import org.scalatest.flatspec.AnyFlatSpec +import org.scalatest.matchers.should.Matchers + +/** + * This test verifies that the Java class (Overridable) shadows + * the Scala class from the dependency. + * + * The expected behavior is: + * - The Java file compiled in the scala_library with_java_override should + * appear first on the classpath + * - When instantiating Overridable, we should get the Java version + * which returns "overridden" + */ +class VerifyOverrideTest extends AnyFlatSpec with Matchers { + + "Java class in scala_library" should "shadow the dependency's class" in { + val instance = new Overridable() + val value = instance.getValue() + + value shouldBe "overridden" + } +} + From 7be0e1ee5769936873380c6f88d4b26c1cb938b4 Mon Sep 17 00:00:00 2001 From: Vince Rose Date: Tue, 2 Dec 2025 10:36:41 -0700 Subject: [PATCH 2/4] work around strict deps check --- .../main/scala/scalarules/test/java_classpath_order/BUILD | 6 +++++- test_rules_scala.sh | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/test/src/main/scala/scalarules/test/java_classpath_order/BUILD b/test/src/main/scala/scalarules/test/java_classpath_order/BUILD index ef96e8d92..fa7d89dc3 100644 --- a/test/src/main/scala/scalarules/test/java_classpath_order/BUILD +++ b/test/src/main/scala/scalarules/test/java_classpath_order/BUILD @@ -16,9 +16,13 @@ scala_library( ) # Test that verifies the Java override works correctly +# Note: This test is incompatible with strict deps checking because the checker +# doesn't understand class shadowing - it sees Overridable as coming from :original +# rather than the shadowed version from :with_java_override scala_test( name = "verify_override_test", srcs = ["VerifyOverride.scala"], + tags = ["no-strict-deps"], + unused_dependency_checker_mode = "off", deps = [":with_java_override"], ) - diff --git a/test_rules_scala.sh b/test_rules_scala.sh index 5674085c4..e9c435db0 100755 --- a/test_rules_scala.sh +++ b/test_rules_scala.sh @@ -22,7 +22,7 @@ $runner bazel build --extra_toolchains=//test/toolchains:high_level_transitive_d $runner bazel build --extra_toolchains=//scala:minimal_direct_source_deps -- test/... #$runner bazel build --extra_toolchains=//test/toolchains:high_level_transitive_deps_strict_deps_error --all_incompatible_changes -- test/... $runner bazel test "${test_output_flag}" --extra_toolchains=//test/toolchains:high_level_transitive_deps_strict_deps_error -- test/... -$runner bazel test "${test_output_flag}" --extra_toolchains=//scala:minimal_direct_source_deps -- test/... +$runner bazel test "${test_output_flag}" --extra_toolchains=//scala:minimal_direct_source_deps --build_tag_filters=-no-strict-deps -- test/... $runner bazel build test_expect_failure/missing_direct_deps/internal_deps/... --strict_java_deps=warn --extra_toolchains=//test/toolchains:high_level_transitive_deps_strict_deps_warn $runner bazel build //test_expect_failure/proto_source_root/... --strict_proto_deps=off $runner bazel test "$test_output_flag" //test/... --extra_toolchains="//test_expect_failure/plus_one_deps:plus_one_deps" From 2d6667b84410d7a780fabf5f8191a8f1855debe3 Mon Sep 17 00:00:00 2001 From: Vince Rose Date: Tue, 2 Dec 2025 10:44:25 -0700 Subject: [PATCH 3/4] add additional build_tag_filters --- test_rules_scala.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_rules_scala.sh b/test_rules_scala.sh index e9c435db0..7c9e5bdf4 100755 --- a/test_rules_scala.sh +++ b/test_rules_scala.sh @@ -19,7 +19,7 @@ $runner bazel build src/... test/... $runner bazel test "${test_output_flag}" src/... test/... $runner bazel test "${test_output_flag}" third_party/... $runner bazel build --extra_toolchains=//test/toolchains:high_level_transitive_deps_strict_deps_error -- test/... -$runner bazel build --extra_toolchains=//scala:minimal_direct_source_deps -- test/... +$runner bazel build --extra_toolchains=//scala:minimal_direct_source_deps --build_tag_filters=-no-strict-deps -- test/... #$runner bazel build --extra_toolchains=//test/toolchains:high_level_transitive_deps_strict_deps_error --all_incompatible_changes -- test/... $runner bazel test "${test_output_flag}" --extra_toolchains=//test/toolchains:high_level_transitive_deps_strict_deps_error -- test/... $runner bazel test "${test_output_flag}" --extra_toolchains=//scala:minimal_direct_source_deps --build_tag_filters=-no-strict-deps -- test/... From 8674138638dfdbade92350ea6fa6e97e0288c615 Mon Sep 17 00:00:00 2001 From: Vince Rose Date: Tue, 2 Dec 2025 10:51:08 -0700 Subject: [PATCH 4/4] another edit to the filters --- test_rules_scala.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_rules_scala.sh b/test_rules_scala.sh index 7c9e5bdf4..02f6093b9 100755 --- a/test_rules_scala.sh +++ b/test_rules_scala.sh @@ -22,7 +22,7 @@ $runner bazel build --extra_toolchains=//test/toolchains:high_level_transitive_d $runner bazel build --extra_toolchains=//scala:minimal_direct_source_deps --build_tag_filters=-no-strict-deps -- test/... #$runner bazel build --extra_toolchains=//test/toolchains:high_level_transitive_deps_strict_deps_error --all_incompatible_changes -- test/... $runner bazel test "${test_output_flag}" --extra_toolchains=//test/toolchains:high_level_transitive_deps_strict_deps_error -- test/... -$runner bazel test "${test_output_flag}" --extra_toolchains=//scala:minimal_direct_source_deps --build_tag_filters=-no-strict-deps -- test/... +$runner bazel test "${test_output_flag}" --extra_toolchains=//scala:minimal_direct_source_deps --build_tag_filters=-no-strict-deps --test_tag_filters=-no-strict-deps -- test/... $runner bazel build test_expect_failure/missing_direct_deps/internal_deps/... --strict_java_deps=warn --extra_toolchains=//test/toolchains:high_level_transitive_deps_strict_deps_warn $runner bazel build //test_expect_failure/proto_source_root/... --strict_proto_deps=off $runner bazel test "$test_output_flag" //test/... --extra_toolchains="//test_expect_failure/plus_one_deps:plus_one_deps"