diff --git a/compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala b/compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala index 9bc1e4bcb5ea..1518492e6b1d 100644 --- a/compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala +++ b/compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala @@ -167,7 +167,11 @@ class ReifyQuotes extends MacroTransform { def pickleAsTasty() = { val meth = if (isType) ref(defn.Unpickler_unpickleType).appliedToType(originalTp) - else ref(defn.Unpickler_unpickleExpr).appliedToType(originalTp.widen.dealias) + else + val tpe = + if originalTp =:= defn.NilModule.termRef then originalTp // Workaround #4987 + else originalTp.widen.dealias + ref(defn.Unpickler_unpickleExpr).appliedToType(tpe) val pickledQuoteStrings = liftList(PickledQuotes.pickleQuote(body).map(x => Literal(Constant(x))), defn.StringType) val splicesList = liftList(splices, defn.FunctionType(1).appliedTo(defn.SeqType.appliedTo(defn.AnyType), defn.AnyType)) meth.appliedTo(pickledQuoteStrings, splicesList) diff --git a/library/src-bootstrapped/scala/quoted/Expr.scala b/library/src-bootstrapped/scala/quoted/Expr.scala index 95fe08f2e023..e5a3eeaccec8 100644 --- a/library/src-bootstrapped/scala/quoted/Expr.scala +++ b/library/src-bootstrapped/scala/quoted/Expr.scala @@ -113,7 +113,7 @@ object Expr { * `'{ List($e1, $e2, ...) }` typed as an `Expr[List[T]]` */ def ofList[T](xs: Seq[Expr[T]])(using Type[T], QuoteContext): Expr[List[T]] = - if (xs.isEmpty) '{ Nil } else '{ List(${Varargs(xs)}: _*) } + if (xs.isEmpty) Expr(Nil) else '{ List(${Varargs(xs)}: _*) } /** Lifts this sequence of expressions into an expression of a tuple * diff --git a/library/src-bootstrapped/scala/quoted/Liftable.scala b/library/src-bootstrapped/scala/quoted/Liftable.scala index 4f6fadf7b5a5..61dc0e9d6c46 100644 --- a/library/src-bootstrapped/scala/quoted/Liftable.scala +++ b/library/src-bootstrapped/scala/quoted/Liftable.scala @@ -19,6 +19,8 @@ trait Liftable[T] { */ object Liftable { + // IMPORTANT Keep in sync with tests/run-staging/liftables.scala + given BooleanIsLiftable[T <: Boolean] as Liftable[T] = new PrimitiveLiftable given ByteIsLiftable[T <: Byte] as Liftable[T] = new PrimitiveLiftable given ShortIsLiftable[T <: Short] as Liftable[T] = new PrimitiveLiftable @@ -103,7 +105,7 @@ object Liftable { else '{ Array(${Expr(array(0))}, ${Expr(array.toSeq.tail)}: _*) } } - given iArrayIsLiftable[T: Type](using ltArray: Liftable[Array[T]]) as Liftable[IArray[T]] { + given IArrayIsLiftable[T: Type](using ltArray: Liftable[Array[T]]) as Liftable[IArray[T]] { def toExpr(iarray: IArray[T]): QuoteContext ?=> Expr[IArray[T]] = '{ ${ltArray.toExpr(iarray.asInstanceOf[Array[T]])}.asInstanceOf[IArray[T]] } } @@ -118,6 +120,11 @@ object Liftable { Expr.ofList(xs.map(summon[Liftable[T]].toExpr)) } + given NilIsLiftable as Liftable[Nil.type] = new Liftable[Nil.type] { + def toExpr(xs: Nil.type): QuoteContext ?=> Expr[Nil.type] = + '{ Nil } + } + given [T: Type: Liftable] as Liftable[Set[T]] = new Liftable[Set[T]] { def toExpr(set: Set[T]): QuoteContext ?=> Expr[Set[T]] = '{ Set(${Expr(set.toSeq)}: _*) } @@ -130,16 +137,40 @@ object Liftable { given [T: Type: Liftable] as Liftable[Option[T]] = new Liftable[Option[T]] { def toExpr(x: Option[T]): QuoteContext ?=> Expr[Option[T]] = x match { - case Some(x) => '{ Some[T](${Expr(x)}) } - case None => '{ None: Option[T] } + case x: Some[T] => Expr(x) + case None => Expr(None) } } + given [T: Type: Liftable] as Liftable[Some[T]] = new Liftable[Some[T]] { + def toExpr(x: Some[T]): QuoteContext ?=> Expr[Some[T]] = + '{ Some[T](${Expr(x.get)}) } + } + + given Liftable[None.type] = new Liftable[None.type] { + def toExpr(x: None.type): QuoteContext ?=> Expr[None.type] = + '{ None } + } + given [L: Type: Liftable, R: Type: Liftable] as Liftable[Either[L, R]] = new Liftable[Either[L, R]] { - def toExpr(x: Either[L, R]): QuoteContext ?=> Expr[Either[L, R]] = x match { - case Left(x) => '{ Left[L, R](${Expr(x)}) } - case Right(x) => '{ Right[L, R](${Expr(x)}) } - } + def toExpr(x: Either[L, R]): QuoteContext ?=> Expr[Either[L, R]] = x match + case x: Left[L, R] => Expr(x) + case x: Right[L, R] => Expr(x) + } + + given [L: Type: Liftable, R: Type] as Liftable[Left[L, R]] = new Liftable[Left[L, R]] { + def toExpr(x: Left[L, R]): QuoteContext ?=> Expr[Left[L, R]] = + '{ Left[L, R](${Expr(x.value)}) } + } + + given [L: Type, R: Type: Liftable] as Liftable[Right[L, R]] = new Liftable[Right[L, R]] { + def toExpr(x: Right[L, R]): QuoteContext ?=> Expr[Right[L, R]] = + '{ Right[L, R](${Expr(x.value)}) } + } + + given EmptyTupleIsLiftable as Liftable[EmptyTuple.type] = new { + def toExpr(tup: EmptyTuple.type) = + '{ EmptyTuple } } given [T1: Type: Liftable] as Liftable[Tuple1[T1]] = new { @@ -305,4 +336,11 @@ object Liftable { '{ BigDecimal(${Expr(x.toString)}) } } + /** Lift a StringContext */ + given Liftable[StringContext] = new Liftable[StringContext] { + def toExpr(stringContext: StringContext): QuoteContext ?=> Expr[StringContext] = + val parts = Varargs(stringContext.parts.map(Expr(_))) + '{ StringContext($parts: _*) } + } + } diff --git a/tests/pos-macros/nil-liftable.scala b/tests/pos-macros/nil-liftable.scala new file mode 100644 index 000000000000..745bfcf45dab --- /dev/null +++ b/tests/pos-macros/nil-liftable.scala @@ -0,0 +1,7 @@ +import scala.quoted._ + +class Test: + given NilIsLiftable as Liftable[Nil.type] = new Liftable[Nil.type] { + def toExpr(xs: Nil.type): QuoteContext ?=> Expr[Nil.type] = + '{ Nil } + } diff --git a/tests/pos-macros/quote-liftable.scala b/tests/pos-macros/quote-liftable.scala index eb71ffb5647e..a7d7c00cb376 100644 --- a/tests/pos-macros/quote-liftable.scala +++ b/tests/pos-macros/quote-liftable.scala @@ -35,6 +35,7 @@ def test(using QuoteContext) = { Expr(1.0f) Expr(1.0) Expr("abc") + Expr(StringContext("a", "b", "c")) val xs: Expr[List[Int]] = Expr(1 :: 2 :: 3 :: Nil) } diff --git a/tests/run-staging/liftables.check b/tests/run-staging/liftables.check new file mode 100644 index 000000000000..7579a2ffb51b --- /dev/null +++ b/tests/run-staging/liftables.check @@ -0,0 +1,102 @@ +true +false + +3 +4 +5 +6L +7.1f +8.1 + +'a' +"string" + +scala.Predef.classOf[java.lang.String] +scala.reflect.ClassTag.apply[java.lang.String](scala.Predef.classOf[java.lang.String]) + +scala.Array.apply[java.lang.String]("a")(scala.reflect.ClassTag.apply[java.lang.String](scala.Predef.classOf[java.lang.String])) +scala.Array.apply(true, ) +scala.Array.apply(3, ) +scala.Array.apply(4, ) +scala.Array.apply(5, ) +scala.Array.apply(6L, ) +scala.Array.apply(7.1f, ) +scala.Array.apply(8.1, ) + +scala.Array.apply[java.lang.String]("b")(scala.reflect.ClassTag.apply[java.lang.String](scala.Predef.classOf[java.lang.String])).asInstanceOf[scala.IArray$package.IArray[java.lang.String]] + +1, 2, 3 +scala.Nil +scala.List.apply[scala.Int](1, 2, 3) +scala.Predef.Set.apply[scala.Int](1, 2, 3) +scala.Predef.Map.apply[scala.Int, scala.Int](scala.Tuple2.apply[scala.Int, scala.Int](1, 2), scala.Tuple2.apply[scala.Int, scala.Int](2, 3)) + +scala.None +scala.Some.apply[scala.Int](4) +scala.Some.apply[scala.Int](4) + +scala.Left.apply[scala.Int, scala.Nothing](1) +scala.Right.apply[scala.Nothing, scala.Int](2) +scala.Right.apply[scala.Int, scala.Int](3) + +scala.BigInt.apply(scala.Array.apply(1, -90)) +scala.BigDecimal.apply("422.54") + +scala.StringContext.apply("a", "b") + +scala.Tuple$package.EmptyTuple +scala.Tuple1.apply[scala.Int](1) +scala.Tuple2.apply[scala.Int, scala.Int](1, 2) +scala.Tuple3.apply[scala.Int, scala.Int, scala.Int](1, 2, 3) +scala.Tuple4.apply[scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4) +scala.Tuple5.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4, 5) +scala.Tuple6.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4, 5, 6) +scala.Tuple7.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4, 5, 6, 7) +scala.Tuple8.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4, 5, 6, 7, 8) +scala.Tuple9.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4, 5, 6, 7, 8, 9) +scala.Tuple10.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4, 5, 6, 7, 8, 9, 10) +scala.Tuple11.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) +scala.Tuple12.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) +scala.Tuple13.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13) +scala.Tuple14.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) +scala.Tuple15.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) +scala.Tuple16.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) +scala.Tuple17.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17) +scala.Tuple18.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18) +scala.Tuple19.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19) +scala.Tuple20.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20) +scala.Tuple21.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21) +scala.Tuple22.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22) +{ + val x$1: scala.Int = 1 + val Tuple_this: scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.Tuple$package.EmptyTuple]]]]]]]]]]]]]]]]]]]]]] = scala.Tuple22.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23) + + (scala.runtime.Tuple.cons(x$1, Tuple_this).asInstanceOf[scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.Tuple$package.EmptyTuple]]]]]]]]]]]]]]]]]]]]]]]]: scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.Tuple$package.EmptyTuple]]]]]]]]]]]]]]]]]]]]]]]) +} +{ + val x$1: scala.Int = 1 + val Tuple_this: scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.Tuple$package.EmptyTuple]]]]]]]]]]]]]]]]]]]]]]] = { + val `x$1₂`: scala.Int = 2 + val `Tuple_this₂`: scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.Tuple$package.EmptyTuple]]]]]]]]]]]]]]]]]]]]]] = scala.Tuple22.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24) + + (scala.runtime.Tuple.cons(`x$1₂`, `Tuple_this₂`).asInstanceOf[scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.Tuple$package.EmptyTuple]]]]]]]]]]]]]]]]]]]]]]]]: scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.Tuple$package.EmptyTuple]]]]]]]]]]]]]]]]]]]]]]]) + } + + (scala.runtime.Tuple.cons(x$1, Tuple_this).asInstanceOf[scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.Tuple$package.EmptyTuple]]]]]]]]]]]]]]]]]]]]]]]]]: scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.Tuple$package.EmptyTuple]]]]]]]]]]]]]]]]]]]]]]]]) +} +{ + val x$1: scala.Int = 1 + val Tuple_this: scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.Tuple$package.EmptyTuple]]]]]]]]]]]]]]]]]]]]]]]] = { + val `x$1₂`: scala.Int = 2 + val `Tuple_this₂`: scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.Tuple$package.EmptyTuple]]]]]]]]]]]]]]]]]]]]]]] = { + val `x$1₃`: scala.Int = 3 + val `Tuple_this₃`: scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.Tuple$package.EmptyTuple]]]]]]]]]]]]]]]]]]]]]] = scala.Tuple22.apply[scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int, scala.Int](4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25) + + (scala.runtime.Tuple.cons(`x$1₃`, `Tuple_this₃`).asInstanceOf[scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.Tuple$package.EmptyTuple]]]]]]]]]]]]]]]]]]]]]]]]: scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.Tuple$package.EmptyTuple]]]]]]]]]]]]]]]]]]]]]]]) + } + + (scala.runtime.Tuple.cons(`x$1₂`, `Tuple_this₂`).asInstanceOf[scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.Tuple$package.EmptyTuple]]]]]]]]]]]]]]]]]]]]]]]]]: scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.Tuple$package.EmptyTuple]]]]]]]]]]]]]]]]]]]]]]]]) + } + + (scala.runtime.Tuple.cons(x$1, Tuple_this).asInstanceOf[scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.Tuple$package.EmptyTuple]]]]]]]]]]]]]]]]]]]]]]]]]]: scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.*:[scala.Int, scala.Tuple$package.EmptyTuple]]]]]]]]]]]]]]]]]]]]]]]]]) +} diff --git a/tests/run-staging/liftables.scala b/tests/run-staging/liftables.scala new file mode 100644 index 000000000000..80ffff7b3fcf --- /dev/null +++ b/tests/run-staging/liftables.scala @@ -0,0 +1,79 @@ +import scala.quoted._ +import scala.quoted.staging._ +object Test { + given Toolbox = Toolbox.make(getClass.getClassLoader) + def main(args: Array[String]): Unit = withQuoteContext { + println(Expr(true).show) + println(Expr(false).show) + println() + println(Expr(3: Byte).show) + println(Expr(4: Short).show) + println(Expr(5: Int).show) + println(Expr(6: Long).show) + println(Expr(7.1: Float).show) + println(Expr(8.1: Double).show) + println() + println(Expr('a').show) + println(Expr("string").show) + println() + println(Expr(classOf[String]).show) + println(Expr(summon[reflect.ClassTag[String]]).show) + println() + println(Expr(Array("a")).show) + println(Expr(Array(true)).show) + println(Expr(Array(3: Byte)).show) + println(Expr(Array(4: Short)).show) + println(Expr(Array(5: Int)).show) + println(Expr(Array(6: Long)).show) + println(Expr(Array(7.1: Float)).show) + println(Expr(Array(8.1: Double)).show) + println() + println(Expr(IArray("b")).show) + println() + println(Expr(Seq(1, 2, 3)).show) + println(Expr(Nil).show) + println(Expr(List(1, 2, 3)).show) + println(Expr(Set(1, 2, 3)).show) + println(Expr(Map(1 -> 2, 2 -> 3)).show) + println() + println(Expr(None).show) + println(Expr(Some(4)).show) + println(Expr(Option(4)).show) + println() + println(Expr(Left(1)).show) + println(Expr(Right(2)).show) + println(Expr(Right(3): Either[Int, Int]).show) + println() + println(Expr(BigInt("422")).show) + println(Expr(BigDecimal("422.54")).show) + println() + println(Expr(StringContext("a", "b")).show) + println() + println(Expr(EmptyTuple).show) + println(Expr(1 *: EmptyTuple).show) + println(Expr((1, 2)).show) + println(Expr((1, 2, 3)).show) + println(Expr((1, 2, 3, 4)).show) + println(Expr((1, 2, 3, 4, 5)).show) + println(Expr((1, 2, 3, 4, 5, 6)).show) + println(Expr((1, 2, 3, 4, 5, 6, 7)).show) + println(Expr((1, 2, 3, 4, 5, 6, 7, 8)).show) + println(Expr((1, 2, 3, 4, 5, 6, 7, 8, 9)).show) + println(Expr((1, 2, 3, 4, 5, 6, 7, 8, 9, 10)).show) + println(Expr((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)).show) + println(Expr((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)).show) + println(Expr((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)).show) + println(Expr((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)).show) + println(Expr((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)).show) + println(Expr((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)).show) + println(Expr((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17)).show) + println(Expr((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18)).show) + println(Expr((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)).show) + println(Expr((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)).show) + println(Expr((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21)).show) + println(Expr((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22)).show) + println(Expr((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23)).show) + println(Expr((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24)).show) + println(Expr((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)).show) + } +}