@@ -36,7 +36,11 @@ object Splicer {
3636 val liftedArgs = getLiftedArgs(call, bindings)
3737 val interpreter = new Interpreter (pos, classLoader)
3838 val interpreted = interpreter.interpretCallToSymbol[Seq [Any ] => Object ](call.symbol)
39- interpreted.flatMap(lambda => evaluateLambda(lambda, liftedArgs, pos)).fold(tree)(PickledQuotes .quotedExprToTree)
39+ evaluateMacro(pos) {
40+ // Some parts of the macro are evaluated during the unpickling performed in quotedExprToTree
41+ val evaluated = interpreted.map(lambda => lambda(liftedArgs).asInstanceOf [scala.quoted.Expr [Nothing ]])
42+ evaluated.fold(tree)(PickledQuotes .quotedExprToTree)
43+ }
4044 }
4145
4246 /** Given the inline code and bindings, compute the lifted arguments that will be used to execute the macro
@@ -73,20 +77,21 @@ object Splicer {
7377 liftArgs(call.symbol.info, allArgs(call, Nil ))
7478 }
7579
76- private def evaluateLambda (lambda : Seq [Any ] => Object , args : Seq [Any ], pos : Position )(implicit ctx : Context ): Option [scala.quoted.Expr [Nothing ]] = {
77- try Some (lambda(args).asInstanceOf [scala.quoted.Expr [Nothing ]])
80+ /* Evaluate the code in the macro and handle exceptions durring evaluation */
81+ private def evaluateMacro (pos : Position )(code : => Tree )(implicit ctx : Context ): Tree = {
82+ try code
7883 catch {
7984 case ex : scala.quoted.QuoteError =>
8085 ctx.error(ex.getMessage, pos)
81- None
86+ EmptyTree
8287 case NonFatal (ex) =>
8388 val msg =
8489 s """ Failed to evaluate inlined quote.
85- | Caused by: ${ex.getMessage}
86- | ${ex.getStackTrace.takeWhile(_.getClassName != " dotty.tools.dotc.transform.Splicer$" ).init.mkString(" \n " )}
90+ | Caused by ${ex.getClass} : ${if (ex.getMessage == null ) " " else ex.getMessage}
91+ | ${ex.getStackTrace.takeWhile(_.getClassName != " dotty.tools.dotc.transform.Splicer$" ).init.mkString(" \n " )}
8792 """ .stripMargin
8893 ctx.error(msg, pos)
89- None
94+ EmptyTree
9095 }
9196 }
9297
0 commit comments