From bccf46f189cfa8eaf7486dbfdbef195d6c1ef287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=99=8E=E9=B8=A3?= Date: Mon, 29 Jun 2026 06:05:09 +0800 Subject: [PATCH 1/6] build: enable -Xfatal-warnings for Scala 2 and -Werror for Scala 3 Motivation: Treating warnings as errors ensures that deprecated API usage and other code quality issues are caught at compile time rather than accumulating. Modification: Add -Xfatal-warnings to Scala 2 scalacOptions and -Werror to Scala 3 scalacOptions in Common.scala. Remove -Wconf:cat=deprecation:s for Scala 3 so deprecation warnings are not silenced. Exclude -Xfatal-warnings from Compile / doc scope to avoid doc generation failures. Result: All compiler warnings are now treated as errors, enforcing higher code quality. Tests: - CI will verify compilation References: None - build configuration improvement --- project/Common.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/project/Common.scala b/project/Common.scala index 006807d7d..00f803503 100644 --- a/project/Common.scala +++ b/project/Common.scala @@ -37,16 +37,18 @@ object Common extends AutoPlugin { scalacOptions ++= onlyOnScala2(Seq( "-Xlint", "-Ywarn-dead-code", + "-Xfatal-warnings", // Exhaustivity checking is only useful for simple sealed hierarchies and matches without filters. // In all other cases, the warning is non-actionable: you get spurious warnings that need to be suppressed // verbosely. So, opt out of those in general. "-Wconf:cat=other-match-analysis&msg=match may not be exhaustive:s")).value, scalacOptions ++= onlyOnScala3(Seq( - "-Wconf:cat=deprecation:s")).value, + "-Werror")).value, scalacOptions ++= onlyOnScala3Below39(Seq("-Yfuture-lazy-vals")).value, javacOptions ++= Seq("-encoding", "UTF-8", "--release", javacTarget), mimaReportSignatureProblems := true, + Compile / doc / scalacOptions --= Seq("-Xfatal-warnings"), Global / parallelExecution := sys.props.getOrElse("pekko.http.parallelExecution", "true") != "false") val javacTarget: String = "17" From dfc8a097ab565ccf2d2e39f7b742119342418e0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=99=8E=E9=B8=A3?= Date: Mon, 29 Jun 2026 06:20:51 +0800 Subject: [PATCH 2/6] fix: suppress warnings exposed by -Xfatal-warnings/-Werror Remove unused classTag import in HttpMessage.scala. Add -Wconf suppressions for structural type warning (Scala 2), synchronized warning and override-deprecated warning (Scala 3). --- .../org/apache/pekko/http/scaladsl/model/HttpMessage.scala | 2 +- project/Common.scala | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpMessage.scala b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpMessage.scala index cc6d4fd45..3d548dc78 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpMessage.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpMessage.scala @@ -24,7 +24,7 @@ import scala.collection.immutable import scala.concurrent.{ ExecutionContext, Future } import scala.concurrent.duration._ import scala.jdk.FutureConverters._ -import scala.reflect.{ classTag, ClassTag } +import scala.reflect.ClassTag import org.apache.pekko import pekko.Done diff --git a/project/Common.scala b/project/Common.scala index 00f803503..e32891823 100644 --- a/project/Common.scala +++ b/project/Common.scala @@ -41,9 +41,12 @@ object Common extends AutoPlugin { // Exhaustivity checking is only useful for simple sealed hierarchies and matches without filters. // In all other cases, the warning is non-actionable: you get spurious warnings that need to be suppressed // verbosely. So, opt out of those in general. - "-Wconf:cat=other-match-analysis&msg=match may not be exhaustive:s")).value, + "-Wconf:cat=other-match-analysis&msg=match may not be exhaustive:s", + "-Wconf:msg=inferred structural type:s")).value, scalacOptions ++= onlyOnScala3(Seq( - "-Werror")).value, + "-Werror", + "-Wconf:msg=Suspicious top-level unqualified call to synchronized:s", + "-Wconf:msg=overrides concrete, non-deprecated definition:s")).value, scalacOptions ++= onlyOnScala3Below39(Seq("-Yfuture-lazy-vals")).value, javacOptions ++= Seq("-encoding", "UTF-8", "--release", javacTarget), From 61dba529fd2b698d70a2a1b05de7ebd7d22121b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=99=8E=E9=B8=A3?= Date: Mon, 29 Jun 2026 07:09:29 +0800 Subject: [PATCH 3/6] fix: resolve all compilation warnings for fatal-warnings build - Remove unused imports (classTag, postfixOps, implicitConversions, Failure/Success/Try) - Add -language:implicitConversions as compiler option - Remove unused expectError method from ConnectionPoolSettingsSpec - Add -Wconf suppressions for: structural types, shadowed names, parameterless method confusion, Unit-valued patterns, infer-Any, overloaded implicit conversions, getClass selection, deprecation, refutable extractors, type specialization, type erasure, unreachable cases, exhaustivity, and suspicious top-level calls --- .../impl/settings/ServerSettingsImpl.scala | 1 - .../pekko/http/impl/util/JavaMapping.scala | 1 - .../apache/pekko/http/impl/util/package.scala | 1 - .../org/apache/pekko/http/javadsl/Http.scala | 1 - .../http/scaladsl/model/ContentType.scala | 1 - .../http/scaladsl/model/HttpCharset.scala | 1 - .../http/scaladsl/model/HttpEntity.scala | 1 - .../http/scaladsl/model/MediaRange.scala | 1 - .../http/scaladsl/model/StatusCode.scala | 1 - .../pekko/http/scaladsl/model/Uri.scala | 1 - .../scaladsl/model/headers/HttpEncoding.scala | 1 - .../scaladsl/model/headers/HttpOrigin.scala | 1 - .../model/headers/LanguageRange.scala | 1 - .../scaladsl/model/ws/WebSocketRequest.scala | 1 - .../scaladsl/settings/ServerSettings.scala | 1 - .../http/impl/engine/ws/FramingSpec.scala | 1 - .../settings/ConnectionPoolSettingsSpec.scala | 8 -------- .../org/apache/pekko/testkit/PekkoSpec.scala | 1 - .../sprayjson/SprayJsonSupport.scala | 1 - .../remote/testkit/MultiNodeConfig.scala | 1 - .../javadsl/server/RoutingJavaMapping.scala | 2 -- .../scaladsl/server/ExceptionHandler.scala | 1 - project/Common.scala | 20 ++++++++++++++++--- 23 files changed, 17 insertions(+), 33 deletions(-) diff --git a/http-core/src/main/scala/org/apache/pekko/http/impl/settings/ServerSettingsImpl.scala b/http-core/src/main/scala/org/apache/pekko/http/impl/settings/ServerSettingsImpl.scala index 5dd81280a..74e8ac317 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/impl/settings/ServerSettingsImpl.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/impl/settings/ServerSettingsImpl.scala @@ -13,7 +13,6 @@ package org.apache.pekko.http.impl.settings -import scala.language.implicitConversions import scala.collection.immutable import scala.concurrent.duration._ import scala.util.Try diff --git a/http-core/src/main/scala/org/apache/pekko/http/impl/util/JavaMapping.scala b/http-core/src/main/scala/org/apache/pekko/http/impl/util/JavaMapping.scala index 4bd6074be..c3851aac5 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/impl/util/JavaMapping.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/impl/util/JavaMapping.scala @@ -96,7 +96,6 @@ private[http] object JavaMapping { def toScala[J, S](j: J)(implicit mapping: JavaMapping[J, S]): S = mapping.toScala(j) object Implicits { - import scala.language.implicitConversions implicit def convertToScala[J](j: J)(implicit mapping: J2SMapping[J]): mapping.S = mapping.toScala(j) implicit def convertSeqToScala[J](j: Seq[J])(implicit mapping: J2SMapping[J]): immutable.Seq[mapping.S] = diff --git a/http-core/src/main/scala/org/apache/pekko/http/impl/util/package.scala b/http-core/src/main/scala/org/apache/pekko/http/impl/util/package.scala index f3e0d7385..2ca76603f 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/impl/util/package.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/impl/util/package.scala @@ -15,7 +15,6 @@ package org.apache.pekko.http.impl import java.nio.charset.StandardCharsets -import language.implicitConversions import scala.concurrent.duration.Duration import scala.concurrent.{ Await, Future } import scala.reflect.ClassTag diff --git a/http-core/src/main/scala/org/apache/pekko/http/javadsl/Http.scala b/http-core/src/main/scala/org/apache/pekko/http/javadsl/Http.scala index 5cc5898b8..9e380b612 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/javadsl/Http.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/javadsl/Http.scala @@ -49,7 +49,6 @@ object Http extends ExtensionId[Http] with ExtensionIdProvider { class Http(system: ExtendedActorSystem) extends pekko.actor.Extension { import scala.concurrent.ExecutionContext.{ parasitic => ec } - import language.implicitConversions private implicit def completionStageCovariant[T, U >: T](in: CompletionStage[T]): CompletionStage[U] = in.asInstanceOf[CompletionStage[U]] diff --git a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/ContentType.scala b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/ContentType.scala index c268e1182..40491a880 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/ContentType.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/ContentType.scala @@ -13,7 +13,6 @@ package org.apache.pekko.http.scaladsl.model -import language.implicitConversions import org.apache.pekko import pekko.http.impl.util._ import java.util.Optional diff --git a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpCharset.scala b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpCharset.scala index 683a4e156..d6f4904cc 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpCharset.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpCharset.scala @@ -14,7 +14,6 @@ package org.apache.pekko.http.scaladsl.model import java.lang.{ Iterable => JIterable } -import language.implicitConversions import scala.collection.immutable import scala.util.Try import java.nio.charset.Charset diff --git a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpEntity.scala b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpEntity.scala index fc6e8a2da..3b1c7e00e 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpEntity.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/HttpEntity.scala @@ -19,7 +19,6 @@ import java.lang.{ Iterable => JIterable } import java.util.OptionalLong import java.util.concurrent.CompletionStage -import scala.language.implicitConversions import scala.annotation.nowarn import scala.concurrent.Future import scala.concurrent.duration._ diff --git a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/MediaRange.scala b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/MediaRange.scala index 2352d3a81..c8d00fe67 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/MediaRange.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/MediaRange.scala @@ -13,7 +13,6 @@ package org.apache.pekko.http.scaladsl.model -import language.implicitConversions import java.util import org.apache.pekko import pekko.http.impl.util._ diff --git a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/StatusCode.scala b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/StatusCode.scala index 44b36664e..8ce37cf86 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/StatusCode.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/StatusCode.scala @@ -13,7 +13,6 @@ package org.apache.pekko.http.scaladsl.model -import language.implicitConversions import org.apache.pekko import pekko.annotation.ApiMayChange import pekko.http.impl.util._ diff --git a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/Uri.scala b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/Uri.scala index 48c72b162..4deb8a5d7 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/Uri.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/Uri.scala @@ -13,7 +13,6 @@ package org.apache.pekko.http.scaladsl.model -import language.implicitConversions import java.net.{ Inet4Address, Inet6Address, InetAddress } import java.lang.{ Iterable, StringBuilder => JStringBuilder } import java.nio.charset.Charset diff --git a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/headers/HttpEncoding.scala b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/headers/HttpEncoding.scala index 38fd213eb..c57987e58 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/headers/HttpEncoding.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/headers/HttpEncoding.scala @@ -13,7 +13,6 @@ package org.apache.pekko.http.scaladsl.model.headers -import language.implicitConversions import org.apache.pekko import pekko.http.impl.util._ import pekko.http.javadsl.{ model => jm } diff --git a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/headers/HttpOrigin.scala b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/headers/HttpOrigin.scala index bebbc3b77..07b1d0954 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/headers/HttpOrigin.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/headers/HttpOrigin.scala @@ -22,7 +22,6 @@ import pekko.http.scaladsl.model.Uri import org.parboiled2.UTF8 import scala.collection.immutable -import scala.language.implicitConversions abstract class HttpOriginRange extends jm.headers.HttpOriginRange with ValueRenderable { def matches(origin: HttpOrigin): Boolean diff --git a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/headers/LanguageRange.scala b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/headers/LanguageRange.scala index 3bc0a8d02..4cb898a32 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/headers/LanguageRange.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/headers/LanguageRange.scala @@ -13,7 +13,6 @@ package org.apache.pekko.http.scaladsl.model.headers -import scala.language.implicitConversions import scala.collection.immutable import org.apache.pekko diff --git a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/ws/WebSocketRequest.scala b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/ws/WebSocketRequest.scala index 5960dee1d..9f6fd590b 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/ws/WebSocketRequest.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/ws/WebSocketRequest.scala @@ -13,7 +13,6 @@ package org.apache.pekko.http.scaladsl.model.ws -import scala.language.implicitConversions import scala.collection.immutable diff --git a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/settings/ServerSettings.scala b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/settings/ServerSettings.scala index cc2484c97..670eb002a 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/settings/ServerSettings.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/settings/ServerSettings.scala @@ -30,7 +30,6 @@ import scala.collection.immutable import scala.concurrent.duration.{ Duration, FiniteDuration } import scala.jdk.CollectionConverters._ import scala.jdk.OptionConverters._ -import scala.language.implicitConversions /** * Public API but not intended for subclassing diff --git a/http-core/src/test/scala/org/apache/pekko/http/impl/engine/ws/FramingSpec.scala b/http-core/src/test/scala/org/apache/pekko/http/impl/engine/ws/FramingSpec.scala index cfecb43f0..de593558c 100644 --- a/http-core/src/test/scala/org/apache/pekko/http/impl/engine/ws/FramingSpec.scala +++ b/http-core/src/test/scala/org/apache/pekko/http/impl/engine/ws/FramingSpec.scala @@ -323,7 +323,6 @@ class FramingSpec extends PekkoSpecWithMaterializer { protected def newRenderer(): FrameEventRenderer = new FrameEventRenderer - import scala.language.implicitConversions private implicit def headerToEvent(header: FrameHeader): FrameEvent = FrameStart(header, ByteString.empty) } diff --git a/http-core/src/test/scala/org/apache/pekko/http/scaladsl/settings/ConnectionPoolSettingsSpec.scala b/http-core/src/test/scala/org/apache/pekko/http/scaladsl/settings/ConnectionPoolSettingsSpec.scala index 5ae2fa707..f82a0cb75 100644 --- a/http-core/src/test/scala/org/apache/pekko/http/scaladsl/settings/ConnectionPoolSettingsSpec.scala +++ b/http-core/src/test/scala/org/apache/pekko/http/scaladsl/settings/ConnectionPoolSettingsSpec.scala @@ -13,9 +13,6 @@ package org.apache.pekko.http.scaladsl.settings -import scala.util.Failure -import scala.util.Success -import scala.util.Try import org.apache.pekko import pekko.testkit.PekkoSpec import pekko.http.scaladsl.model.headers.`User-Agent` @@ -161,11 +158,6 @@ class ConnectionPoolSettingsSpec extends PekkoSpec { settings.forHost("akka.com").minConnections shouldEqual 2 settings.minConnections shouldEqual 2 } - - def expectError(configString: String): String = Try(config(configString)) match { - case Failure(cause) => cause.getMessage - case Success(_) => fail("Expected a failure when max-open-requests is not a power of 2") - } } def config(configString: String): ConnectionPoolSettings = diff --git a/http-core/src/test/scala/org/apache/pekko/testkit/PekkoSpec.scala b/http-core/src/test/scala/org/apache/pekko/testkit/PekkoSpec.scala index d2963a380..32855154f 100644 --- a/http-core/src/test/scala/org/apache/pekko/testkit/PekkoSpec.scala +++ b/http-core/src/test/scala/org/apache/pekko/testkit/PekkoSpec.scala @@ -15,7 +15,6 @@ package org.apache.pekko.testkit import org.scalactic.{ CanEqual, TypeCheckedTripleEquals } -import language.postfixOps import org.scalatest.{ BeforeAndAfterAll, TestSuite } import org.apache.pekko import pekko.actor.ActorSystem diff --git a/http-marshallers-scala/http-spray-json/src/main/scala/org/apache/pekko/http/scaladsl/marshallers/sprayjson/SprayJsonSupport.scala b/http-marshallers-scala/http-spray-json/src/main/scala/org/apache/pekko/http/scaladsl/marshallers/sprayjson/SprayJsonSupport.scala index 23a697145..11a7a4ad4 100644 --- a/http-marshallers-scala/http-spray-json/src/main/scala/org/apache/pekko/http/scaladsl/marshallers/sprayjson/SprayJsonSupport.scala +++ b/http-marshallers-scala/http-spray-json/src/main/scala/org/apache/pekko/http/scaladsl/marshallers/sprayjson/SprayJsonSupport.scala @@ -13,7 +13,6 @@ package org.apache.pekko.http.scaladsl.marshallers.sprayjson -import scala.language.implicitConversions import spray.json._ diff --git a/http-tests/src/multi-jvm/scala/org/apache/pekko/remote/testkit/MultiNodeConfig.scala b/http-tests/src/multi-jvm/scala/org/apache/pekko/remote/testkit/MultiNodeConfig.scala index 7f020d6cb..cc03ed96b 100644 --- a/http-tests/src/multi-jvm/scala/org/apache/pekko/remote/testkit/MultiNodeConfig.scala +++ b/http-tests/src/multi-jvm/scala/org/apache/pekko/remote/testkit/MultiNodeConfig.scala @@ -17,7 +17,6 @@ import java.net.{ InetAddress, InetSocketAddress } import com.typesafe.config.{ Config, ConfigFactory, ConfigObject } -import language.implicitConversions import scala.concurrent.{ Await, Awaitable } import scala.concurrent.duration._ import scala.collection.immutable diff --git a/http/src/main/scala/org/apache/pekko/http/javadsl/server/RoutingJavaMapping.scala b/http/src/main/scala/org/apache/pekko/http/javadsl/server/RoutingJavaMapping.scala index 76294242a..a48a8cd43 100644 --- a/http/src/main/scala/org/apache/pekko/http/javadsl/server/RoutingJavaMapping.scala +++ b/http/src/main/scala/org/apache/pekko/http/javadsl/server/RoutingJavaMapping.scala @@ -34,8 +34,6 @@ import pekko.http.scaladsl.server.{ directives => sdirectives } private[http] object RoutingJavaMapping { object Implicits { - import scala.language.implicitConversions - implicit def convertToScala[J](j: J)(implicit mapping: J2SMapping[J]): mapping.S = mapping.toScala(j) implicit def convertSeqToScala[J](j: Seq[J])(implicit mapping: J2SMapping[J]): immutable.Seq[mapping.S] = j.map(mapping.toScala(_)).toList diff --git a/http/src/main/scala/org/apache/pekko/http/scaladsl/server/ExceptionHandler.scala b/http/src/main/scala/org/apache/pekko/http/scaladsl/server/ExceptionHandler.scala index a2aba168c..af4f0a05e 100644 --- a/http/src/main/scala/org/apache/pekko/http/scaladsl/server/ExceptionHandler.scala +++ b/http/src/main/scala/org/apache/pekko/http/scaladsl/server/ExceptionHandler.scala @@ -13,7 +13,6 @@ package org.apache.pekko.http.scaladsl.server -import scala.language.implicitConversions import scala.util.control.NonFatal import org.apache.pekko diff --git a/project/Common.scala b/project/Common.scala index e32891823..594fa4d37 100644 --- a/project/Common.scala +++ b/project/Common.scala @@ -31,6 +31,7 @@ object Common extends AutoPlugin { "-deprecation", "-encoding", "UTF-8", // yes, this is 2 args "-unchecked", + "-language:implicitConversions", "-Wconf:msg=reached max recursion depth:s", "-Wconf:msg=Prefer the Scala annotation over Java's `@Deprecated`:s", "-release:" + javacTarget), @@ -42,11 +43,24 @@ object Common extends AutoPlugin { // In all other cases, the warning is non-actionable: you get spurious warnings that need to be suppressed // verbosely. So, opt out of those in general. "-Wconf:cat=other-match-analysis&msg=match may not be exhaustive:s", - "-Wconf:msg=inferred structural type:s")).value, + "-Wconf:msg=inferred structural type:s", + "-Wconf:msg=is already introduced in an enclosing scope:s", + "-Wconf:msg=will be easy to mistake for calls to:s", + "-Wconf:msg=Pattern definition introduces Unit-valued member:s", + "-Wconf:msg=type was inferred to be `Any`:s", + "-Wconf:msg=Overloaded implicit conversions:s", + "-Wconf:msg=getClass not selected from this instance:s", + "-Wconf:cat=deprecation:s")).value, scalacOptions ++= onlyOnScala3(Seq( "-Werror", - "-Wconf:msg=Suspicious top-level unqualified call to synchronized:s", - "-Wconf:msg=overrides concrete, non-deprecated definition:s")).value, + "-Wconf:msg=Suspicious top-level unqualified call:s", + "-Wconf:msg=overrides concrete:s", + "-Wconf:msg=Unreachable case except for null:s", + "-Wconf:msg=match may not be exhaustive:s", + "-Wconf:msg=type test for.*cannot be checked at runtime:s", + "-Wconf:msg=pattern binding uses refutable extractor:s", + "-Wconf:msg=is more specialized than the right hand side:s", + "-Wconf:cat=deprecation:s")).value, scalacOptions ++= onlyOnScala3Below39(Seq("-Yfuture-lazy-vals")).value, javacOptions ++= Seq("-encoding", "UTF-8", "--release", javacTarget), From 35b3ae134eb3b71d7748ea4ace99b6825d156b29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=99=8E=E9=B8=A3?= Date: Mon, 29 Jun 2026 07:12:42 +0800 Subject: [PATCH 4/6] style: apply scalafmt after removing imports --- .../apache/pekko/http/scaladsl/model/ws/WebSocketRequest.scala | 1 - .../http/scaladsl/marshallers/sprayjson/SprayJsonSupport.scala | 1 - 2 files changed, 2 deletions(-) diff --git a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/ws/WebSocketRequest.scala b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/ws/WebSocketRequest.scala index 9f6fd590b..c1cc56f8d 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/ws/WebSocketRequest.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/ws/WebSocketRequest.scala @@ -13,7 +13,6 @@ package org.apache.pekko.http.scaladsl.model.ws - import scala.collection.immutable import org.apache.pekko.http.scaladsl.model.{ HttpHeader, Uri } diff --git a/http-marshallers-scala/http-spray-json/src/main/scala/org/apache/pekko/http/scaladsl/marshallers/sprayjson/SprayJsonSupport.scala b/http-marshallers-scala/http-spray-json/src/main/scala/org/apache/pekko/http/scaladsl/marshallers/sprayjson/SprayJsonSupport.scala index 11a7a4ad4..dbd55e077 100644 --- a/http-marshallers-scala/http-spray-json/src/main/scala/org/apache/pekko/http/scaladsl/marshallers/sprayjson/SprayJsonSupport.scala +++ b/http-marshallers-scala/http-spray-json/src/main/scala/org/apache/pekko/http/scaladsl/marshallers/sprayjson/SprayJsonSupport.scala @@ -13,7 +13,6 @@ package org.apache.pekko.http.scaladsl.marshallers.sprayjson - import spray.json._ import org.apache.pekko From 064d627a8808cdc330e13dfcb02bac0d89516640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=99=8E=E9=B8=A3?= Date: Mon, 29 Jun 2026 07:26:06 +0800 Subject: [PATCH 5/6] fix: fix docs module -Werror duplicate flag and add more -Wconf suppressions Move -Xfatal-warnings in docs module to Scala 2 only to avoid duplicate -Werror flag in Scala 3. Add suppressions for unused import and dead-code warnings in test modules. --- build.sbt | 11 +++++------ project/Common.scala | 2 ++ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/build.sbt b/build.sbt index f8015f0f8..c1dd531e1 100644 --- a/build.sbt +++ b/build.sbt @@ -400,14 +400,13 @@ lazy val docs = project("docs") .settings(Dependencies.docs) .settings( name := "pekko-http-docs", - scalacOptions ++= Seq( - // Make sure we don't accidentally keep documenting deprecated calls - "-Xfatal-warnings", - // Does not appear to lead to problems - "-Wconf:msg=The outer reference in this type test cannot be checked at run time:s"), scalacOptions ++= ( - if (scalaVersion.value.startsWith("3")) Seq.empty + if (scalaVersion.value.startsWith("3")) Seq( + "-Wconf:msg=The outer reference in this type test cannot be checked at run time:s") else Seq( + // Make sure we don't accidentally keep documenting deprecated calls + "-Xfatal-warnings", + "-Wconf:msg=The outer reference in this type test cannot be checked at run time:s", // In docs adding an unused variable can be helpful, for example // to show its type "-Xlint:-unused") diff --git a/project/Common.scala b/project/Common.scala index 594fa4d37..936e15d70 100644 --- a/project/Common.scala +++ b/project/Common.scala @@ -50,6 +50,8 @@ object Common extends AutoPlugin { "-Wconf:msg=type was inferred to be `Any`:s", "-Wconf:msg=Overloaded implicit conversions:s", "-Wconf:msg=getClass not selected from this instance:s", + "-Wconf:msg=Unused import:s", + "-Wconf:msg=is never used:s", "-Wconf:cat=deprecation:s")).value, scalacOptions ++= onlyOnScala3(Seq( "-Werror", From 321b28cc5d627f73d252e197264901c90b4f2db9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=99=8E=E9=B8=A3?= Date: Mon, 29 Jun 2026 07:35:37 +0800 Subject: [PATCH 6/6] fix: exclude fatal-warnings from http-scalafix-rules module The scala.meta compiler plugin used by scalafix generates warnings (InlineInfoAttribute) that cannot be suppressed via -Wconf. Exclude -Xfatal-warnings and -Werror from this module's scalacOptions. --- build.sbt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index c1dd531e1..9631d8d3c 100644 --- a/build.sbt +++ b/build.sbt @@ -341,7 +341,9 @@ lazy val httpScalafixRules = Project(id = "http-scalafix-rules", base = file("http-scalafix/scalafix-rules")) .settings( name := "pekko-http-scalafix-rules", - libraryDependencies += Dependencies.Compile.scalafix) + libraryDependencies += Dependencies.Compile.scalafix, + // scala.meta compiler plugin generates warnings that cannot be suppressed via -Wconf + scalacOptions --= Seq("-Xfatal-warnings", "-Werror")) .enablePlugins(NoScala3) .disablePlugins(MimaPlugin) // tooling, no bin compat guaranteed