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..fa7d89dc3 --- /dev/null +++ b/test/src/main/scala/scalarules/test/java_classpath_order/BUILD @@ -0,0 +1,28 @@ +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 +# 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/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" + } +} + diff --git a/test_rules_scala.sh b/test_rules_scala.sh index 5674085c4..02f6093b9 100755 --- a/test_rules_scala.sh +++ b/test_rules_scala.sh @@ -19,10 +19,10 @@ $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 -- 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"