Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade to latest scala versions #12401

Merged
merged 4 commits into from Feb 26, 2024
Merged

Conversation

@mkurz
Copy link
Member Author

mkurz commented Feb 26, 2024

@SethTisue Seems there is a problem... Not sure if MiMa needs to be adjusted?

If you run

sbt "Play / mimaReportBinaryIssues"

on this PR, you end up with:

[error] Play: Failed binary compatibility check against org.playframework:play_2.13:3.0.0! Found 3 potential problems (filtered 7)
[error]  * abstract method bindings(play.api.Environment,play.api.Configuration)scala.collection.Seq in class play.api.inject.Module does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectAbstractMethodProblem]("play.api.inject.Module.bindings")
[error]  * abstract method bindings(play.api.Environment,play.api.Configuration)scala.collection.Seq in class play.api.inject.Module does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectAbstractMethodProblem]("play.api.inject.Module.bindings")
[error]  * abstract method bindings(play.api.Environment,play.api.Configuration)scala.collection.Seq in class play.api.inject.Module does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectAbstractMethodProblem]("play.api.inject.Module.bindings")

It's complaining about:

def bindings(environment: Environment, configuration: Configuration): scala.collection.Seq[Binding[_]]

@sjrd
Copy link

sjrd commented Feb 26, 2024

Does it show up with javap -p? Or is it actually not there?

@lrytz
Copy link
Contributor

lrytz commented Feb 26, 2024

The MiMa error reproduces for me.

I compared ./core/play/target/scala-2.13/classes/play/api/inject/Module.class from this PR and its parent commit, and the classfiles are identical (byte for byte).

@mkurz
Copy link
Member Author

mkurz commented Feb 26, 2024

@lrytz @sjrd Please also take a look at ./core/play/target/scala-2.13/classes/play/api/inject/SimpleModule.class, those are not identical. That's probably why MiMa is complaining.

@SethTisue
Copy link
Member

useful command for exploring differences between the old and new version: first Play / package, then jardiff -c ~/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/playframework/play_2.13/3.0.0/play_2.13-3.0.0.jar ~/playframework/core/play/target/scala-2.13/play_2.13-3.0.2-SNAPSHOT.jar

diff --git play/api/inject/SimpleModule.class.asm play/api/inject/SimpleModule.class.asm
index 389eb7c..edfd7c6 100644
--- play/api/inject/SimpleModule.class.asm
+++ play/api/inject/SimpleModule.class.asm
@@ -21,7 +21,10 @@
   public <init>(Lscala/collection/immutable/Seq;)V
 
   // access flags 0x11
-  // signature (Lplay/api/Environment;Lplay/api/Configuration;)Lscala/collection/Seq<Lplay/api/inject/Binding<*>;>;
-  // declaration: scala.collection.Seq<play.api.inject.Binding<?>> bindings(play.api.Environment, play.api.Configuration)
-  public final bindings(Lplay/api/Environment;Lplay/api/Configuration;)Lscala/collection/Seq;
+  // signature (Lplay/api/Environment;Lplay/api/Configuration;)Lscala/collection/immutable/Seq<Lplay/api/inject/Binding<*>;>;
+  // declaration: scala.collection.immutable.Seq<play.api.inject.Binding<?>> bindings(play.api.Environment, play.api.Configuration)
+  public final bindings(Lplay/api/Environment;Lplay/api/Configuration;)Lscala/collection/immutable/Seq;
+
+  // access flags 0x1041
+  public synthetic bridge bindings(Lplay/api/Environment;Lplay/api/Configuration;)Lscala/collection/Seq;
 }
diff --git play/api/inject/SimpleModule.class.scalap play/api/inject/SimpleModule.class.scalap
index aa962b0..6aa4e30 100644
--- play/api/inject/SimpleModule.class.scalap
+++ play/api/inject/SimpleModule.class.scalap
@@ -2,5 +2,5 @@
 class SimpleModule extends play.api.inject.Module {
   def this(bindingsFunc: scala.Function2[play.api.Environment, play.api.Configuration, scala.Seq[play.api.inject.Binding[_]]]) = { /* compiled code */ }
   def this(bindings: play.api.inject.Binding[_]*) = { /* compiled code */ }
-  final override def bindings(environment: play.api.Environment, configuration: play.api.Configuration): scala.collection.Seq[play.api.inject.Binding[_]] = { /* compiled code */ }
+  final override def bindings(environment: play.api.Environment, configuration: play.api.Configuration): scala.Seq[play.api.inject.Binding[_]] = { /* compiled code */ }
 }

@SethTisue
Copy link
Member

There's a scala/collection/Seq vs scala/collection/immutable/Seq difference. Might it be due to a change in type inference?

@mkurz
Copy link
Member Author

mkurz commented Feb 26, 2024

Another observation:
Fails with Scala 2.13.13:

sbt "++2.13.x ; Play / mimaReportBinaryIssues"

Works with Scala 3.3.2:

sbt "++3.x ; Play / mimaReportBinaryIssues"

@mkurz
Copy link
Member Author

mkurz commented Feb 26, 2024

Explicitly defining the return type of the overridden bindings method fixes the problem:

diff --git a/core/play/src/main/scala/play/api/controllers/Assets.scala b/core/play/src/main/scala/play/api/controllers/Assets.scala
index 48ad96ba9b..67462d3547 100644
--- a/core/play/src/main/scala/play/api/controllers/Assets.scala
+++ b/core/play/src/main/scala/play/api/controllers/Assets.scala
@@ -32,6 +32,7 @@ import org.apache.pekko.stream.scaladsl.StreamConverters
 import play.api._
 import play.api.http._
 import play.api.inject.ApplicationLifecycle
+import play.api.inject.Binding
 import play.api.inject.Module
 import play.api.libs._
 import play.api.mvc._
