Skip to content

Commit 1fa0cdd

Browse files
authored
Merge pull request #1099 from mkurz/allow_subtypes
Also handle sub classes of `T <: Appendable[T]` as raw
2 parents a712fc3 + 2c2b290 commit 1fa0cdd

4 files changed

Lines changed: 15 additions & 3 deletions

File tree

api/shared/src/main/scala-2.12/play/twirl/api/BaseScalaTemplate.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ case class BaseScalaTemplate[T <: Appendable[T], F <: Format[T]]($twirl__format:
2121

2222
def _display_(o: Any)(implicit m: ClassTag[T]): T = {
2323
o match {
24-
case escaped if escaped != null && escaped.getClass == m.runtimeClass => escaped.asInstanceOf[T]
24+
case escaped if escaped != null && m.runtimeClass.isInstance(escaped) => escaped.asInstanceOf[T]
2525
case () => $twirl__format.empty
2626
case None => $twirl__format.empty
2727
case Some(v) => _display_(v)

api/shared/src/main/scala-2.13/play/twirl/api/BaseScalaTemplate.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ case class BaseScalaTemplate[T <: Appendable[T], F <: Format[T]]($twirl__format:
2121

2222
def _display_(o: Any)(implicit m: ClassTag[T]): T = {
2323
o match {
24-
case escaped if escaped != null && escaped.getClass == m.runtimeClass => escaped.asInstanceOf[T]
24+
case escaped if escaped != null && m.runtimeClass.isInstance(escaped) => escaped.asInstanceOf[T]
2525
case () => $twirl__format.empty
2626
case None => $twirl__format.empty
2727
case Some(v) => _display_(v)

api/shared/src/main/scala-3/play/twirl/api/BaseScalaTemplate.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ case class BaseScalaTemplate[T <: Appendable[T], F <: Format[T]]($twirl__format:
2121

2222
def _display_(o: Any)(implicit m: ClassTag[T]): T = {
2323
o match {
24-
case escaped if escaped != null && escaped.getClass == m.runtimeClass => escaped.asInstanceOf[T]
24+
case escaped if escaped != null && m.runtimeClass.isInstance(escaped) => escaped.asInstanceOf[T]
2525
case () => $twirl__format.empty
2626
case None => $twirl__format.empty
2727
case Some(v) => _display_(v)

compiler/src/test/scala/play/twirl/compiler/test/CompilerSpec.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,6 +1009,18 @@ class CompilerSpec extends AnyWordSpec with Matchers with BeforeAndAfterEach {
10091009
compiled.static("markdown").toString.trim must be("markdown")
10101010
}
10111011

1012+
"compile successfully (don't escape) when using sub class of Html (which is a subclass of Appendable)" in {
1013+
TwirlIO.writeStringToFile(
1014+
tmpTemplateFile,
1015+
"""@{(new play.twirl.api.Html("<foo>")): play.twirl.api.HtmlFormat.Appendable}
1016+
|@{(new play.twirl.api.Html("<foo>") {}): play.twirl.api.HtmlFormat.Appendable}
1017+
|""".stripMargin
1018+
)
1019+
val helper = newCompilerHelper
1020+
val compiled = helper.compile[(() => Html)]("temporary.scala.html", "html.temporary")
1021+
compiled.static().toString.trim.replaceAll(" ", "").replaceAll("\n", "") must be("<foo><foo>")
1022+
}
1023+
10121024
"fail val shadowing var and reassigning val in if" when {
10131025

10141026
"using pure code blocks" in {

0 commit comments

Comments
 (0)