Skip to content

Commit 757481e

Browse files
committed
Fix Scala 3 Macros
The charSequenceExprToStringExpr() caused (some?) strings to be evaluated to '{ ... } It turns out, the whole function is not neccessary: every invokation of ${charSequenceExprToStringExpr(message)} can be replaced with ${message.toString}, which evaluates to the desired String (e.g., "{} failed because of {} (baz={})"). Furthermore, the return type of deconstructInterpolatedMessage() can be changed from Expr[String] to Expr[CharSequence]. This allows deconstructInterpolatedMessage() to drop its usage of charSequenceExprToStringExpr(). With that change, I get proper log messages in my Scala
1 parent 8ac6e7e commit 757481e

File tree

1 file changed

+15
-19
lines changed

1 file changed

+15
-19
lines changed

src/main/scala-3/org/apache/logging/log4j/scala/LoggerMacro.scala

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -451,52 +451,52 @@ private object LoggerMacro {
451451
args: Expr[Seq[Any]]) (using Quotes) = {
452452
val anyRefArgs = formatArgs(args)
453453
if(anyRefArgs.isEmpty)
454-
'{ if ($underlying.delegate.isEnabled($level)) $underlying.logMessage($level, null, ${charSequenceExprToStringExpr(message)}, null) }
454+
'{ if ($underlying.delegate.isEnabled($level)) $underlying.logMessage($level, null, $message.toString, null) }
455455
else if(anyRefArgs.length == 1)
456-
'{ if ($underlying.delegate.isEnabled($level)) $underlying.delegate.log($level, ${charSequenceExprToStringExpr(message)}, ${anyRefArgs.head}) }
456+
'{ if ($underlying.delegate.isEnabled($level)) $underlying.delegate.log($level, $message.toString, ${anyRefArgs.head}) }
457457
else
458-
'{ if ($underlying.delegate.isEnabled($level)) $underlying.delegate.log($level, ${charSequenceExprToStringExpr(message)}, ${Expr.ofSeq(anyRefArgs)}*) }
458+
'{ if ($underlying.delegate.isEnabled($level)) $underlying.delegate.log($level, $message.toString, ${Expr.ofSeq(anyRefArgs)}*) }
459459
}
460460

461461
private def logMessageArgsThrowable(underlying: Expr[Logger], level: Expr[Level], message: Expr[CharSequence],
462462
args: Expr[Seq[Any]], throwable: Expr[Throwable]) (using Quotes) = {
463463
val anyRefArgs = formatArgs(args)
464464
if(anyRefArgs.isEmpty)
465-
'{ if ($underlying.delegate.isEnabled($level)) $underlying.logMessage($level, null, ${charSequenceExprToStringExpr(message)}, $throwable) }
465+
'{ if ($underlying.delegate.isEnabled($level)) $underlying.logMessage($level, null, $message.toString, $throwable) }
466466
else if(anyRefArgs.length == 1)
467-
'{ if ($underlying.delegate.isEnabled($level)) $underlying.delegate.log($level, ${charSequenceExprToStringExpr(message)}, ${anyRefArgs.head}, $throwable) }
467+
'{ if ($underlying.delegate.isEnabled($level)) $underlying.delegate.log($level, $message.toString, ${anyRefArgs.head}, $throwable) }
468468
else {
469469
val extendedArgs = anyRefArgs :+ throwable
470-
'{ if ($underlying.delegate.isEnabled($level)) $underlying.delegate.log($level, ${charSequenceExprToStringExpr(message)}, ${Expr.ofSeq(extendedArgs)}*) }
470+
'{ if ($underlying.delegate.isEnabled($level)) $underlying.delegate.log($level, $message.toString, ${Expr.ofSeq(extendedArgs)}*) }
471471
}
472472
}
473473

