Skip to content

Commit 77b0ae0

Browse files
Merge pull request #11715 from dotty-staging/add-Type-valueOfConstant
Add quotes.Type.valueOfConstant
2 parents 823206c + 14f838c commit 77b0ae0

File tree

4 files changed

+88
-1
lines changed

4 files changed

+88
-1
lines changed

library/src-bootstrapped/scala/quoted/Type.scala

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,31 @@ object Type:
1313

1414
/** Show a source code like representation of this type without syntax highlight */
1515
def show[T <: AnyKind](using Type[T])(using Quotes): String =
16-
import quotes.reflect._
16+
import quotes.reflect.*
1717
TypeTree.of[T].show
1818

1919
/** Return a quoted.Type with the given type */
2020
@compileTimeOnly("Reference to `scala.quoted.Type.of` was not handled by PickleQuotes")
2121
given of[T <: AnyKind](using Quotes): Type[T] = ???
2222

23+
24+
/** Extracts the value of singleton constant type, None otherwise.
25+
*
26+
* Example usage:
27+
* ```scala
28+
* ... match
29+
* case '{ $mirrorExpr : Mirror.Sum { type MirroredLabel = label } } =>
30+
* Type.valueOfConstant[label] // Option[String]
31+
* }
32+
* ```
33+
* @syntax markdown
34+
*/
35+
def valueOfConstant[T](using Type[T])(using Quotes): Option[T] =
36+
import quotes.reflect.*
37+
def valueOf(tpe: TypeRepr): Option[T] =
38+
tpe.dealias.widenTermRefByName match
39+
case ConstantType(const) => Some(const.value.asInstanceOf[T])
40+
case _ => None
41+
valueOf(TypeRepr.of[T])
42+
2343
end Type

tests/run-macros/from-type.check

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
Some(true)
2+
Some(false)
3+
Some(1)
4+
Some(2)
5+
Some(3)
6+
Some(4)
7+
Some(5)
8+
Some(6.0)
9+
Some(7.0)
10+
Some(a)
11+
Some(abc)
12+
Some(10)
13+
Some(11)
14+
None
15+
None
16+
None
17+
None
18+
None
19+
None
20+
None
21+
None
22+
None
23+
None
24+
None
25+
None
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import scala.quoted.*
2+
3+
inline def testValueOfType[T]: Unit = ${ testValueOfTypeExpr[T] }
4+
5+
private def testValueOfTypeExpr[T: Type](using Quotes): Expr[Unit] =
6+
val value = Type.valueOfConstant[T]
7+
val strExpr = Expr(value.toString)
8+
'{ println($strExpr) }
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
2+
@main def Test: Unit =
3+
testValueOfType[true]
4+
testValueOfType[false]
5+
testValueOfByte[1]
6+
testValueOfShort[2]
7+
testValueOfType[3]
8+
testValueOfType[4]
9+
testValueOfType[5L]
10+
testValueOfType[6d]
11+
testValueOfType[7f]
12+
testValueOfType['a']
13+
testValueOfType["abc"]
14+
val x: 10 = 10
15+
testValueOfType[x.type]
16+
type A = 11
17+
testValueOfType[A]
18+
19+
20+
testValueOfType[Boolean]
21+
testValueOfType[Byte]
22+
testValueOfType[Short]
23+
testValueOfType[Int]
24+
testValueOfType[Long]
25+
testValueOfType[Double]
26+
testValueOfType[Float]
27+
testValueOfType[Char]
28+
testValueOfType[String]
29+
testValueOfType[Null]
30+
testValueOfType[Any]
31+
testValueOfType[Some[1]]
32+
33+
transparent inline def testValueOfByte[B <: Byte] = testValueOfType[B]
34+
transparent inline def testValueOfShort[S <: Short] = testValueOfType[S]

0 commit comments

Comments
 (0)