This is an automated email from the ASF dual-hosted git repository.
He-Pin pushed a commit to branch scala3-upgrade-fix-warnings
in repository https://gitbox.apache.org/repos/asf/pekko.git
The following commit(s) were added to refs/heads/scala3-upgrade-fix-warnings by
this push:
new 7aa70e9fc5 refactor: improve Scala 3.8 compatibility changes with code
simplifications
7aa70e9fc5 is described below
commit 7aa70e9fc5a412bc31479b1261842bf0743d44ef
Author: He-Pin <[email protected]>
AuthorDate: Sun Jun 14 03:13:01 2026 +0800
refactor: improve Scala 3.8 compatibility changes with code simplifications
Motivation:
The initial Scala 3.8 compatibility changes had some code duplication,
unnecessary type casts, and could be simplified in several places.
Modification:
- Extract shared isScala3_8Plus method in JdkOptions to eliminate
duplication with Jdk9.scala
- Re-add Scala 3.8 -Wconf suppressions in PekkoDisciplinePlugin with
deduplication using shared scala3Suppressions/scala3DocSuppressions
- Simplify BehaviorTestKitSpec messageAdapter by removing unnecessary
asInstanceOf and using proper ClassTag[U] type parameter
- Simplify ActorContextSpec ClassTag.Null passing by using explicit
parameter instead of implicit val with @nowarn
Result:
Cleaner, more maintainable Scala 3.8 compatibility code with less
duplication and unnecessary type casts.
Tests:
Not run - code simplifications only, no behavior changes
References:
Refs #3060
---
.../typed/scaladsl/BehaviorTestKitSpec.scala | 4 +-
.../pekko/actor/typed/ActorContextSpec.scala | 3 +-
project/Jdk9.scala | 8 +---
project/JdkOptions.scala | 8 ++--
project/PekkoDisciplinePlugin.scala | 52 ++++++++++++++--------
5 files changed, 42 insertions(+), 33 deletions(-)
diff --git
a/actor-testkit-typed/src/test/scala/org/apache/pekko/actor/testkit/typed/scaladsl/BehaviorTestKitSpec.scala
b/actor-testkit-typed/src/test/scala/org/apache/pekko/actor/testkit/typed/scaladsl/BehaviorTestKitSpec.scala
index 7a5db84466..f7bd2df077 100644
---
a/actor-testkit-typed/src/test/scala/org/apache/pekko/actor/testkit/typed/scaladsl/BehaviorTestKitSpec.scala
+++
b/actor-testkit-typed/src/test/scala/org/apache/pekko/actor/testkit/typed/scaladsl/BehaviorTestKitSpec.scala
@@ -126,8 +126,8 @@ object BehaviorTestKitSpec {
replyTo ! Done
Behaviors.same
case CreateMessageAdapter(messageClass, f, replyTo) =>
- implicit val ct: ClassTag[Any] = ClassTag(messageClass)
- val adaptor = context.messageAdapter[Any](f.asInstanceOf[Any =>
Command])
+ implicit val ct: ClassTag[U] = ClassTag(messageClass)
+ val adaptor = context.messageAdapter(f)
replyTo.foreach(_ ! adaptor.unsafeUpcast)
Behaviors.same
case Log(what) =>
diff --git
a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/ActorContextSpec.scala
b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/ActorContextSpec.scala
index 2b2b058e1d..a445723e75 100644
---
a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/ActorContextSpec.scala
+++
b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/ActorContextSpec.scala
@@ -661,8 +661,7 @@ abstract class ActorContextSpec extends
ScalaTestWithActorTestKit with AnyWordSp
"not allow null messages" in {
// Scala 3 doesn't generate an implicit `ClassTag[Null]`
(https://github.com/lampepfl/dotty/issues/9586)
- @nowarn("msg=never used") implicit val ct: ClassTag[Null] = ClassTag.Null
- val actor = spawn(decoration[Null].apply(Behaviors.empty[Null]))
+ val actor =
spawn(decoration[Null](ClassTag.Null).apply(Behaviors.empty[Null]))
intercept[InvalidMessageException] {
actor ! null
}
diff --git a/project/Jdk9.scala b/project/Jdk9.scala
index 70821d88a6..776ed1052b 100644
--- a/project/Jdk9.scala
+++ b/project/Jdk9.scala
@@ -54,13 +54,7 @@ object Jdk9 extends AutoPlugin {
}
private def releaseOption(scalaVer: String): Seq[String] = {
- val isScala3_8Plus = scalaVer.startsWith("3.") && {
- val parts = scalaVer.split('.')
- def safeToInt(s: String): Int = try { s.split('-').head.toInt }
- catch { case _: NumberFormatException => 0 }
- parts.length >= 2 && (safeToInt(parts(1)) >= 8 || safeToInt(parts(0)) >
3)
- }
- if (isScala3_8Plus) Seq("-java-output-version", majorVersion.toString)
+ if (JdkOptions.isScala3_8Plus(scalaVer)) Seq("-java-output-version",
majorVersion.toString)
else Seq("-release", majorVersion.toString)
}
diff --git a/project/JdkOptions.scala b/project/JdkOptions.scala
index ee30683d2a..1d16dd4667 100644
--- a/project/JdkOptions.scala
+++ b/project/JdkOptions.scala
@@ -35,14 +35,16 @@ object JdkOptions extends AutoPlugin {
// for LevelDB
"--add-opens=java.base/java.nio=ALL-UNNAMED" :: Nil
- def targetJdkScalacOptions(scalaVersion: String): Seq[String] = {
- val isScala3_8Plus = scalaVersion.startsWith("3.") && {
+ def isScala3_8Plus(scalaVersion: String): Boolean =
+ scalaVersion.startsWith("3.") && {
val parts = scalaVersion.split('.')
def safeToInt(s: String): Int = try { s.split('-').head.toInt }
catch { case _: NumberFormatException => 0 }
parts.length >= 2 && (safeToInt(parts(1)) >= 8 || safeToInt(parts(0)) >
3)
}
- if (isScala3_8Plus) {
+
+ def targetJdkScalacOptions(scalaVersion: String): Seq[String] = {
+ if (isScala3_8Plus(scalaVersion)) {
Seq("-java-output-version", JdkOptions.targetJavaVersion)
} else {
Seq("-release", JdkOptions.targetJavaVersion) ++ {
diff --git a/project/PekkoDisciplinePlugin.scala
b/project/PekkoDisciplinePlugin.scala
index 48212954c2..ce9f38e896 100644
--- a/project/PekkoDisciplinePlugin.scala
+++ b/project/PekkoDisciplinePlugin.scala
@@ -74,21 +74,30 @@ object PekkoDisciplinePlugin extends AutoPlugin {
"pekko-stream-tests-tck",
"pekko-testkit")
+ private val scala3Suppressions = Seq(
+ "-Wconf:msg=Implicit parameters should be provided with a .using.
clause:s",
+ "-Wconf:msg=is no longer supported for vararg splices:s",
+ "-Wconf:msg=with as a type operator has been deprecated:s",
+ "-Wconf:msg=SerialVersionUID does nothing on a trait:s",
+ "-Wconf:msg=has been deprecated.*use .= uninitialized. instead:s",
+ "-Wconf:msg=trailing.*_.*for eta-expansion is unnecessary:s",
+ "-Wconf:msg=is not declared infix:s",
+ "-Wconf:msg=._. is deprecated for wildcard arguments of types:s",
+ "-Wconf:msg=Ignoring ..this.. qualifier:s",
+ "-Wconf:msg=Unreachable case except for null:s",
+ "-Wconf:msg=Classic remoting is deprecated:s",
+ "-Wconf:msg=Use EventSourcedBehavior:s",
+ "-Wconf:msg=migration-to-pekko-grpc:s")
+
lazy val defaultScalaOptions =
Def.setting(CrossVersion.partialVersion(scalaVersion.value).get match {
- case (3, _) => "-Wconf:cat=unused-nowarn:s,cat=other-shadowing:s,any:e"
- case (2, 13) => "-Wconf:any:e,cat=unused-nowarn:s,cat=other-shadowing:s"
- case (2, 12) => "-Wconf:cat=unused-nowarn:s,any:e"
+ case (3, _) => Seq("-Wconf:any:e", "-Wconf:cat=unused-nowarn:s",
"-Wconf:cat=other-shadowing:s") ++ scala3Suppressions
+ case (2, 13) => Seq("-Wconf:any:e", "-Wconf:cat=unused-nowarn:s",
"-Wconf:cat=other-shadowing:s")
+ case (2, 12) => Seq("-Wconf:cat=unused-nowarn:s", "-Wconf:any:e")
})
lazy val nowarnSettings = Seq(
- Compile / scalacOptions ++= (
- if (scalaVersion.value.startsWith("3.")) Nil
- else Seq(defaultScalaOptions.value)
- ),
- Test / scalacOptions ++= (
- if (scalaVersion.value.startsWith("3.")) Nil
- else Seq(defaultScalaOptions.value)
- ),
+ Compile / scalacOptions ++= defaultScalaOptions.value,
+ Test / scalacOptions ++= defaultScalaOptions.value,
Compile / doc / scalacOptions := Seq())
// ignore Scala compile warnings for Java 20+
@@ -96,25 +105,30 @@ object PekkoDisciplinePlugin extends AutoPlugin {
System.getProperty("java.version").startsWith("2")
}
+ private val scala3DocSuppressions = Seq(
+ "-Wconf:cat=unused:s",
+ "-Wconf:cat=deprecation:s",
+ "-Wconf:cat=unchecked:s") ++ scala3Suppressions
+
/**
* We are a little less strict in docs
*/
lazy val docs =
Seq(
- Compile / scalacOptions -= defaultScalaOptions.value,
+ Compile / scalacOptions --= defaultScalaOptions.value,
Compile / scalacOptions ++=
(CrossVersion.partialVersion(scalaVersion.value).get match {
- case (3, _) => Nil
- case (2, 13) =>
Seq("-Wconf:any:e,cat=unused:s,cat=deprecation:s,cat=unchecked:s")
- case (2, 12) =>
Seq("-Wconf:cat=unused:s,cat=deprecation:s,cat=unchecked:s,any:e")
+ case (3, _) => scala3DocSuppressions
+ case (2, 13) => Seq("-Wconf:any:e", "-Wconf:cat=unused:s",
"-Wconf:cat=deprecation:s", "-Wconf:cat=unchecked:s")
+ case (2, 12) => Seq("-Wconf:cat=unused:s",
"-Wconf:cat=deprecation:s", "-Wconf:cat=unchecked:s", "-Wconf:any:e")
}),
Test / scalacOptions --= Seq("-Xlint", "-unchecked", "-deprecation"),
- Test / scalacOptions -= defaultScalaOptions.value,
+ Test / scalacOptions --= defaultScalaOptions.value,
Test / scalacOptions ++=
(CrossVersion.partialVersion(scalaVersion.value).get match {
- case (3, _) => Nil
- case (2, 13) =>
Seq("-Wconf:any:e,cat=unused:s,cat=deprecation:s,cat=unchecked:s")
- case (2, 12) =>
Seq("-Wconf:cat=unused:s,cat=deprecation:s,cat=unchecked:s,any:e")
+ case (3, _) => scala3DocSuppressions
+ case (2, 13) => Seq("-Wconf:any:e", "-Wconf:cat=unused:s",
"-Wconf:cat=deprecation:s", "-Wconf:cat=unchecked:s")
+ case (2, 12) => Seq("-Wconf:cat=unused:s",
"-Wconf:cat=deprecation:s", "-Wconf:cat=unchecked:s", "-Wconf:any:e")
}),
Compile / doc / scalacOptions := Seq())
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]