From edd3b69879a5aa5c48aa3040fd31aab2ab955ed8 Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Tue, 21 Sep 2021 16:17:50 +0200 Subject: [PATCH] Generate static forwarders for object members in companion interface Same change implemented five years ago in Scala 2: https://github.com/scala/scala/pull/5131 Fixes #13572. This PR was backported to 3.1.0-RC3 in #13616, this lets us bump the previousDottyVersion to make the mima checks pass even though this PR introduces new public member (and while we're at it, we can reset the mima filter list). --- .../tools/backend/jvm/BCodeSkelBuilder.scala | 2 +- .../test/dotc/run-test-pickling.blacklist | 4 ++ project/Build.scala | 2 +- project/MiMaFilters.scala | 43 ------------------- tests/run/trait-static-forwarder.check | 1 + tests/run/trait-static-forwarder/Test.java | 5 +++ .../trait-static-forwarder/forwarders.scala | 5 +++ 7 files changed, 17 insertions(+), 45 deletions(-) create mode 100644 tests/run/trait-static-forwarder.check create mode 100644 tests/run/trait-static-forwarder/Test.java create mode 100644 tests/run/trait-static-forwarder/forwarders.scala diff --git a/compiler/src/dotty/tools/backend/jvm/BCodeSkelBuilder.scala b/compiler/src/dotty/tools/backend/jvm/BCodeSkelBuilder.scala index 9ed88e7d1ad6..95ebf439fa6d 100644 --- a/compiler/src/dotty/tools/backend/jvm/BCodeSkelBuilder.scala +++ b/compiler/src/dotty/tools/backend/jvm/BCodeSkelBuilder.scala @@ -292,7 +292,7 @@ trait BCodeSkelBuilder extends BCodeHelpers { emitAnnotations(cnode, claszSymbol.annotations ++ ssa) if (!isCZStaticModule && !isCZParcelable) { - val skipStaticForwarders = (claszSymbol.isInterface || claszSymbol.is(Module) || ctx.settings.XnoForwarders.value) + val skipStaticForwarders = (claszSymbol.is(Module) || ctx.settings.XnoForwarders.value) if (!skipStaticForwarders) { val lmoc = claszSymbol.companionModule // add static forwarders if there are no name conflicts; see bugs #363 and #1735 diff --git a/compiler/test/dotc/run-test-pickling.blacklist b/compiler/test/dotc/run-test-pickling.blacklist index aa76a78cf413..f12d011b8a53 100644 --- a/compiler/test/dotc/run-test-pickling.blacklist +++ b/compiler/test/dotc/run-test-pickling.blacklist @@ -1,3 +1,6 @@ +## Many of these tests fail because CompilationTests.pickling does not handle +## tests containing java files correctly + derive-generic.scala eff-dependent.scala enum-java @@ -38,3 +41,4 @@ i12753 t6138 t6138-2 i12656.scala +trait-static-forwarder diff --git a/project/Build.scala b/project/Build.scala index f90264178e0f..5286fb73b4ac 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -81,7 +81,7 @@ object Build { * set to 3.1.3. If it is going to be 3.1.0, it must be set to the latest * 3.0.x release. */ - val previousDottyVersion = "3.0.2" + val previousDottyVersion = "3.1.0-RC3" object CompatMode { final val BinaryCompatible = 0 diff --git a/project/MiMaFilters.scala b/project/MiMaFilters.scala index bf3272fece48..c7a71a2dd8dc 100644 --- a/project/MiMaFilters.scala +++ b/project/MiMaFilters.scala @@ -4,48 +4,5 @@ import com.typesafe.tools.mima.core.ProblemFilters._ object MiMaFilters { val Library: Seq[ProblemFilter] = Seq( - // Experimental API for saferExceptions - exclude[MissingClassProblem]("scala.CanThrow"), - exclude[MissingClassProblem]("scala.CanThrow$package"), - exclude[MissingClassProblem]("scala.CanThrow$package$"), - exclude[MissingClassProblem]("scala.unsafeExceptions"), - exclude[MissingClassProblem]("scala.unsafeExceptions$"), - exclude[MissingFieldProblem]("scala.runtime.stdLibPatches.language#experimental.saferExceptions"), - exclude[MissingClassProblem]("scala.runtime.stdLibPatches.language$experimental$saferExceptions$"), - - // New APIs that will be introduced in 3.1.0 - exclude[ReversedMissingMethodProblem]("scala.quoted.Quotes#reflectModule.Wildcard"), - exclude[ReversedMissingMethodProblem]("scala.quoted.Quotes#reflectModule.WildcardTypeTest"), - exclude[ReversedMissingMethodProblem]("scala.quoted.Quotes#reflectModule#SourceFileMethods.getJPath"), - exclude[ReversedMissingMethodProblem]("scala.quoted.Quotes#reflectModule#SourceFileMethods.name"), - exclude[ReversedMissingMethodProblem]("scala.quoted.Quotes#reflectModule#SourceFileMethods.path"), - exclude[DirectMissingMethodProblem]("scala.quoted.Quotes#reflectModule#SourceFileMethods.getJPath"), - exclude[DirectMissingMethodProblem]("scala.quoted.Quotes#reflectModule#SourceFileMethods.name"), - exclude[DirectMissingMethodProblem]("scala.quoted.Quotes#reflectModule#SourceFileMethods.path"), - exclude[ReversedMissingMethodProblem]("scala.quoted.Quotes#reflectModule#UnapplyModule.apply"), - exclude[DirectMissingMethodProblem]("scala.quoted.Quotes#reflectModule#UnapplyModule.apply"), - exclude[ReversedMissingMethodProblem]("scala.quoted.Quotes#reflectModule.TypedOrTestTypeTest"), - exclude[ReversedMissingMethodProblem]("scala.quoted.Quotes#reflectModule.TypedOrTest"), - exclude[ReversedMissingMethodProblem]("scala.quoted.Quotes#reflectModule.TypedOrTestMethods"), - exclude[ReversedMissingMethodProblem]("scala.quoted.Quotes#reflectModule#TypeReprMethods.isTupleN"), - - // TODO: Remove those filters after releasing 3.1.0: - exclude[DirectMissingMethodProblem]("scala.CanEqual.canEqualSeqs"), - exclude[DirectMissingMethodProblem]("scala.CanEqual.canEqualOptions"), - exclude[DirectMissingMethodProblem]("scala.CanEqual.canEqualOption"), - exclude[DirectMissingMethodProblem]("scala.CanEqual.canEqualEither"), - exclude[DirectMissingMethodProblem]("scala.Tuple.canEqualEmptyTuple"), - exclude[DirectMissingMethodProblem]("scala.Tuple.canEqualTuple"), - exclude[DirectMissingMethodProblem]("scala.quoted.Quotes#reflectModule.WildcardTypeTest"), - exclude[DirectMissingMethodProblem]("scala.quoted.Quotes#reflectModule.Wildcard"), - exclude[DirectMissingMethodProblem]("scala.quoted.Quotes#reflectModule.TypedOrTestTypeTest"), - exclude[DirectMissingMethodProblem]("scala.quoted.Quotes#reflectModule.TypedOrTest"), - exclude[DirectMissingMethodProblem]("scala.quoted.Quotes#reflectModule.TypedOrTestMethods"), - exclude[DirectMissingMethodProblem]("scala.quoted.Quotes#reflectModule#TypeReprMethods.isTupleN"), - exclude[MissingClassProblem]("scala.quoted.Quotes$reflectModule$TypedOrTestMethods"), - exclude[MissingClassProblem]("scala.quoted.Quotes$reflectModule$TypedOrTestModule"), - exclude[MissingClassProblem]("scala.quoted.Quotes$reflectModule$WildcardModule"), - exclude[MissingClassProblem]("scala.runtime.$throws$package"), - exclude[MissingClassProblem]("scala.runtime.$throws$package$"), ) } diff --git a/tests/run/trait-static-forwarder.check b/tests/run/trait-static-forwarder.check new file mode 100644 index 000000000000..d81cc0710eb6 --- /dev/null +++ b/tests/run/trait-static-forwarder.check @@ -0,0 +1 @@ +42 diff --git a/tests/run/trait-static-forwarder/Test.java b/tests/run/trait-static-forwarder/Test.java new file mode 100644 index 000000000000..89012c016209 --- /dev/null +++ b/tests/run/trait-static-forwarder/Test.java @@ -0,0 +1,5 @@ +public final class Test { + public static void main(String... args) { + System.out.println(T.foo()); + } +} diff --git a/tests/run/trait-static-forwarder/forwarders.scala b/tests/run/trait-static-forwarder/forwarders.scala new file mode 100644 index 000000000000..d6ee9a081d02 --- /dev/null +++ b/tests/run/trait-static-forwarder/forwarders.scala @@ -0,0 +1,5 @@ +trait T + +object T { + def foo = 42 +}