Skip to content

Commit 733e20f

Browse files
committed
Add abstractions for ByName arguments to Quotes
1 parent b7e5e57 commit 733e20f

File tree

3 files changed

+51
-0
lines changed

3 files changed

+51
-0
lines changed

compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,29 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
930930
end extension
931931
end ReturnMethods
932932

933+
type ByNameArg = tpd.ByName
934+
935+
object ByNameArgTypeTest extends TypeTest[Tree, ByNameArg]:
936+
def unapply(x: Tree): Option[ByNameArg & x.type] = x match
937+
case tpt: (tpd.ByName & x.type) => Some(tpt)
938+
case _ => None
939+
end ByNameArgTypeTest
940+
941+
object ByNameArg extends ByNameArgModule:
942+
def apply(result: TypeTree): ByNameArg =
943+
withDefaultPos(tpd.ByName(result))
944+
def copy(original: Tree)(result: TypeTree): ByNameArg =
945+
tpd.cpy.ByName(original)(result)
946+
def unapply(x: ByNameArg): Some[TypeTree] =
947+
Some(x.expr)
948+
end ByNameArg
949+
950+
given ByNameArgMethods: ByNameArgMethods with
951+
extension (self: ByNameArg)
952+
def expr: TypeTree = self.expr
953+
end extension
954+
end ByNameArgMethods
955+
933956
type Repeated = tpd.SeqLiteral
934957

935958
object RepeatedTypeTest extends TypeTest[Tree, Repeated]:

compiler/src/scala/quoted/runtime/impl/printers/Extractors.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ object Extractors {
110110
this += "SummonFrom(" ++= cases += ")"
111111
case Return(expr, from) =>
112112
this += "Return(" += expr += ", " += from += ")"
113+
case ByNameArg(result) =>
114+
this += "ByNameArg(" += result += ")"
113115
case While(cond, body) =>
114116
this += "While(" += cond += ", " += body += ")"
115117
case Try(block, handlers, finalizer) =>

library/src/scala/quoted/Quotes.scala

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1498,6 +1498,32 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
14981498
end extension
14991499
end ReturnMethods
15001500

1501+
/** A delayed <by-name> argument for a call-by=name parameter */
1502+
type ByNameArg <: Term
1503+
1504+
/** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `ByNameArg` */
1505+
given ByNameArgTypeTest: TypeTest[Tree, ByNameArg]
1506+
1507+
/** Module object of `a <by-name>` argument */
1508+
val ByNameArg: ByNameArgModule
1509+
1510+
/** Methods of the module object `val ByNameArg` */
1511+
trait ByNameArgModule { this: ByNameArg.type =>
1512+
def apply(result: TypeTree): ByNameArg
1513+
def copy(original: Tree)(result: TypeTree): ByNameArg
1514+
def unapply(x: ByNameArg): Some[TypeTree]
1515+
}
1516+
1517+
/** Makes extension methods on `ByNameArg` available without any imports */
1518+
given ByNameArgMethods: ByNameArgMethods
1519+
1520+
/** Extension methods of `ByNameArg` */
1521+
trait ByNameArgMethods:
1522+
extension (self: ByNameArg)
1523+
def expr: TypeTree
1524+
end extension
1525+
end ByNameArgMethods
1526+
15011527
/** Tree representing a variable argument list in the source code */
15021528
type Repeated <: Term
15031529

0 commit comments

Comments
 (0)