@@ -264,7 +264,7 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
264
264
object DefDef extends DefDefModule :
265
265
def apply (symbol : Symbol , rhsFn : List [List [Tree ]] => Option [Term ]): DefDef =
266
266
withDefaultPos(tpd.DefDef (symbol.asTerm, prefss =>
267
- yCheckedOwners(rhsFn(prefss), symbol).getOrElse(tpd.EmptyTree )
267
+ yCheckedOwners(yCheckValidExpr( rhsFn(prefss) ), symbol).getOrElse(tpd.EmptyTree )
268
268
))
269
269
def copy (original : Tree )(name : String , paramss : List [ParamClause ], tpt : TypeTree , rhs : Option [Term ]): DefDef =
270
270
tpd.cpy.DefDef (original)(name.toTermName, paramss, tpt, yCheckedOwners(rhs, original.symbol).getOrElse(tpd.EmptyTree ))
@@ -293,9 +293,9 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
293
293
294
294
object ValDef extends ValDefModule :
295
295
def apply (symbol : Symbol , rhs : Option [Term ]): ValDef =
296
- tpd.ValDef (symbol.asTerm, yCheckedOwners(rhs, symbol).getOrElse(tpd.EmptyTree ))
296
+ tpd.ValDef (symbol.asTerm, yCheckedOwners(yCheckValidExpr( rhs) , symbol).getOrElse(tpd.EmptyTree ))
297
297
def copy (original : Tree )(name : String , tpt : TypeTree , rhs : Option [Term ]): ValDef =
298
- tpd.cpy.ValDef (original)(name.toTermName, tpt, yCheckedOwners(rhs, original.symbol).getOrElse(tpd.EmptyTree ))
298
+ tpd.cpy.ValDef (original)(name.toTermName, tpt, yCheckedOwners(yCheckValidExpr( rhs) , original.symbol).getOrElse(tpd.EmptyTree ))
299
299
def unapply (vdef : ValDef ): (String , TypeTree , Option [Term ]) =
300
300
(vdef.name.toString, vdef.tpt, optional(vdef.rhs))
301
301
@@ -568,9 +568,9 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
568
568
569
569
object NamedArg extends NamedArgModule :
570
570
def apply (name : String , arg : Term ): NamedArg =
571
- withDefaultPos(tpd.NamedArg (name.toTermName, arg))
571
+ withDefaultPos(tpd.NamedArg (name.toTermName, yCheckValidExpr( arg) ))
572
572
def copy (original : Tree )(name : String , arg : Term ): NamedArg =
573
- tpd.cpy.NamedArg (original)(name.toTermName, arg)
573
+ tpd.cpy.NamedArg (original)(name.toTermName, yCheckValidExpr( arg) )
574
574
def unapply (x : NamedArg ): (String , Term ) =
575
575
(x.name.toString, x.value)
576
576
end NamedArg
@@ -592,15 +592,13 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
592
592
593
593
object Apply extends ApplyModule :
594
594
def apply (fun : Term , args : List [Term ]): Apply =
595
- yCheckArgs (args)
595
+ yCheckValidExprs (args)
596
596
withDefaultPos(tpd.Apply (fun, args))
597
597
def copy (original : Tree )(fun : Term , args : List [Term ]): Apply =
598
- yCheckArgs (args)
598
+ yCheckValidExprs (args)
599
599
tpd.cpy.Apply (original)(fun, args)
600
600
def unapply (x : Apply ): (Term , List [Term ]) =
601
601
(x.fun, x.args)
602
- private def yCheckArgs (args : List [Term ]): Unit =
603
- if yCheck then args.foreach(yCheckValidExpr)
604
602
end Apply
605
603
606
604
given ApplyMethods : ApplyMethods with
@@ -669,9 +667,9 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
669
667
670
668
object Typed extends TypedModule :
671
669
def apply (expr : Term , tpt : TypeTree ): Typed =
672
- withDefaultPos(tpd.Typed (expr, tpt))
670
+ withDefaultPos(tpd.Typed (yCheckValidExpr( expr) , tpt))
673
671
def copy (original : Tree )(expr : Term , tpt : TypeTree ): Typed =
674
- tpd.cpy.Typed (original)(expr, tpt)
672
+ tpd.cpy.Typed (original)(yCheckValidExpr( expr) , tpt)
675
673
def unapply (x : Typed ): (Term , TypeTree ) =
676
674
(x.expr, x.tpt)
677
675
end Typed
@@ -693,9 +691,9 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
693
691
694
692
object Assign extends AssignModule :
695
693
def apply (lhs : Term , rhs : Term ): Assign =
696
- withDefaultPos(tpd.Assign (lhs, rhs))
694
+ withDefaultPos(tpd.Assign (lhs, yCheckValidExpr( rhs) ))
697
695
def copy (original : Tree )(lhs : Term , rhs : Term ): Assign =
698
- tpd.cpy.Assign (original)(lhs, rhs)
696
+ tpd.cpy.Assign (original)(lhs, yCheckValidExpr( rhs) )
699
697
def unapply (x : Assign ): (Term , Term ) =
700
698
(x.lhs, x.rhs)
701
699
end Assign
@@ -758,7 +756,7 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
758
756
object Lambda extends LambdaModule :
759
757
def apply (owner : Symbol , tpe : MethodType , rhsFn : (Symbol , List [Tree ]) => Tree ): Block =
760
758
val meth = dotc.core.Symbols .newSymbol(owner, nme.ANON_FUN , Synthetic | Method , tpe)
761
- tpd.Closure (meth, tss => yCheckedOwners(rhsFn(meth, tss.head.map(withDefaultPos)), meth))
759
+ tpd.Closure (meth, tss => yCheckedOwners(yCheckValidExpr( rhsFn(meth, tss.head.map(withDefaultPos) )), meth))
762
760
763
761
def unapply (tree : Block ): Option [(List [ValDef ], Term )] = tree match {
764
762
case Block ((ddef @ DefDef (_, TermParamClause (params) :: Nil , _, Some (body))) :: Nil , Closure (meth, _))
@@ -778,9 +776,9 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
778
776
779
777
object If extends IfModule :
780
778
def apply (cond : Term , thenp : Term , elsep : Term ): If =
781
- withDefaultPos(tpd.If (cond, thenp, elsep))
779
+ withDefaultPos(tpd.If (yCheckValidExpr( cond), yCheckValidExpr( thenp), yCheckValidExpr( elsep) ))
782
780
def copy (original : Tree )(cond : Term , thenp : Term , elsep : Term ): If =
783
- tpd.cpy.If (original)(cond, thenp, elsep)
781
+ tpd.cpy.If (original)(yCheckValidExpr( cond), yCheckValidExpr( thenp), yCheckValidExpr( elsep) )
784
782
def unapply (tree : If ): (Term , Term , Term ) =
785
783
(tree.cond, tree.thenp, tree.elsep)
786
784
end If
@@ -804,10 +802,10 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
804
802
805
803
object Match extends MatchModule :
806
804
def apply (selector : Term , cases : List [CaseDef ]): Match =
807
- withDefaultPos(tpd.Match (selector, cases))
805
+ withDefaultPos(tpd.Match (yCheckValidExpr( selector) , cases))
808
806
809
807
def copy (original : Tree )(selector : Term , cases : List [CaseDef ]): Match =
810
- tpd.cpy.Match (original)(selector, cases)
808
+ tpd.cpy.Match (original)(yCheckValidExpr( selector) , cases)
811
809
812
810
def unapply (x : Match ): (Term , List [CaseDef ]) =
813
811
(x.scrutinee, x.cases)
@@ -854,9 +852,9 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
854
852
855
853
object Try extends TryModule :
856
854
def apply (expr : Term , cases : List [CaseDef ], finalizer : Option [Term ]): Try =
857
- withDefaultPos(tpd.Try (expr, cases, finalizer.getOrElse(tpd.EmptyTree )))
855
+ withDefaultPos(tpd.Try (yCheckValidExpr( expr) , cases, finalizer.getOrElse(tpd.EmptyTree )))
858
856
def copy (original : Tree )(expr : Term , cases : List [CaseDef ], finalizer : Option [Term ]): Try =
859
- tpd.cpy.Try (original)(expr, cases, finalizer.getOrElse(tpd.EmptyTree ))
857
+ tpd.cpy.Try (original)(yCheckValidExpr( expr) , cases, finalizer.getOrElse(tpd.EmptyTree ))
860
858
def unapply (x : Try ): (Term , List [CaseDef ], Option [Term ]) =
861
859
(x.body, x.cases, optional(x.finalizer))
862
860
end Try
@@ -879,9 +877,9 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
879
877
880
878
object Return extends ReturnModule :
881
879
def apply (expr : Term , from : Symbol ): Return =
882
- withDefaultPos(tpd.Return (expr, from))
880
+ withDefaultPos(tpd.Return (yCheckValidExpr( expr) , from))
883
881
def copy (original : Tree )(expr : Term , from : Symbol ): Return =
884
- tpd.cpy.Return (original)(expr, tpd.ref(from))
882
+ tpd.cpy.Return (original)(yCheckValidExpr( expr) , tpd.ref(from))
885
883
def unapply (x : Return ): (Term , Symbol ) =
886
884
(x.expr, x.from.symbol)
887
885
end Return
@@ -903,8 +901,10 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
903
901
904
902
object Repeated extends RepeatedModule :
905
903
def apply (elems : List [Term ], elemtpt : TypeTree ): Repeated =
904
+ yCheckValidExprs(elems)
906
905
withDefaultPos(tpd.SeqLiteral (elems, elemtpt))
907
906
def copy (original : Tree )(elems : List [Term ], elemtpt : TypeTree ): Repeated =
907
+ yCheckValidExprs(elems)
908
908
tpd.cpy.SeqLiteral (original)(elems, elemtpt)
909
909
def unapply (x : Repeated ): (List [Term ], TypeTree ) =
910
910
(x.elems, x.elemtpt)
@@ -927,9 +927,9 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
927
927
928
928
object Inlined extends InlinedModule :
929
929
def apply (call : Option [Tree ], bindings : List [Definition ], expansion : Term ): Inlined =
930
- withDefaultPos(tpd.Inlined (call.getOrElse(tpd.EmptyTree ), bindings.map { case b : tpd.MemberDef => b }, expansion))
930
+ withDefaultPos(tpd.Inlined (call.getOrElse(tpd.EmptyTree ), bindings.map { case b : tpd.MemberDef => b }, yCheckValidExpr( expansion) ))
931
931
def copy (original : Tree )(call : Option [Tree ], bindings : List [Definition ], expansion : Term ): Inlined =
932
- tpd.cpy.Inlined (original)(call.getOrElse(tpd.EmptyTree ), bindings.asInstanceOf [List [tpd.MemberDef ]], expansion)
932
+ tpd.cpy.Inlined (original)(call.getOrElse(tpd.EmptyTree ), bindings.asInstanceOf [List [tpd.MemberDef ]], yCheckValidExpr( expansion) )
933
933
def unapply (x : Inlined ): (Option [Tree /* Term | TypeTree */ ], List [Definition ], Term ) =
934
934
(optional(x.call), x.bindings, x.body)
935
935
end Inlined
@@ -982,9 +982,9 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
982
982
983
983
object While extends WhileModule :
984
984
def apply (cond : Term , body : Term ): While =
985
- withDefaultPos(tpd.WhileDo (cond, body))
985
+ withDefaultPos(tpd.WhileDo (yCheckValidExpr( cond), yCheckValidExpr( body) ))
986
986
def copy (original : Tree )(cond : Term , body : Term ): While =
987
- tpd.cpy.WhileDo (original)(cond, body)
987
+ tpd.cpy.WhileDo (original)(yCheckValidExpr( cond), yCheckValidExpr( body) )
988
988
def unapply (x : While ): (Term , Term ) =
989
989
(x.cond, x.body)
990
990
end While
@@ -2834,6 +2834,18 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
2834
2834
case _ => traverseChildren(t)
2835
2835
}.traverse(tree)
2836
2836
2837
+ private def yCheckValidExprs (terms : List [Term ]): terms.type =
2838
+ if yCheck then terms.foreach(yCheckValidExpr)
2839
+ terms
2840
+ private def yCheckValidExpr (termOpt : Option [Term ]): termOpt.type =
2841
+ if yCheck then termOpt.foreach(yCheckValidExpr)
2842
+ termOpt
2843
+ private def yCheckValidExpr (term : Term ): term.type =
2844
+ if yCheck then
2845
+ assert(! term.tpe.widenDealias.isInstanceOf [dotc.core.Types .MethodicType ],
2846
+ " Reference to a method must be eta-expanded before it is used as an expression: " + term.show)
2847
+ term
2848
+
2837
2849
object Printer extends PrinterModule :
2838
2850
2839
2851
lazy val TreeCode : Printer [Tree ] = new Printer [Tree ]:
@@ -2878,11 +2890,6 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
2878
2890
2879
2891
end Printer
2880
2892
2881
- private def yCheckValidExpr (term : Term ): Unit =
2882
- if yCheck then
2883
- assert(! term.tpe.widenDealias.isInstanceOf [dotc.core.Types .MethodicType ],
2884
- " Reference to a method must be eta-expanded before it is used as an expression: " + term.show)
2885
-
2886
2893
end reflect
2887
2894
2888
2895
def unpickleExpr [T ](pickled : String | List [String ], typeHole : (Int , Seq [Any ]) => scala.quoted.Type [? ], termHole : (Int , Seq [Any ], scala.quoted.Quotes ) => scala.quoted.Expr [? ]): scala.quoted.Expr [T ] =
0 commit comments