From e8b9aeaae93ca10d575d83bfdf9c8c65fca3c506 Mon Sep 17 00:00:00 2001 From: Jasper Moeys Date: Sun, 24 Jan 2021 23:30:08 +0100 Subject: [PATCH 1/3] add support for ToExpr[Class[_]] --- library/src/scala/quoted/ToExpr.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library/src/scala/quoted/ToExpr.scala b/library/src/scala/quoted/ToExpr.scala index 39dcf01ef3a1..13a3cd69bbfe 100644 --- a/library/src/scala/quoted/ToExpr.scala +++ b/library/src/scala/quoted/ToExpr.scala @@ -81,10 +81,10 @@ object ToExpr { } /** Default implemetation of `ToExpr[Class[T]]` */ - given ClassToExpr[T]: ToExpr[Class[T]] with { - def apply(x: Class[T])(using Quotes) = { + given ClassToExpr[T <: Class[_]]: ToExpr[T] with { + def apply(x: T)(using Quotes) = { import quotes.reflect._ - Ref(defn.Predef_classOf).appliedToType(TypeRepr.typeConstructorOf(x)).asExpr.asInstanceOf[Expr[Class[T]]] + Ref(defn.Predef_classOf).appliedToType(TypeRepr.typeConstructorOf(x)).asExpr.asInstanceOf[Expr[T]] } } From f002e11d39bbe5c8b487abef8b70db876abdc8c0 Mon Sep 17 00:00:00 2001 From: Jasper Moeys Date: Mon, 25 Jan 2021 22:04:14 +0100 Subject: [PATCH 2/3] add test case --- tests/run-macros/quoted-toExprOfClass.check | 4 ++++ .../quoted-toExprOfClass/Macros_1.scala | 20 +++++++++++++++++++ .../quoted-toExprOfClass/Test_2.scala | 10 ++++++++++ 3 files changed, 34 insertions(+) create mode 100644 tests/run-macros/quoted-toExprOfClass.check create mode 100644 tests/run-macros/quoted-toExprOfClass/Macros_1.scala create mode 100644 tests/run-macros/quoted-toExprOfClass/Test_2.scala diff --git a/tests/run-macros/quoted-toExprOfClass.check b/tests/run-macros/quoted-toExprOfClass.check new file mode 100644 index 000000000000..a26aa9ec6809 --- /dev/null +++ b/tests/run-macros/quoted-toExprOfClass.check @@ -0,0 +1,4 @@ +long +int +int +int diff --git a/tests/run-macros/quoted-toExprOfClass/Macros_1.scala b/tests/run-macros/quoted-toExprOfClass/Macros_1.scala new file mode 100644 index 000000000000..11056a3c1e87 --- /dev/null +++ b/tests/run-macros/quoted-toExprOfClass/Macros_1.scala @@ -0,0 +1,20 @@ +import scala.quoted._ + +inline def wildcard: Map[String, Class[_]] = ${ wildcardMacro } +inline def noWildcard: Map[String, Class[Int]] = ${ noWildcardMacro } + +def wildcardMacro(using Quotes): Expr[Map[String, Class[_]]] = { + val result: Map[String, Class[_]] = Map( + "foo" -> classOf[Long], + "bar" -> classOf[Int] + ) + Expr(result) +} + +def noWildcardMacro(using Quotes): Expr[Map[String, Class[Int]]] = { + val result: Map[String, Class[Int]] = Map( + "foo" -> classOf[Int], + "bar" -> classOf[Int] + ) + Expr(result) +} diff --git a/tests/run-macros/quoted-toExprOfClass/Test_2.scala b/tests/run-macros/quoted-toExprOfClass/Test_2.scala new file mode 100644 index 000000000000..1cc7e26a8894 --- /dev/null +++ b/tests/run-macros/quoted-toExprOfClass/Test_2.scala @@ -0,0 +1,10 @@ +object Test { + def main(args: Array[String]): Unit = { + val a: Map[String, Class[_]] = wildcard + val b: Map[String, Class[Int]] = noWildcard + println(a("foo")) + println(a("bar")) + println(b("foo")) + println(b("bar")) + } +} From ab220812b96b94d1821bb241e024e6ff0a5f429e Mon Sep 17 00:00:00 2001 From: Jasper Moeys Date: Wed, 27 Jan 2021 12:16:01 +0100 Subject: [PATCH 3/3] use new wildcard type syntax --- library/src/scala/quoted/ToExpr.scala | 2 +- tests/run-macros/quoted-toExprOfClass/Macros_1.scala | 6 +++--- tests/run-macros/quoted-toExprOfClass/Test_2.scala | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/library/src/scala/quoted/ToExpr.scala b/library/src/scala/quoted/ToExpr.scala index 13a3cd69bbfe..5d070f03eb18 100644 --- a/library/src/scala/quoted/ToExpr.scala +++ b/library/src/scala/quoted/ToExpr.scala @@ -81,7 +81,7 @@ object ToExpr { } /** Default implemetation of `ToExpr[Class[T]]` */ - given ClassToExpr[T <: Class[_]]: ToExpr[T] with { + given ClassToExpr[T <: Class[?]]: ToExpr[T] with { def apply(x: T)(using Quotes) = { import quotes.reflect._ Ref(defn.Predef_classOf).appliedToType(TypeRepr.typeConstructorOf(x)).asExpr.asInstanceOf[Expr[T]] diff --git a/tests/run-macros/quoted-toExprOfClass/Macros_1.scala b/tests/run-macros/quoted-toExprOfClass/Macros_1.scala index 11056a3c1e87..0b9f33f5ddbc 100644 --- a/tests/run-macros/quoted-toExprOfClass/Macros_1.scala +++ b/tests/run-macros/quoted-toExprOfClass/Macros_1.scala @@ -1,10 +1,10 @@ import scala.quoted._ -inline def wildcard: Map[String, Class[_]] = ${ wildcardMacro } +inline def wildcard: Map[String, Class[?]] = ${ wildcardMacro } inline def noWildcard: Map[String, Class[Int]] = ${ noWildcardMacro } -def wildcardMacro(using Quotes): Expr[Map[String, Class[_]]] = { - val result: Map[String, Class[_]] = Map( +def wildcardMacro(using Quotes): Expr[Map[String, Class[?]]] = { + val result: Map[String, Class[?]] = Map( "foo" -> classOf[Long], "bar" -> classOf[Int] ) diff --git a/tests/run-macros/quoted-toExprOfClass/Test_2.scala b/tests/run-macros/quoted-toExprOfClass/Test_2.scala index 1cc7e26a8894..eb64a083dcb6 100644 --- a/tests/run-macros/quoted-toExprOfClass/Test_2.scala +++ b/tests/run-macros/quoted-toExprOfClass/Test_2.scala @@ -1,6 +1,6 @@ object Test { def main(args: Array[String]): Unit = { - val a: Map[String, Class[_]] = wildcard + val a: Map[String, Class[?]] = wildcard val b: Map[String, Class[Int]] = noWildcard println(a("foo")) println(a("bar"))