Skip to content

Commit 0a12ad3

Browse files
committed
Add toExprOfTuple in scala.quoted
1 parent 0ebbcff commit 0a12ad3

File tree

3 files changed

+79
-1
lines changed

3 files changed

+79
-1
lines changed

library/src/scala/quoted/package.scala

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

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

84+
/** Lifts this sequence of expressions into an expression of a tuple
85+
*
86+
* Transforms a sequence of expression
87+
* `Seq(e1, e2, ...)` where `ei: Expr[_]`
88+
* to an expression equivalent to
89+
* `'{ ($e1, $e2, ...) }` typed as an `Expr[Tuple]`
90+
*/
91+
def (seq: Seq[Expr[_]]) toExprOfTuple given QuoteContext: Expr[Tuple] = {
92+
seq.size match {
93+
case 0 => Expr.unitExpr
94+
case 1 => '{ Tuple1( ${seq(0)}) }
95+
case 2 => '{ Tuple2( ${seq(0)}, ${seq(1)}) }
96+
case 3 => '{ Tuple3( ${seq(0)}, ${seq(1)}, ${seq(2)}) }
97+
case 4 => '{ Tuple4( ${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}) }
98+
case 5 => '{ Tuple5( ${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}) }
99+
case 6 => '{ Tuple6( ${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}) }
100+
case 7 => '{ Tuple7( ${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}) }
101+
case 8 => '{ Tuple8( ${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}, ${seq(7)}) }
102+
case 9 => '{ Tuple9( ${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}, ${seq(7)}, ${seq(8)}) }
103+
case 10 => '{ Tuple10(${seq(0)}, ${seq(1)}, ${seq(2)}, ${seq(3)}, ${seq(4)}, ${seq(5)}, ${seq(6)}, ${seq(7)}, ${seq(8)}, ${seq(9)}) }
104+
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)}) }
105+
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)}) }
106+
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)}) }
107+
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)}) }
108+
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)}) }
109+
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)}) }
110+
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)}) }
111+
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)}) }
112+
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)}) }
113+
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)}) }
114+
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)}) }
115+
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)}) }
116+
case _ => '{ Tuple.fromIArray(IArray(${seq.toExprOfSeq}: _*)) }
117+
}
84118

119+
}
85120
}
86121

87122
}
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)