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]

Reply via email to