474474
private def logMarkerMessageArgs(underlying: Expr[Logger], level: Expr[Level], marker: Expr[Marker], message: Expr[CharSequence],
475475
args: Expr[Seq[Any]]) (using Quotes) = {
476476
val anyRefArgs = formatArgs(args)
477477
if(anyRefArgs.isEmpty)
478-
'{ if ($underlying.delegate.isEnabled($level, $marker)) $underlying.logMessage($level, $marker, ${charSequenceExprToStringExpr(message)}, null) }
478+
'{ if ($underlying.delegate.isEnabled($level, $marker)) $underlying.logMessage($level, $marker, $message.toString, null) }
479479
else if(anyRefArgs.length == 1)
480-
'{ if ($underlying.delegate.isEnabled($level, $marker)) $underlying.delegate.log($level, $marker, ${charSequenceExprToStringExpr(message)}, ${anyRefArgs.head}) }
480+
'{ if ($underlying.delegate.isEnabled($level, $marker)) $underlying.delegate.log($level, $marker, $message.toString, ${anyRefArgs.head}) }
481481
else
482-
'{ if ($underlying.delegate.isEnabled($level, $marker)) $underlying.delegate.log($level, $marker, ${charSequenceExprToStringExpr(message)}, ${Expr.ofSeq(anyRefArgs)}*) }
482+
'{ if ($underlying.delegate.isEnabled($level, $marker)) $underlying.delegate.log($level, $marker, $message.toString, ${Expr.ofSeq(anyRefArgs)}*) }
483483
}
484484

485485
private def logMarkerMessageArgsThrowable(underlying: Expr[Logger], level: Expr[Level], marker: Expr[Marker],
486486
message: Expr[CharSequence], args: Expr[Seq[Any]], throwable: Expr[Throwable]) (using Quotes) = {
487487
val anyRefArgs = formatArgs(args)
488488
if(anyRefArgs.isEmpty)
489-
'{ if ($underlying.delegate.isEnabled($level, $marker)) $underlying.logMessage($level, $marker, ${charSequenceExprToStringExpr(message)}, $throwable) }
489+
'{ if ($underlying.delegate.isEnabled($level, $marker)) $underlying.logMessage($level, $marker, $message.toString, $throwable) }
490490
else if(anyRefArgs.length == 1)
491-
'{ if ($underlying.delegate.isEnabled($level, $marker)) $underlying.delegate.log($level, $marker, ${charSequenceExprToStringExpr(message)}, ${anyRefArgs.head}, $throwable) }
491+
'{ if ($underlying.delegate.isEnabled($level, $marker)) $underlying.delegate.log($level, $marker, $message.toString, ${anyRefArgs.head}, $throwable) }
492492
else {
493493
val extendedArgs = anyRefArgs :+ throwable
494-
'{ if ($underlying.delegate.isEnabled($level, $marker)) $underlying.delegate.log($level, $marker, ${charSequenceExprToStringExpr(message)}, ${Expr.ofSeq(extendedArgs)}*) }
494+
'{ if ($underlying.delegate.isEnabled($level, $marker)) $underlying.delegate.log($level, $marker, $message.toString, ${Expr.ofSeq(extendedArgs)}*) }
495495
}
496496
}
497497

498498
/** Checks whether `message` is an interpolated string and transforms it into LOG4J string interpolation. */
499-
private def deconstructInterpolatedMessage(message: Expr[CharSequence])(using Quotes): (Expr[String], Seq[Expr[Any]]) = {
499+
private def deconstructInterpolatedMessage(message: Expr[CharSequence])(using Quotes): (Expr[CharSequence], Seq[Expr[Any]]) = {
500500
import quotes.reflect.*
501501
import util.*
502502

@@ -525,9 +525,9 @@ private object LoggerMacro {
525525

526526
(Expr(format), formatArgs)
527527
case _ =>
528-
(charSequenceExprToStringExpr(message), Seq.empty)
528+
(message, Seq.empty)
529529
}
530-
case _ => (charSequenceExprToStringExpr(message), Seq.empty)
530+
case _ => (message, Seq.empty)
531531
}
532532
}
533533

@@ -549,8 +549,4 @@ private object LoggerMacro {
549549
case _ => Seq.empty
550550
}
551551
}
552-
553-
private def charSequenceExprToStringExpr(expr: Expr[CharSequence])(using Quotes): Expr[String] = expr match {
554-
case '{ $cs } => Expr(cs.toString)
555-
}
556552
}

0 commit comments

Comments
 (0)