@@ -42,7 +43,7 @@ import play.utils.Resources
 import play.utils.UriEncoding
 
 class AssetsModule extends Module {
-  override def bindings(environment: Environment, configuration: Configuration) = Seq(
+  override def bindings(environment: Environment, configuration: Configuration): scala.collection.Seq[Binding[_]] = Seq(
     bind[Assets].toSelf,
     bind[AssetsMetadata].toProvider[AssetsMetadataProvider],
     bind[AssetsFinder].toProvider[AssetsFinderProvider],
diff --git a/core/play/src/main/scala/play/api/i18n/I18nModule.scala b/core/play/src/main/scala/play/api/i18n/I18nModule.scala
index 61ccec8f6d..8daec41eee 100644
--- a/core/play/src/main/scala/play/api/i18n/I18nModule.scala
+++ b/core/play/src/main/scala/play/api/i18n/I18nModule.scala
@@ -5,12 +5,13 @@
 package play.api.i18n
 
 import play.api.http.HttpConfiguration
+import play.api.inject.Binding
 import play.api.inject.Module
 import play.api.Configuration
 import play.api.Environment
 
 class I18nModule extends Module {
-  def bindings(environment: Environment, configuration: Configuration) = {
+  def bindings(environment: Environment, configuration: Configuration): scala.collection.Seq[Binding[_]] = {
     Seq(
       bind[Langs].toProvider[DefaultLangsProvider],
       bind[MessagesApi].toProvider[DefaultMessagesApiProvider],
diff --git a/core/play/src/main/scala/play/api/inject/Module.scala b/core/play/src/main/scala/play/api/inject/Module.scala
index 7011c78542..b8c1f06ca7 100644
--- a/core/play/src/main/scala/play/api/inject/Module.scala
+++ b/core/play/src/main/scala/play/api/inject/Module.scala
@@ -90,7 +90,7 @@ abstract class Module {
 class SimpleModule(bindingsFunc: (Environment, Configuration) => Seq[Binding[_]]) extends Module {
   def this(bindings: Binding[_]*) = this((_, _) => bindings)
 
-  final override def bindings(environment: Environment, configuration: Configuration) =
+  final override def bindings(environment: Environment, configuration: Configuration): scala.collection.Seq[Binding[_]] =
     bindingsFunc(environment, configuration)
 }

@mkurz
Copy link
Member Author

mkurz commented Feb 26, 2024

Pushed the fix, should work now.

@SethTisue @lrytz @sjrd Is that a 2.13.13 release blocker?

Otherwise Scala 2.13.13 will create wrong bytecode
@sjrd
Copy link

sjrd commented Feb 26, 2024

Given the fix, it does look like a type inference change. Type inference is not guaranteed to never change, so IMO this is not a blocker.

@som-snytt
Copy link

som-snytt commented Feb 26, 2024

Looking at main, I see this is under -Xsource:3 which infers the method result from parent Module, so that is expected. The old behavior is to infer the result type from the RHS of the definition.

Under the revised option names, -Xsource:3-migration only warns and -Xsource:3-cross has different inference. IIRC. (Part of that contract is that if you want the cross behavior, you don't get a warning.) (Not sure offhand why Scala 3 would have a different result in this case, but in general Scala 2 won't always match what Scala 3 infers.)

EDIT: oh maybe you're going in the other direction, that is, your previous -Xsource:3 had the "new inference", but the flag was split as shown, and now -Xsource:3 means -Xsource:3-migration which only warns that the behavior changes. If you want the behavior, you must use -Xsource:3-cross (which theoretically improves cross-compiling with Scala 3).

@SethTisue
Copy link
Member

as suggested by Som, I've strengthened the wording about -Xsource:3 over at scala/scala-dev#861

@mkurz
Copy link
Member Author

mkurz commented Feb 26, 2024

Tried -Xsource:3-cross locally and that is a bit too aggressive for us right now:

Click to expand log
sbt:Play-Framework> mimaReportBinaryIssues
[info] Play-Bom: mimaPreviousArtifacts is empty, not analyzing binary compatibility.
[info] Play-Routes-Compiler: mimaPreviousArtifacts is empty, not analyzing binary compatibility.
[info] Sbt-Routes-Compiler: mimaPreviousArtifacts is empty, not analyzing binary compatibility.
[info] Play-Run-Support: mimaPreviousArtifacts is empty, not analyzing binary compatibility.
[info] compiling 1 Scala source to /home/mkurz/work/play/framework/play2-git/dev-mode/sbt-plugin/target/scala-2.12/sbt-1.0/classes ...
[error] Play-Guice: Failed binary compatibility check against org.playframework:play-guice_2.13:3.0.0! Found 6 potential problems
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.inject.guice.FakeRouterConfig does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.inject.guice.FakeRouterConfig.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.inject.guice.FakeRouterConfig does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.inject.guice.FakeRouterConfig.compose")
[error]  * the type hierarchy of object play.api.inject.guice.FakeRouterConfig is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.inject.guice.FakeRouterConfig$")
[error]  * static method tupled()scala.Function1 in class play.api.inject.guice.GuiceApplicationBuilder does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.inject.guice.GuiceApplicationBuilder.tupled")
[error]  * static method curried()scala.Function1 in class play.api.inject.guice.GuiceApplicationBuilder does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.inject.guice.GuiceApplicationBuilder.curried")
[error]  * the type hierarchy of object play.api.inject.guice.GuiceApplicationBuilder is different in current version. Missing types {scala.runtime.AbstractFunction9}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.inject.guice.GuiceApplicationBuilder$")
[error] Play-Server: Failed binary compatibility check against org.playframework:play-server_2.13:3.0.0! Found 16 potential problems
[error]  * static method tupled()scala.Function1 in class play.core.server.ServerEndpoint does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.core.server.ServerEndpoint.tupled")
[error]  * static method curried()scala.Function1 in class play.core.server.ServerEndpoint does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.core.server.ServerEndpoint.curried")
[error]  * the type hierarchy of object play.core.server.ServerEndpoint is different in current version. Missing types {scala.runtime.AbstractFunction7}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.server.ServerEndpoint$")
[error]  * the type hierarchy of object play.core.server.ServerProvider#Context is different in current version. Missing types {scala.runtime.AbstractFunction5}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.server.ServerProvider$Context$")
[error]  * static method tupled()scala.Function1 in class play.core.server.ServerStartException does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.core.server.ServerStartException.tupled")
[error]  * static method curried()scala.Function1 in class play.core.server.ServerStartException does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.core.server.ServerStartException.curried")
[error]  * the type hierarchy of object play.core.server.ServerStartException is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.server.ServerStartException$")
[error]  * the type hierarchy of object play.core.server.common.ForwardedHeaderHandler#ForwardedEntry is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.server.common.ForwardedHeaderHandler$ForwardedEntry$")
[error]  * the type hierarchy of object play.core.server.common.ForwardedHeaderHandler#ParsedForwardedEntry is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.server.common.ForwardedHeaderHandler$ParsedForwardedEntry$")
[error]  * the type hierarchy of object play.core.server.common.NodeIdentifierParser#Ip is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.server.common.NodeIdentifierParser$Ip$")
[error]  * the type hierarchy of object play.core.server.common.NodeIdentifierParser#ObfuscatedIp is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.server.common.NodeIdentifierParser$ObfuscatedIp$")
[error]  * the type hierarchy of object play.core.server.common.NodeIdentifierParser#ObfuscatedPort is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.server.common.NodeIdentifierParser$ObfuscatedPort$")
[error]  * the type hierarchy of object play.core.server.common.NodeIdentifierParser#PortNumber is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.server.common.NodeIdentifierParser$PortNumber$")
[error]  * the type hierarchy of object play.core.server.common.WebSocketFlowHandler#ClientInitiatedClose is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.server.common.WebSocketFlowHandler$ClientInitiatedClose$")
[error]  * the type hierarchy of object play.core.server.common.WebSocketFlowHandler#RawMessage is different in current version. Missing types {scala.runtime.AbstractFunction4}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.server.common.WebSocketFlowHandler$RawMessage$")
[error]  * the type hierarchy of object play.core.server.common.WebSocketFlowHandler#ServerInitiatingClose is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.server.common.WebSocketFlowHandler$ServerInitiatingClose$")
[error] Play-JDBC-Evolutions: Failed binary compatibility check against org.playframework:play-jdbc-evolutions_2.13:3.0.0! Found 18 potential problems
[error]  * static method tupled()scala.Function1 in class play.api.db.evolutions.DefaultEvolutionsDatasourceConfig does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.db.evolutions.DefaultEvolutionsDatasourceConfig.tupled")
[error]  * static method curried()scala.Function1 in class play.api.db.evolutions.DefaultEvolutionsDatasourceConfig does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.db.evolutions.DefaultEvolutionsDatasourceConfig.curried")
[error]  * the type hierarchy of object play.api.db.evolutions.DefaultEvolutionsDatasourceConfig is different in current version. Missing types {scala.runtime.AbstractFunction13}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.db.evolutions.DefaultEvolutionsDatasourceConfig$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.db.evolutions.DownScript does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.db.evolutions.DownScript.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.db.evolutions.DownScript does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.db.evolutions.DownScript.compose")
[error]  * the type hierarchy of object play.api.db.evolutions.DownScript is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.db.evolutions.DownScript$")
[error]  * static method tupled()scala.Function1 in class play.api.db.evolutions.Evolution does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.db.evolutions.Evolution.tupled")
[error]  * static method curried()scala.Function1 in class play.api.db.evolutions.Evolution does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.db.evolutions.Evolution.curried")
[error]  * the type hierarchy of object play.api.db.evolutions.Evolution is different in current version. Missing types {scala.runtime.AbstractFunction3}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.db.evolutions.Evolution$")
[error]  * static method tupled()scala.Function1 in class play.api.db.evolutions.InconsistentDatabase does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.db.evolutions.InconsistentDatabase.tupled")
[error]  * static method curried()scala.Function1 in class play.api.db.evolutions.InconsistentDatabase does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.db.evolutions.InconsistentDatabase.curried")
[error]  * the type hierarchy of object play.api.db.evolutions.InconsistentDatabase is different in current version. Missing types {scala.runtime.AbstractFunction5}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.db.evolutions.InconsistentDatabase$")
[error]  * static method tupled()scala.Function1 in class play.api.db.evolutions.InvalidDatabaseRevision does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.db.evolutions.InvalidDatabaseRevision.tupled")
[error]  * static method curried()scala.Function1 in class play.api.db.evolutions.InvalidDatabaseRevision does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.db.evolutions.InvalidDatabaseRevision.curried")
[error]  * the type hierarchy of object play.api.db.evolutions.InvalidDatabaseRevision is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.db.evolutions.InvalidDatabaseRevision$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.db.evolutions.UpScript does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.db.evolutions.UpScript.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.db.evolutions.UpScript does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.db.evolutions.UpScript.compose")
[error]  * the type hierarchy of object play.api.db.evolutions.UpScript is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.db.evolutions.UpScript$")
[error] Play-Netty-Server: Failed binary compatibility check against org.playframework:play-netty-server_2.13:3.0.0! Found 1 potential problems
[error]  * the type hierarchy of object play.core.server.netty.PlayRequestHandler#ReloadCacheValues is different in current version. Missing types {scala.runtime.AbstractFunction3}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.server.netty.PlayRequestHandler$ReloadCacheValues$")
[error] Play-Filters-Helpers: Failed binary compatibility check against org.playframework:play-filters-helpers_2.13:3.0.0! Found 25 potential problems
[error]  * the type hierarchy of object play.filters.cors.CORSConfig#Origins#Matching is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.filters.cors.CORSConfig$Origins$Matching$")
[error]  * static method tupled()scala.Function1 in class play.filters.csp.CSPDirective does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.filters.csp.CSPDirective.tupled")
[error]  * static method curried()scala.Function1 in class play.filters.csp.CSPDirective does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.filters.csp.CSPDirective.curried")
[error]  * the type hierarchy of object play.filters.csp.CSPDirective is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.filters.csp.CSPDirective$")
[error]  * static method tupled()scala.Function1 in class play.filters.csp.CSPHashConfig does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.filters.csp.CSPHashConfig.tupled")
[error]  * static method curried()scala.Function1 in class play.filters.csp.CSPHashConfig does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.filters.csp.CSPHashConfig.curried")
[error]  * the type hierarchy of object play.filters.csp.CSPHashConfig is different in current version. Missing types {scala.runtime.AbstractFunction3}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.filters.csp.CSPHashConfig$")
[error]  * static method tupled()scala.Function1 in class play.filters.csp.CSPNonceConfig does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.filters.csp.CSPNonceConfig.tupled")
[error]  * static method curried()scala.Function1 in class play.filters.csp.CSPNonceConfig does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.filters.csp.CSPNonceConfig.curried")
[error]  * the type hierarchy of object play.filters.csp.CSPNonceConfig is different in current version. Missing types {scala.runtime.AbstractFunction3}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.filters.csp.CSPNonceConfig$")
[error]  * static method tupled()scala.Function1 in class play.filters.csp.CSPResult does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.filters.csp.CSPResult.tupled")
[error]  * static method curried()scala.Function1 in class play.filters.csp.CSPResult does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.filters.csp.CSPResult.curried")
[error]  * the type hierarchy of object play.filters.csp.CSPResult is different in current version. Missing types {scala.runtime.AbstractFunction4}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.filters.csp.CSPResult$")
[error]  * static method tupled()scala.Function1 in class play.filters.csrf.CSRFAddToken does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.filters.csrf.CSRFAddToken.tupled")
[error]  * static method curried()scala.Function1 in class play.filters.csrf.CSRFAddToken does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.filters.csrf.CSRFAddToken.curried")
[error]  * the type hierarchy of object play.filters.csrf.CSRFAddToken is different in current version. Missing types {scala.runtime.AbstractFunction3}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.filters.csrf.CSRFAddToken$")
[error]  * static method tupled()scala.Function1 in class play.filters.csrf.CSRFCheck does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.filters.csrf.CSRFCheck.tupled")
[error]  * static method curried()scala.Function1 in class play.filters.csrf.CSRFCheck does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.filters.csrf.CSRFCheck.curried")
[error]  * the type hierarchy of object play.filters.csrf.CSRFCheck is different in current version. Missing types {scala.runtime.AbstractFunction3}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.filters.csrf.CSRFCheck$")
[error]  * static method tupled()scala.Function1 in class play.filters.hosts.AllowedHostsFilter does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.filters.hosts.AllowedHostsFilter.tupled")
[error]  * static method curried()scala.Function1 in class play.filters.hosts.AllowedHostsFilter does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.filters.hosts.AllowedHostsFilter.curried")
[error]  * the type hierarchy of object play.filters.hosts.AllowedHostsFilter is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.filters.hosts.AllowedHostsFilter$")
[error]  * static method tupled()scala.Function1 in class play.filters.https.RedirectHttpsConfiguration does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.filters.https.RedirectHttpsConfiguration.tupled")
[error]  * static method curried()scala.Function1 in class play.filters.https.RedirectHttpsConfiguration does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.filters.https.RedirectHttpsConfiguration.curried")
[error]  * the type hierarchy of object play.filters.https.RedirectHttpsConfiguration is different in current version. Missing types {scala.runtime.AbstractFunction6}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.filters.https.RedirectHttpsConfiguration$")
[error] Play: Failed binary compatibility check against org.playframework:play_2.13:3.0.0! Found 158 potential problems
[error]  * static method tupled()scala.Function1 in class controllers.AssetsConfigurationProvider does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("controllers.AssetsConfigurationProvider.tupled")
[error]  * static method curried()scala.Function1 in class controllers.AssetsConfigurationProvider does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("controllers.AssetsConfigurationProvider.curried")
[error]  * the type hierarchy of object controllers.AssetsConfigurationProvider is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("controllers.AssetsConfigurationProvider$")
[error]  * the type hierarchy of object play.api.ApplicationLoader#DevContext is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.ApplicationLoader$DevContext$")
[error]  * static method tupled()scala.Function1 in class play.api.UnexpectedException does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.UnexpectedException.tupled")
[error]  * static method curried()scala.Function1 in class play.api.UnexpectedException does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.UnexpectedException.curried")
[error]  * the type hierarchy of object play.api.UnexpectedException is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.UnexpectedException$")
[error]  * static method tupled()scala.Function1 in class play.api.data.Field does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.data.Field.tupled")
[error]  * static method curried()scala.Function1 in class play.api.data.Field does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.data.Field.curried")
[error]  * the type hierarchy of object play.api.data.Field is different in current version. Missing types {scala.runtime.AbstractFunction6}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.data.Field$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.data.FormJsonExpansionTooDeep does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.data.FormJsonExpansionTooDeep.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.data.FormJsonExpansionTooDeep does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.data.FormJsonExpansionTooDeep.compose")
[error]  * the type hierarchy of object play.api.data.FormJsonExpansionTooDeep is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.data.FormJsonExpansionTooDeep$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.data.FormJsonExpansionTooLarge does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.data.FormJsonExpansionTooLarge.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.data.FormJsonExpansionTooLarge does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.data.FormJsonExpansionTooLarge.compose")
[error]  * the type hierarchy of object play.api.data.FormJsonExpansionTooLarge is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.data.FormJsonExpansionTooLarge$")
[error]  * the type hierarchy of object play.api.data.FormUtils#FromJsonArray is different in current version. Missing types {scala.runtime.AbstractFunction3}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.data.FormUtils$FromJsonArray$")
[error]  * the type hierarchy of object play.api.data.FormUtils#FromJsonObject is different in current version. Missing types {scala.runtime.AbstractFunction3}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.data.FormUtils$FromJsonObject$")
[error]  * the type hierarchy of object play.api.data.FormUtils#FromJsonRoot is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.data.FormUtils$FromJsonRoot$")
[error]  * static method tupled()scala.Function1 in class play.api.http.ActionCompositionConfiguration does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.ActionCompositionConfiguration.tupled")
[error]  * static method curried()scala.Function1 in class play.api.http.ActionCompositionConfiguration does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.ActionCompositionConfiguration.curried")
[error]  * the type hierarchy of object play.api.http.ActionCompositionConfiguration is different in current version. Missing types {scala.runtime.AbstractFunction3}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.ActionCompositionConfiguration$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.http.CookiesConfiguration does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.CookiesConfiguration.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.http.CookiesConfiguration does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.CookiesConfiguration.compose")
[error]  * the type hierarchy of object play.api.http.CookiesConfiguration is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.CookiesConfiguration$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.http.FileMimeTypesConfiguration does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.FileMimeTypesConfiguration.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.http.FileMimeTypesConfiguration does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.FileMimeTypesConfiguration.compose")
[error]  * the type hierarchy of object play.api.http.FileMimeTypesConfiguration is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.FileMimeTypesConfiguration$")
[error]  * static method tupled()scala.Function1 in class play.api.http.FlashConfiguration does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.FlashConfiguration.tupled")
[error]  * static method curried()scala.Function1 in class play.api.http.FlashConfiguration does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.FlashConfiguration.curried")
[error]  * the type hierarchy of object play.api.http.FlashConfiguration is different in current version. Missing types {scala.runtime.AbstractFunction7}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.FlashConfiguration$")
[error]  * the type hierarchy of object play.api.http.HttpChunk#Chunk is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.HttpChunk$Chunk$")
[error]  * the type hierarchy of object play.api.http.HttpChunk#LastChunk is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.HttpChunk$LastChunk$")
[error]  * the type hierarchy of object play.api.http.HttpEntity#Chunked is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.HttpEntity$Chunked$")
[error]  * the type hierarchy of object play.api.http.HttpEntity#Streamed is different in current version. Missing types {scala.runtime.AbstractFunction3}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.HttpEntity$Streamed$")
[error]  * the type hierarchy of object play.api.http.HttpEntity#Strict is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.HttpEntity$Strict$")
[error]  * static method tupled()scala.Function1 in class play.api.http.HttpErrorConfig does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.HttpErrorConfig.tupled")
[error]  * static method curried()scala.Function1 in class play.api.http.HttpErrorConfig does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.HttpErrorConfig.curried")
[error]  * the type hierarchy of object play.api.http.HttpErrorConfig is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.HttpErrorConfig$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.http.HttpErrorInfo does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.HttpErrorInfo.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.http.HttpErrorInfo does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.HttpErrorInfo.compose")
[error]  * the type hierarchy of object play.api.http.HttpErrorInfo is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.HttpErrorInfo$")
[error]  * static method tupled()scala.Function1 in class play.api.http.JWTConfiguration does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.JWTConfiguration.tupled")
[error]  * static method curried()scala.Function1 in class play.api.http.JWTConfiguration does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.JWTConfiguration.curried")
[error]  * the type hierarchy of object play.api.http.JWTConfiguration is different in current version. Missing types {scala.runtime.AbstractFunction4}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.JWTConfiguration$")
[error]  * static method tupled()scala.Function1 in class play.api.http.ParserConfiguration does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.ParserConfiguration.tupled")
[error]  * static method curried()scala.Function1 in class play.api.http.ParserConfiguration does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.ParserConfiguration.curried")
[error]  * the type hierarchy of object play.api.http.ParserConfiguration is different in current version. Missing types {scala.runtime.AbstractFunction3}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.ParserConfiguration$")
[error]  * static method tupled()scala.Function1 in class play.api.http.SecretConfiguration does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.SecretConfiguration.tupled")
[error]  * static method curried()scala.Function1 in class play.api.http.SecretConfiguration does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.SecretConfiguration.curried")
[error]  * the type hierarchy of object play.api.http.SecretConfiguration is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.SecretConfiguration$")
[error]  * static method tupled()scala.Function1 in class play.api.http.SessionConfiguration does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.SessionConfiguration.tupled")
[error]  * static method curried()scala.Function1 in class play.api.http.SessionConfiguration does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.SessionConfiguration.curried")
[error]  * the type hierarchy of object play.api.http.SessionConfiguration is different in current version. Missing types {scala.runtime.AbstractFunction8}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.SessionConfiguration$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.http.websocket.BinaryMessage does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.websocket.BinaryMessage.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.http.websocket.BinaryMessage does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.websocket.BinaryMessage.compose")
[error]  * the type hierarchy of object play.api.http.websocket.BinaryMessage is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.websocket.BinaryMessage$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.http.websocket.PingMessage does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.websocket.PingMessage.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.http.websocket.PingMessage does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.websocket.PingMessage.compose")
[error]  * the type hierarchy of object play.api.http.websocket.PingMessage is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.websocket.PingMessage$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.http.websocket.PongMessage does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.websocket.PongMessage.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.http.websocket.PongMessage does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.websocket.PongMessage.compose")
[error]  * the type hierarchy of object play.api.http.websocket.PongMessage is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.websocket.PongMessage$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.http.websocket.TextMessage does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.websocket.TextMessage.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.http.websocket.TextMessage does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.websocket.TextMessage.compose")
[error]  * the type hierarchy of object play.api.http.websocket.TextMessage is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.websocket.TextMessage$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.http.websocket.WebSocketCloseException does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.websocket.WebSocketCloseException.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.http.websocket.WebSocketCloseException does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.http.websocket.WebSocketCloseException.compose")
[error]  * the type hierarchy of object play.api.http.websocket.WebSocketCloseException is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.http.websocket.WebSocketCloseException$")
[error]  * the type hierarchy of object play.api.i18n.Messages#MessagesParser#Comment is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.i18n.Messages$MessagesParser$Comment$")
[error]  * the type hierarchy of object play.api.i18n.Messages#UrlMessageSource is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.i18n.Messages$UrlMessageSource$")
[error]  * static method tupled()scala.Function1 in class play.api.i18n.MessagesImpl does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.i18n.MessagesImpl.tupled")
[error]  * static method curried()scala.Function1 in class play.api.i18n.MessagesImpl does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.i18n.MessagesImpl.curried")
[error]  * the type hierarchy of object play.api.i18n.MessagesImpl is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.i18n.MessagesImpl$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.mvc.Accepting does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.Accepting.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.mvc.Accepting does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.Accepting.compose")
[error]  * the type hierarchy of object play.api.mvc.Accepting is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.Accepting$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.mvc.AnyContentAsFormUrlEncoded does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.AnyContentAsFormUrlEncoded.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.mvc.AnyContentAsFormUrlEncoded does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.AnyContentAsFormUrlEncoded.compose")
[error]  * the type hierarchy of object play.api.mvc.AnyContentAsFormUrlEncoded is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.AnyContentAsFormUrlEncoded$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.mvc.AnyContentAsJson does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.AnyContentAsJson.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.mvc.AnyContentAsJson does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.AnyContentAsJson.compose")
[error]  * the type hierarchy of object play.api.mvc.AnyContentAsJson is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.AnyContentAsJson$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.mvc.AnyContentAsMultipartFormData does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.AnyContentAsMultipartFormData.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.mvc.AnyContentAsMultipartFormData does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.AnyContentAsMultipartFormData.compose")
[error]  * the type hierarchy of object play.api.mvc.AnyContentAsMultipartFormData is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.AnyContentAsMultipartFormData$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.mvc.AnyContentAsRaw does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.AnyContentAsRaw.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.mvc.AnyContentAsRaw does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.AnyContentAsRaw.compose")
[error]  * the type hierarchy of object play.api.mvc.AnyContentAsRaw is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.AnyContentAsRaw$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.mvc.AnyContentAsText does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.AnyContentAsText.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.mvc.AnyContentAsText does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.AnyContentAsText.compose")
[error]  * the type hierarchy of object play.api.mvc.AnyContentAsText is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.AnyContentAsText$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.mvc.AnyContentAsXml does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.AnyContentAsXml.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.mvc.AnyContentAsXml does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.AnyContentAsXml.compose")
[error]  * the type hierarchy of object play.api.mvc.AnyContentAsXml is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.AnyContentAsXml$")
[error]  * static method tupled()scala.Function1 in class play.api.mvc.Call does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.Call.tupled")
[error]  * static method curried()scala.Function1 in class play.api.mvc.Call does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.Call.curried")
[error]  * the type hierarchy of object play.api.mvc.Call is different in current version. Missing types {scala.runtime.AbstractFunction3}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.Call$")
[error]  * static method tupled()scala.Function1 in class play.api.mvc.DefaultControllerComponents does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.DefaultControllerComponents.tupled")
[error]  * static method curried()scala.Function1 in class play.api.mvc.DefaultControllerComponents does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.DefaultControllerComponents.curried")
[error]  * the type hierarchy of object play.api.mvc.DefaultControllerComponents is different in current version. Missing types {scala.runtime.AbstractFunction6}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.DefaultControllerComponents$")
[error]  * static method tupled()scala.Function1 in class play.api.mvc.DefaultJWTCookieDataCodec does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.DefaultJWTCookieDataCodec.tupled")
[error]  * static method curried()scala.Function1 in class play.api.mvc.DefaultJWTCookieDataCodec does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.DefaultJWTCookieDataCodec.curried")
[error]  * the type hierarchy of object play.api.mvc.DefaultJWTCookieDataCodec is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.DefaultJWTCookieDataCodec$")
[error]  * static method tupled()scala.Function1 in class play.api.mvc.DefaultMessagesControllerComponents does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.DefaultMessagesControllerComponents.tupled")
[error]  * static method curried()scala.Function1 in class play.api.mvc.DefaultMessagesControllerComponents does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.DefaultMessagesControllerComponents.curried")
[error]  * the type hierarchy of object play.api.mvc.DefaultMessagesControllerComponents is different in current version. Missing types {scala.runtime.AbstractFunction7}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.DefaultMessagesControllerComponents$")
[error]  * static method tupled()scala.Function1 in class play.api.mvc.DefaultUrlEncodedCookieDataCodec does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.DefaultUrlEncodedCookieDataCodec.tupled")
[error]  * static method curried()scala.Function1 in class play.api.mvc.DefaultUrlEncodedCookieDataCodec does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.DefaultUrlEncodedCookieDataCodec.curried")
[error]  * the type hierarchy of object play.api.mvc.DefaultUrlEncodedCookieDataCodec is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.DefaultUrlEncodedCookieDataCodec$")
[error]  * static method tupled()scala.Function1 in class play.api.mvc.DiscardingCookie does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.DiscardingCookie.tupled")
[error]  * static method curried()scala.Function1 in class play.api.mvc.DiscardingCookie does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.DiscardingCookie.curried")
[error]  * the type hierarchy of object play.api.mvc.DiscardingCookie is different in current version. Missing types {scala.runtime.AbstractFunction5}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.DiscardingCookie$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.mvc.MaxSizeExceeded does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.MaxSizeExceeded.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.mvc.MaxSizeExceeded does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.MaxSizeExceeded.compose")
[error]  * the type hierarchy of object play.api.mvc.MaxSizeExceeded is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.MaxSizeExceeded$")
[error]  * the type hierarchy of object play.api.mvc.MultipartFormData#BadPart is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.MultipartFormData$BadPart$")
[error]  * the type hierarchy of object play.api.mvc.MultipartFormData#DataPart is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.MultipartFormData$DataPart$")
[error]  * the type hierarchy of object play.api.mvc.MultipartFormData#MaxMemoryBufferExceeded is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.MultipartFormData$MaxMemoryBufferExceeded$")
[error]  * the type hierarchy of object play.api.mvc.MultipartFormData#ParseError is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.MultipartFormData$ParseError$")
[error]  * static method tupled()scala.Function1 in class play.api.mvc.RawBuffer does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.RawBuffer.tupled")
[error]  * static method curried()scala.Function1 in class play.api.mvc.RawBuffer does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.mvc.RawBuffer.curried")
[error]  * the type hierarchy of object play.api.mvc.RawBuffer is different in current version. Missing types {scala.runtime.AbstractFunction3}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.RawBuffer$")
[error]  * the type hierarchy of object play.api.mvc.Results#EmptyContent is different in current version. Missing types {scala.runtime.AbstractFunction0}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.mvc.Results$EmptyContent$")
[error]  * static method tupled()scala.Function1 in class play.api.routing.HandlerDef does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.routing.HandlerDef.tupled")
[error]  * static method curried()scala.Function1 in class play.api.routing.HandlerDef does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.routing.HandlerDef.curried")
[error]  * the type hierarchy of object play.api.routing.HandlerDef is different in current version. Missing types {scala.runtime.AbstractFunction9}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.routing.HandlerDef$")
[error]  * static method tupled()scala.Function1 in class play.api.routing.JavaScriptReverseRoute does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.routing.JavaScriptReverseRoute.tupled")
[error]  * static method curried()scala.Function1 in class play.api.routing.JavaScriptReverseRoute does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.routing.JavaScriptReverseRoute.curried")
[error]  * the type hierarchy of object play.api.routing.JavaScriptReverseRoute is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.routing.JavaScriptReverseRoute$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.core.NamedThreadFactory does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.core.NamedThreadFactory.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.core.NamedThreadFactory does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.core.NamedThreadFactory.compose")
[error]  * the type hierarchy of object play.core.NamedThreadFactory is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.NamedThreadFactory$")
[error]  * the type hierarchy of object play.core.parsers.Multipart#FileInfo is different in current version. Missing types {scala.runtime.AbstractFunction4}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.parsers.Multipart$FileInfo$")
[error]  * static method tupled()scala.Function1 in class play.core.routing.DynamicPart does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.core.routing.DynamicPart.tupled")
[error]  * static method curried()scala.Function1 in class play.core.routing.DynamicPart does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.core.routing.DynamicPart.curried")
[error]  * the type hierarchy of object play.core.routing.DynamicPart is different in current version. Missing types {scala.runtime.AbstractFunction3}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.routing.DynamicPart$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.core.routing.PathPattern does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.core.routing.PathPattern.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.core.routing.PathPattern does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.core.routing.PathPattern.compose")
[error]  * the type hierarchy of object play.core.routing.PathPattern is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.routing.PathPattern$")
[error]  * static method tupled()scala.Function1 in class play.core.routing.RouteParams does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.core.routing.RouteParams.tupled")
[error]  * static method curried()scala.Function1 in class play.core.routing.RouteParams does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.core.routing.RouteParams.curried")
[error]  * the type hierarchy of object play.core.routing.RouteParams is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.routing.RouteParams$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.core.routing.StaticPart does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.core.routing.StaticPart.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.core.routing.StaticPart does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.core.routing.StaticPart.compose")
[error]  * the type hierarchy of object play.core.routing.StaticPart is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.routing.StaticPart$")
[error]  * static method tupled()scala.Function1 in class play.utils.KeyRead does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.utils.KeyRead.tupled")
[error]  * static method curried()scala.Function1 in class play.utils.KeyRead does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.utils.KeyRead.curried")
[error]  * the type hierarchy of object play.utils.KeyRead is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.utils.KeyRead$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.utils.ReadingList does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.utils.ReadingList.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.utils.ReadingList does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.utils.ReadingList.compose")
[error]  * the type hierarchy of object play.utils.ReadingList is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.utils.ReadingList$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.utils.ReadingMap does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.utils.ReadingMap.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.utils.ReadingMap does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.utils.ReadingMap.compose")
[error]  * the type hierarchy of object play.utils.ReadingMap is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.utils.ReadingMap$")
[error]  * static method tupled()scala.Function1 in class views.html.helper.FieldElements does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("views.html.helper.FieldElements.tupled")
[error]  * static method curried()scala.Function1 in class views.html.helper.FieldElements does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("views.html.helper.FieldElements.curried")
[error]  * the type hierarchy of object views.html.helper.FieldElements is different in current version. Missing types {scala.runtime.AbstractFunction5}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("views.html.helper.FieldElements$")
[info] Play-Microbenchmark: mimaPreviousArtifacts is empty, not analyzing binary compatibility.
[info] Play-Integration-Test: mimaPreviousArtifacts is empty, not analyzing binary compatibility.
[error] Play-AHC-WS: Failed binary compatibility check against org.playframework:play-ahc-ws_2.13:3.0.0! Found 7 potential problems
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.libs.ws.ahc.AhcWSRequest does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.libs.ws.ahc.AhcWSRequest.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.libs.ws.ahc.AhcWSRequest does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.libs.ws.ahc.AhcWSRequest.compose")
[error]  * the type hierarchy of object play.api.libs.ws.ahc.AhcWSRequest is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.libs.ws.ahc.AhcWSRequest$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.libs.ws.ahc.AhcWSResponse does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.libs.ws.ahc.AhcWSResponse.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.libs.ws.ahc.AhcWSResponse does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.libs.ws.ahc.AhcWSResponse.compose")
[error]  * the type hierarchy of object play.api.libs.ws.ahc.AhcWSResponse is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.libs.ws.ahc.AhcWSResponse$")
[error]  * the type hierarchy of object play.api.libs.ws.ahc.OptionalAhcHttpCacheProvider#AhcHttpCacheConfiguration is different in current version. Missing types {scala.runtime.AbstractFunction5}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.libs.ws.ahc.OptionalAhcHttpCacheProvider$AhcHttpCacheConfiguration$")
[error] Play-Pekko-Http-Server: Failed binary compatibility check against org.playframework:play-pekko-http-server_2.13:3.0.0! Found 2 potential problems
[error]  * the type hierarchy of object org.apache.pekko.http.play.WebSocketHandler#Frame is different in current version. Missing types {scala.runtime.AbstractFunction2}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("org.apache.pekko.http.play.WebSocketHandler$Frame$")
[error]  * the type hierarchy of object play.core.server.PekkoHttpServer#ReloadCacheValues is different in current version. Missing types {scala.runtime.AbstractFunction3}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.core.server.PekkoHttpServer$ReloadCacheValues$")
[error] Play-OpenID: Failed binary compatibility check against org.playframework:play-openid_2.13:3.0.0! Found 4 potential problems
[error]  * static method tupled()scala.Function1 in class play.api.libs.openid.OpenIDServer does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.libs.openid.OpenIDServer.tupled")
[error]  * static method curried()scala.Function1 in class play.api.libs.openid.OpenIDServer does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.libs.openid.OpenIDServer.curried")
[error]  * the type hierarchy of object play.api.libs.openid.OpenIDServer is different in current version. Missing types {scala.runtime.AbstractFunction3}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.libs.openid.OpenIDServer$")
[error]  * the type hierarchy of object play.api.libs.openid.WsDiscovery#UrlIdentifier is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.libs.openid.WsDiscovery$UrlIdentifier$")
[error] Play-Test: Failed binary compatibility check against org.playframework:play-test_2.13:3.0.0! Found 7 potential problems
[error]  * the type hierarchy of object play.api.test.DefaultAwaitTimeout#NegativeTimeout is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.test.DefaultAwaitTimeout$NegativeTimeout$")
[error]  * static method andThen(scala.Function1)scala.Function1 in class play.api.test.FakeHeaders does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.test.FakeHeaders.andThen")
[error]  * static method compose(scala.Function1)scala.Function1 in class play.api.test.FakeHeaders does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.test.FakeHeaders.compose")
[error]  * the type hierarchy of object play.api.test.FakeHeaders is different in current version. Missing types {scala.runtime.AbstractFunction1}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.test.FakeHeaders$")
[error]  * static method tupled()scala.Function1 in class play.api.test.RunningServer does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.test.RunningServer.tupled")
[error]  * static method curried()scala.Function1 in class play.api.test.RunningServer does not have a correspondent in current version
[error]    filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("play.api.test.RunningServer.curried")
[error]  * the type hierarchy of object play.api.test.RunningServer is different in current version. Missing types {scala.runtime.AbstractFunction3}
[error]    filter with: ProblemFilters.exclude[MissingTypesProblem]("play.api.test.RunningServer$")
[info] Sbt-Plugin: mimaPreviousArtifacts is empty, not analyzing binary compatibility.
[info] Sbt-Scripted-Tools: mimaPreviousArtifacts is empty, not analyzing binary compatibility.
[info] Play-Docs-Sbt-Plugin: mimaPreviousArtifacts is empty, not analyzing binary compatibility.
[error] stack trace is suppressed; run last Play-Pekko-Http-Server / mimaReportBinaryIssues for the full output
[error] stack trace is suppressed; run last Play-Guice / mimaReportBinaryIssues for the full output
[error] stack trace is suppressed; run last Play-Filters-Helpers / mimaReportBinaryIssues for the full output
[error] stack trace is suppressed; run last Play-JDBC-Evolutions / mimaReportBinaryIssues for the full output
[error] stack trace is suppressed; run last Play-AHC-WS / mimaReportBinaryIssues for the full output
[error] stack trace is suppressed; run last Play-Test / mimaReportBinaryIssues for the full output
[error] stack trace is suppressed; run last Play / mimaReportBinaryIssues for the full output
[error] stack trace is suppressed; run last Play-Netty-Server / mimaReportBinaryIssues for the full output
[error] stack trace is suppressed; run last Play-OpenID / mimaReportBinaryIssues for the full output
[error] stack trace is suppressed; run last Play-Server / mimaReportBinaryIssues for the full output
[error] (Play-Pekko-Http-Server / mimaReportBinaryIssues) Failed binary compatibility check against org.playframework:play-pekko-http-server_2.13:3.0.0! Found 2 potential problems
[error] (Play-Guice / mimaReportBinaryIssues) Failed binary compatibility check against org.playframework:play-guice_2.13:3.0.0! Found 6 potential problems
[error] (Play-Filters-Helpers / mimaReportBinaryIssues) Failed binary compatibility check against org.playframework:play-filters-helpers_2.13:3.0.0! Found 25 potential problems
[error] (Play-JDBC-Evolutions / mimaReportBinaryIssues) Failed binary compatibility check against org.playframework:play-jdbc-evolutions_2.13:3.0.0! Found 18 potential problems
[error] (Play-AHC-WS / mimaReportBinaryIssues) Failed binary compatibility check against org.playframework:play-ahc-ws_2.13:3.0.0! Found 7 potential problems
[error] (Play-Test / mimaReportBinaryIssues) Failed binary compatibility check against org.playframework:play-test_2.13:3.0.0! Found 7 potential problems
[error] (Play / mimaReportBinaryIssues) Failed binary compatibility check against org.playframework:play_2.13:3.0.0! Found 158 potential problems
[error] (Play-Netty-Server / mimaReportBinaryIssues) Failed binary compatibility check against org.playframework:play-netty-server_2.13:3.0.0! Found 1 potential problems
[error] (Play-OpenID / mimaReportBinaryIssues) Failed binary compatibility check against org.playframework:play-openid_2.13:3.0.0! Found 4 potential problems
[error] (Play-Server / mimaReportBinaryIssues) Failed binary compatibility check against org.playframework:play-server_2.13:3.0.0! Found 16 potential problems
[error] Total time: 4 s, completed Feb 26, 2024, 9:25:44 PM

We don't want to introduce that much incompatibilities right now for existing 2.13.x users, so I just keep my original "fix" in place instead.
We might switch to -Xsource:3-cross later however.

@mkurz mkurz added this to the 2.9.2 / 3.0.2 milestone Feb 26, 2024
@mkurz mkurz merged commit 552f5a0 into playframework:main Feb 26, 2024
25 checks passed
@mkurz mkurz deleted the scala_upgrades branch February 26, 2024 21:55
@mkurz
Copy link
Member Author

mkurz commented Feb 26, 2024

@Mergifyio backport 2.9.x

Copy link
Contributor

mergify bot commented Feb 26, 2024

backport 2.9.x

✅ Backports have been created

mkurz added a commit that referenced this pull request Feb 26, 2024
[2.9.x] Upgrade to latest scala versions (backport #12401) by @mkurz
@lrytz
Copy link
Contributor

lrytz commented Feb 27, 2024

Tried -Xsource:3-cross locally and that is a bit too aggressive for us right now:

@mkurz with -Xsource:3 the compiler emits a warning for each of these cases. So it should be fairly easy to find the spots where an explicit return type needs to be added, in case you want to switch to -Xsource:3-cross.

➜ scala13 s -Xsource:3
Welcome to Scala 2.13.13 -Xsource:3.0.0 (OpenJDK 64-Bit Server VM, Java 21.0.1).
Type in expressions for evaluation. Or try :help.

scala> trait T { def f: Object }
scala> class C extends T { def f = "" }
                               ^
       error: under -Xsource:3-cross, the inferred type changes to Object instead of String [quickfixable]
       Scala 3 migration messages are errors under -Xsource:3. Use -Wconf / @nowarn to filter them or add -Xmigration to demote them to warnings.
       Applicable -Wconf / @nowarn filters for this fatal warning: msg=<part of the message>, cat=scala3-migration, site=C.f

➜ scala13 s -Xsource:3-cross
Welcome to Scala 2.13.13 -Xsource:3-cross (OpenJDK 64-Bit Server VM, Java 21.0.1).
Type in expressions for evaluation. Or try :help.

scala> trait T { def f: Object }
scala> class C extends T { def f = "" }
scala> (new C).f
val res0: Object = "" // static type Object

@mkurz
Copy link
Member Author

mkurz commented Feb 27, 2024

@lrytz I understand that. What I meant in #12401 (comment) (if you look at the logs) is that -Xsource:3-cross changes much more than we currently desire. Like it "rewrites" much more to Scala 3 conform bytecode than we want currently, because we don't want to break compatibility for 2.13 artifacts at this point.

@lrytz
Copy link
Contributor

lrytz commented Feb 27, 2024

Ah, I didn't look closely enough, thanks.

So this is a scenario we didn't consider (cc @SethTisue, @som-snytt). Under -Xsource:3-cross the compiler no longer adds the Function parent to the case class companion (scala/scala#10648). In order to move a project to -Xsource:3-cross but keep the 2.13 artifacts binary compatible, one would need to spell out the companion manually

case class A(x: Int)
object A extends scala.runtime.AbstractFunction1[Int, A] {
  final override def toString = "A"
}

But applying that change to the source code changes the bytecode produced by Scala 3. How can a project move to -Xsource:3-cross?

@SethTisue
Copy link
Member

SethTisue commented Feb 27, 2024

Lukas and I were just discussing this. Lukas will open a scala/bug ticket today with details and we'll consider how to handle this. It seems we'll need to roll 2.13.14 before long in order to address this, since we don't see any workaround for existing users of -Xsource:3 who need to switch -Xsource:3-cross while maintaining bincompat.

Anyway, let's discuss on the scala/bug ticket.

(UPDATE: ticket is scala/bug#12961)

@mkurz
Copy link
Member Author

mkurz commented Feb 27, 2024

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants