Skip to content

Commit cea5a62

Browse files
Merge pull request #7037 from dotty-staging/add-seq-to-expr-tuple
Add toExprOfTuple in scala.quoted
2 parents 8c8e33d + 20564ec commit cea5a62

File tree

5 files changed

+98
-1
lines changed

5 files changed

+98
-1
lines changed

library/src/scala/quoted/package.scala

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ package object quoted {
5454

5555
/** Lifts this sequence of expressions into an expression of a sequence
5656
*
57-
* Transforms a list of expression
57+
* Transforms a sequence of expression
5858
* `Seq(e1, e2, ...)` where `ei: Expr[T]`
5959
* to an expression equivalent to
6060
* `'{ Seq($e1, $e2, ...) }` typed as an `Expr[Seq[T]]`
@@ -79,7 +79,42 @@ package object quoted {
7979
def (list: List[Expr[T]]) toExprOfList[T] given Type[T], QuoteContext: Expr[List[T]] =
8080
if (list.isEmpty) '{ Nil } else '{ List(${list.toExprOfSeq}: _*) }
8181

82+
/** Lifts this sequence of expressions into an expression of a tuple
83+
*
84+
* Transforms a sequence of expression
85+
* `Seq(e1, e2, ...)` where `ei: Expr[_]`
86+
* to an expression equivalent to
87+
* `'{ ($e1, $e2, ...) }` typed as an `Expr[Tuple]`
88+
*/
89+
def (seq: Seq[Expr[_]]) toExprOfTuple given QuoteContext: Expr[Tuple] = {
90+
seq.size match {
91+
case 0 => Expr.unitExpr
92+
case 1 => '{ Tuple1( ${seq(0)}) }
93+
case 2 => '{ Tuple2( ${seq(0)}, ${seq(1)}) }
94+
case 3 => '{ Tuple3( ${seq(0)}, ${seq(1)}, ${seq(2)}) }
95+
case 4 => '{ Tuple4( ${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}) }
96+
case 5 => '{ Tuple5( ${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}) }
97+
case 6 => '{ Tuple6( ${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}) }
98+
case 7 => '{ Tuple7( ${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}) }
99+
case 8 => '{ Tuple8( ${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}, ${seq(7)}) }
100+
case 9 => '{ Tuple9( ${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}, ${seq(7)}, ${seq(8)}) }
101+
case 10 => '{ Tuple10(${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}, ${seq(7)}, ${seq(8)}, ${seq(9)}) }
102+
case 11 => '{ Tuple11(${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}, ${seq(7)}, ${seq(8)}, ${seq(9)}, ${seq(10)}) }
103+
case 12 => '{ Tuple12(${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}, ${seq(7)}, ${seq(8)}, ${seq(9)}, ${seq(10)}, ${seq(11)}) }
104+
case 13 => '{ Tuple13(${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}, ${seq(7)}, ${seq(8)}, ${seq(9)}, ${seq(10)}, ${seq(11)}, ${seq(12)}) }
105+
case 14 => '{ Tuple14(${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}, ${seq(7)}, ${seq(8)}, ${seq(9)}, ${seq(10)}, ${seq(11)}, ${seq(12)}, ${seq(13)}) }
106+
case 15 => '{ Tuple15(${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}, ${seq(7)}, ${seq(8)}, ${seq(9)}, ${seq(10)}, ${seq(11)}, ${seq(12)}, ${seq(13)}, ${seq(14)}) }
107+
case 16 => '{ Tuple16(${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}, ${seq(7)}, ${seq(8)}, ${seq(9)}, ${seq(10)}, ${seq(11)}, ${seq(12)}, ${seq(13)}, ${seq(14)}, ${seq(15)}) }
108+
case 17 => '{ Tuple17(${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}, ${seq(7)}, ${seq(8)}, ${seq(9)}, ${seq(10)}, ${seq(11)}, ${seq(12)}, ${seq(13)}, ${seq(14)}, ${seq(15)}, ${seq(16)}) }
109+
case 18 => '{ Tuple18(${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}, ${seq(7)}, ${seq(8)}, ${seq(9)}, ${seq(10)}, ${seq(11)}, ${seq(12)}, ${seq(13)}, ${seq(14)}, ${seq(15)}, ${seq(16)}, ${seq(17)}) }
110+
case 19 => '{ Tuple19(${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}, ${seq(7)}, ${seq(8)}, ${seq(9)}, ${seq(10)}, ${seq(11)}, ${seq(12)}, ${seq(13)}, ${seq(14)}, ${seq(15)}, ${seq(16)}, ${seq(17)}, ${seq(18)}) }
111+
case 20 => '{ Tuple20(${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}, ${seq(7)}, ${seq(8)}, ${seq(9)}, ${seq(10)}, ${seq(11)}, ${seq(12)}, ${seq(13)}, ${seq(14)}, ${seq(15)}, ${seq(16)}, ${seq(17)}, ${seq(18)}, ${seq(19)}) }
112+
case 21 => '{ Tuple21(${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}, ${seq(7)}, ${seq(8)}, ${seq(9)}, ${seq(10)}, ${seq(11)}, ${seq(12)}, ${seq(13)}, ${seq(14)}, ${seq(15)}, ${seq(16)}, ${seq(17)}, ${seq(18)}, ${seq(19)}, ${seq(20)}) }
113+
case 22 => '{ Tuple22(${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}, ${seq(7)}, ${seq(8)}, ${seq(9)}, ${seq(10)}, ${seq(11)}, ${seq(12)}, ${seq(13)}, ${seq(14)}, ${seq(15)}, ${seq(16)}, ${seq(17)}, ${seq(18)}, ${seq(19)}, ${seq(20)}, ${seq(21)}) }
114+
case _ => '{ Tuple.fromIArray(IArray(${seq.toExprOfSeq}: _*)) }
115+
}
82116

117+
}
83118
}
84119

