From e77a929766bf59f0426beea2b33d00bccd4fd1a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patryk=20Zieli=C5=84ski?= Date: Thu, 16 Oct 2025 12:46:55 +0200 Subject: [PATCH 1/2] change toString for BigDecimal --- library/src/scala/math/BigDecimal.scala | 2 +- tests/warn/i24093.check | 12 ++++++ tests/warn/i24093.scala | 54 +++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 tests/warn/i24093.check create mode 100644 tests/warn/i24093.scala diff --git a/library/src/scala/math/BigDecimal.scala b/library/src/scala/math/BigDecimal.scala index 25d5f55a55d9..4138b6e41867 100644 --- a/library/src/scala/math/BigDecimal.scala +++ b/library/src/scala/math/BigDecimal.scala @@ -717,6 +717,6 @@ extends ScalaNumber with ScalaNumericConversions with Serializable with Ordered[ /** Returns the decimal String representation of this BigDecimal. */ - override def toString: String = this.bigDecimal.toString + override def toString(): String = this.bigDecimal.toString } diff --git a/tests/warn/i24093.check b/tests/warn/i24093.check new file mode 100644 index 000000000000..8e786b7b70e1 --- /dev/null +++ b/tests/warn/i24093.check @@ -0,0 +1,12 @@ +-- [E197] Potential Issue Warning: tests/warn/i24093.scala:18:10 ------------------------------------------------------- +18 | new StringConverter[T]: // warn + | ^ + | New anonymous class definition will be duplicated at each inline site + | + | longer explanation available when compiling with `-explain` +-- [E197] Potential Issue Warning: tests/warn/i24093.scala:34:4 -------------------------------------------------------- +34 | new QueryParamsConverter[T] { // warn + | ^ + | New anonymous class definition will be duplicated at each inline site + | + | longer explanation available when compiling with `-explain` diff --git a/tests/warn/i24093.scala b/tests/warn/i24093.scala new file mode 100644 index 000000000000..b14a4d802d68 --- /dev/null +++ b/tests/warn/i24093.scala @@ -0,0 +1,54 @@ +import scala.deriving.* +import scala.compiletime.* + +trait StringConverter[T]: + def to(t: T): String + +trait QueryParams +trait QueryParamsConverter[T]: + def to(t: T): QueryParams + +object QueryParamsConverter { + extension [T](t: T) + def toQueryParams(using converter: QueryParamsConverter[T]): QueryParams = converter.to(t) + + inline private def summonStringConverter[T]: StringConverter[T] = summonFrom { + case converter: StringConverter[T] => converter + case _ => + new StringConverter[T]: // warn + override def to(t: T): String = t.toString + } + + inline def summonStringConverters[A <: Tuple]: List[StringConverter[?]] = + inline erasedValue[A] match + case _: EmptyTuple => Nil + case _: (t *: ts) => summonStringConverter[t] :: summonStringConverters[ts] + + inline def summonQueryParamsConverters[A <: Tuple]: List[QueryParamsConverter[?]] = + inline erasedValue[A] match + case _: EmptyTuple => Nil + case _: (t *: ts) => summonInline[QueryParamsConverter[t]] :: summonQueryParamsConverters[ts] + + inline given derived[T](using m: Mirror.Of[T]): QueryParamsConverter[T] = { + val stringConverters = summonStringConverters[m.MirroredElemTypes] + new QueryParamsConverter[T] { // warn + override def to(t: T): QueryParams = + inline m match + case p: Mirror.ProductOf[T] => ??? + case s: Mirror.SumOf[T] => + val _ = summonQueryParamsConverters[m.MirroredElemTypes] + ??? + } + } + +} + +object Test: + sealed trait FutureOrderCreateParams + object FutureOrderCreateParams: + case class LIMIT(quantity: BigDecimal) extends FutureOrderCreateParams + + case class FutureOrderCreateResponse(clientOrderId: String) + + import QueryParamsConverter.* + def createOrder(orderCreate: FutureOrderCreateParams) = orderCreate.toQueryParams From cfc0ab55759b7f0808f6f9c40aaf9f76887bf700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patryk=20Zieli=C5=84ski?= Date: Sun, 19 Oct 2025 20:19:51 +0200 Subject: [PATCH 2/2] revert workaround in BigDecimalToExpr --- library/src/scala/quoted/ToExpr.scala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/library/src/scala/quoted/ToExpr.scala b/library/src/scala/quoted/ToExpr.scala index fbe590c660de..c580306307a2 100644 --- a/library/src/scala/quoted/ToExpr.scala +++ b/library/src/scala/quoted/ToExpr.scala @@ -424,8 +424,7 @@ object ToExpr { /** Default implementation of `ToExpr[BigDecimal using the default MathContext]` */ given BigDecimalToExpr: ToExpr[BigDecimal] with { def apply(x: BigDecimal)(using Quotes): Expr[BigDecimal] = - val bigDecimal: String = "" + x // workaround "method toString in class BigDecimal does not take parameters" in scaladoc/generateScalaDocumentation - '{ BigDecimal(${Expr(bigDecimal)}) } + '{ BigDecimal(${Expr(x.toString)}) } } /** Default implementation of `ToExpr[StringContext]` */