File tree 6 files changed +39
-14
lines changed 6 files changed +39
-14
lines changed Original file line number Diff line number Diff line change @@ -84,11 +84,14 @@ object FromExpr {
84
84
def unapply (expr : Expr [T ])(using Quotes ) =
85
85
import quotes .reflect ._
86
86
def rec (tree : Term ): Option [T ] = tree match {
87
- case Literal (c) if c.value != null => Some (c.value.asInstanceOf [T ])
88
87
case Block (Nil , e) => rec(e)
89
88
case Typed (e, _) => rec(e)
90
89
case Inlined (_, Nil , e) => rec(e)
91
- case _ => None
90
+ case _ =>
91
+ tree.tpe.widenTermRefByName match
92
+ case ConstantType (c) =>
93
+ Some (c.value.asInstanceOf [T ])
94
+ case _ => None
92
95
}
93
96
rec(expr.asTerm)
94
97
}
Original file line number Diff line number Diff line change 1
- class Bag (seq : Seq [Char ])
2
-
3
- inline val i = 2
4
- inline val j : Int = 2 // error
5
- inline val b : Boolean = true // error
6
- inline val s : String = " " // error
7
- inline val bagA = new Bag (Seq ('a' , 'b' , 'c' )) // error
8
- inline val bagB : Bag = new Bag (Seq ('a' , 'b' , 'c' )) // error
1
+ inline val str1 = " Hello, "
2
+ inline val str2 = " Scala 3"
3
+ println(Str .concat(str1, str2))
Original file line number Diff line number Diff line change 6
6
neht
7
7
esle
8
8
lav
9
- vals
9
+ slav
10
10
fed
11
- defs
11
+ sfed
12
12
fed
13
13
rab
14
14
yrt
Original file line number Diff line number Diff line change @@ -31,7 +31,7 @@ object Test {
31
31
32
32
rewrite {
33
33
val s : " vals" = " vals"
34
- println(s) // prints "foo" not "oof"
34
+ println(s)
35
35
}
36
36
37
37
rewrite {
@@ -41,7 +41,7 @@ object Test {
41
41
42
42
rewrite {
43
43
def s : " defs" = " defs"
44
- println(s) // prints "foo" not "oof"
44
+ println(s)
45
45
}
46
46
47
47
rewrite {
Original file line number Diff line number Diff line change
1
+ @ main def Test : Unit =
2
+ inline def str1 = " Hello, "
3
+ inline val str2 = " Scala 3"
4
+ println(Str .concat(str1, str2))
5
+
6
+ inline def i1 = 1
7
+ inline val i2 = 2
8
+ println(I .sum(i1, i2))
Original file line number Diff line number Diff line change
1
+ import scala .quoted .*
2
+
3
+ object Str :
4
+ inline def concat (inline a : String , inline b : String ): String =
5
+ $ { evalConcat(' a , ' b ) }
6
+
7
+ def evalConcat (expra : Expr [String ], exprb : Expr [String ])(using Quotes ): Expr [String ] =
8
+ val a = expra.valueOrError
9
+ val b = exprb.valueOrError
10
+ Expr (a ++ b)
11
+
12
+ object I :
13
+ inline def sum (inline a : Int , inline b : Int ): Int =
14
+ $ { evalConcat(' a , ' b ) }
15
+
16
+ def evalConcat (expra : Expr [Int ], exprb : Expr [Int ])(using Quotes ): Expr [Int ] =
17
+ val a = expra.valueOrError
18
+ val b = exprb.valueOrError
19
+ Expr (a + b)
You can’t perform that action at this time.
0 commit comments