85120
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import scala.quoted._
2+
3+
object Macro {
4+
inline def t2[T0, T1](t0: T0, t1: T1)/*: (T0, T1) */ = ${ impl2('{t0}, '{t1}) }
5+
6+
def impl2[T0: Type, T1: Type](t0: Expr[T0], t1: Expr[T1]) given (qctx: QuoteContext)/*: Expr[(T0, T1)]*/ = {
7+
import qctx.tasty._
8+
import util._
9+
10+
val seq = List(t0, t1)
11+
val res = seq.toExprOfTuple
12+
res//.cast[(T0, T1)]
13+
}
14+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
object Test extends App {
2+
val t2 = Macro.t2(23, "foo")
3+
val t2a/*: (Int, String)*/ = t2
4+
assert(t2a == (23, "foo"))
5+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
()
2+
(1)
3+
(1,2)
4+
(1,2,3)
5+
(1,2,3,4)
6+
(1,2,3,4,5)
7+
(1,2,3,4,5,6)
8+
(1,2,3,4,5,6,7)
9+
(1,2,3,4,5,6,7,8)
10+
(1,2,3,4,5,6,7,8,9)
11+
(1,2,3,4,5,6,7,8,9,10)
12+
(1,2,3,4,5,6,7,8,9,10,11)
13+
(1,2,3,4,5,6,7,8,9,10,11,12)
14+
(1,2,3,4,5,6,7,8,9,10,11,12,13)
15+
(1,2,3,4,5,6,7,8,9,10,11,12,13,14)
16+
(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
17+
(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)
18+
(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17)
19+
(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18)
20+
(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19)
21+
(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
22+
(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21)
23+
(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22)
24+
(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23)
25+
(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24)
26+
(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
2+
import scala.quoted._
3+
4+
object Test {
5+
implicit val toolbox: scala.quoted.Toolbox = scala.quoted.Toolbox.make(getClass.getClassLoader)
6+
def main(args: Array[String]): Unit = {
7+
for (n <- 0 to 25) {
8+
prev = 0
9+
println(run { Seq.fill(n)('{next}).toExprOfTuple })
10+
}
11+
}
12+
var prev = 0
13+
def next: Int = {
14+
prev += 1
15+
prev
16+
}
17+
}

0 commit comments

Comments
 (0)