Closed
Description
Macro:
package playground
import scala.quoted._, scala.quoted.matching._
import delegate scala.quoted._
import scala.tasty._
inline def mcr(body: => Any): Unit = ${mcrImpl('body)}
def mcrImpl[T](body: Expr[Any]) given (ctx: QuoteContext): Expr[Any] = {
import ctx.tasty._
val bTree = body.unseal
val under = bTree.underlyingArgument
println(s"\nbTree:\n$bTree\n${bTree.show}")
println(s"\nunder:\n$under\n${under.show}")
val res = '{Box(${under.asInstanceOf[Term].seal})}
println(s"\nOut:\n${res.show}\n")
res
}
class Box(inner: => Any)
Main:
package playground
@main def main = mcr { try () catch { case x => } }
Output:
[info] Compiling 1 Scala source to /Users/anatolii/Projects/dotty/playground/core/target/scala-0.18/classes ...
bTree:
Inlined(EmptyTree,List(),Block(List(),Try(Literal(Constant(())),List(CaseDef(Bind(x,Ident(_)),EmptyTree,Block(List(),Literal(Constant(()))))),EmptyTree)))
try () catch {
case x =>
()
}
under:
Try(Literal(Constant(())),List(CaseDef(Bind(x,Ident(_)),EmptyTree,Literal(Constant(())))),EmptyTree)
try () catch {
case x =>
()
}
Out:
new playground.Box(try () catch {
case x =>
()
})
[error] -- [E005] Naming Error: /Users/anatolii/Projects/dotty/playground/core/src/main/scala/playground/Main.scala:3:43
[error] 3 |@main def main = mcr { try () catch { case x => } }
[error] | ^
[error] | duplicate pattern variable: x
[error] | This location is in code that was inlined at Main.scala:3
[error] one error found