@@ -975,6 +975,23 @@ object Trees {
975
975
def genericEmptyValDef [T <: Untyped ]: ValDef [T ] = theEmptyValDef.asInstanceOf [ValDef [T ]]
976
976
def genericEmptyTree [T <: Untyped ]: Thicket [T ] = theEmptyTree.asInstanceOf [Thicket [T ]]
977
977
978
+ /** Tree that replaces a level 1 splices in pickled (level 0) quotes.
979
+ * It is only used when encoding pickled quotes. These will be encoded
980
+ * as PickledHole when pickled.
981
+ *
982
+ * @param isTermHole If this hole is a term, otherwise it is a type hole.
983
+ * @param idx The index of the hole in it's enclosing level 0 quote.
984
+ * @param targs The type arguments of the splice to compute its content
985
+ * @param args The term (or type) arguments of the splice to compute its content
986
+ * @param tpt Type of the hole
987
+ * @param content Lambda that computes the content of the hole. This tree is empty when in a quote pickle.
988
+ */
989
+ case class Hole [+ T <: Untyped ](isTermHole : Boolean , idx : Int , targs : List [Tree [T ]], args : List [Tree [T ]], content : Tree [T ], tpt : Tree [T ])(implicit @ constructorOnly src : SourceFile ) extends Tree [T ] {
990
+ type ThisTree [+ T <: Untyped ] <: Hole [T ]
991
+ override def isTerm : Boolean = isTermHole
992
+ override def isType : Boolean = ! isTermHole
993
+ }
994
+
978
995
/** Tree that replaces a level 1 splices in pickled (level 0) quotes.
979
996
* It is only used when picking quotes (will never be in a TASTy file).
980
997
*
@@ -986,13 +1003,11 @@ object Trees {
986
1003
*
987
1004
* @param isTermHole If this hole is a term, otherwise it is a type hole.
988
1005
* @param idx The index of the hole in it's enclosing level 0 quote.
989
- * @param targs The type arguments of the splice to compute its content
990
1006
* @param args The term (or type) arguments of the splice to compute its content
991
1007
* @param tpt Type of the hole
992
- * @param content Lambda that computes the content of the hole. This tree is empty when in a quote pickle.
993
1008
*/
994
- case class Hole [+ T <: Untyped ](isTermHole : Boolean , idx : Int , targs : List [ Tree [ T ]], args : List [Tree [T ]], content : Tree [ T ], tpt : Tree [T ])(implicit @ constructorOnly src : SourceFile ) extends Tree [T ] {
995
- type ThisTree [+ T <: Untyped ] <: Hole [T ]
1009
+ case class PickledHole [+ T <: Untyped ](isTermHole : Boolean , idx : Int , args : List [Tree [T ]], tpt : Tree [T ])(implicit @ constructorOnly src : SourceFile ) extends Tree [T ] {
1010
+ type ThisTree [+ T <: Untyped ] <: PickledHole [T ]
996
1011
override def isTerm : Boolean = isTermHole
997
1012
override def isType : Boolean = ! isTermHole
998
1013
}
@@ -1119,6 +1134,7 @@ object Trees {
1119
1134
type Thicket = Trees .Thicket [T ]
1120
1135
1121
1136
type Hole = Trees .Hole [T ]
1137
+ type PickledHole = Trees .PickledHole [T ]
1122
1138
1123
1139
@ sharable val EmptyTree : Thicket = genericEmptyTree
1124
1140
@ sharable val EmptyValDef : ValDef = genericEmptyValDef
@@ -1345,9 +1361,13 @@ object Trees {
1345
1361
case _ => finalize(tree, untpd.Thicket (trees)(sourceFile(tree)))
1346
1362
}
1347
1363
def Hole (tree : Tree )(isTerm : Boolean , idx : Int , targs : List [Tree ], args : List [Tree ], content : Tree , tpt : Tree )(using Context ): Hole = tree match {
1348
- case tree : Hole if isTerm == tree.isTerm && idx == tree.idx && targs.eq(tree.targs) && args.eq(tree.args) && content.eq(tree.content) && content .eq(tree.content ) => tree
1364
+ case tree : Hole if isTerm == tree.isTerm && idx == tree.idx && targs.eq(tree.targs) && args.eq(tree.args) && content.eq(tree.content) && tpt .eq(tree.tpt ) => tree
1349
1365
case _ => finalize(tree, untpd.Hole (isTerm, idx, targs, args, content, tpt)(sourceFile(tree)))
1350
1366
}
1367
+ def PickledHole (tree : Tree )(isTerm : Boolean , idx : Int , args : List [Tree ], tpt : Tree )(using Context ): PickledHole = tree match {
1368
+ case tree : PickledHole if isTerm == tree.isTerm && idx == tree.idx && args.eq(tree.args) && tpt.eq(tree.tpt) => tree
1369
+ case _ => finalize(tree, untpd.PickledHole (isTerm, idx, args, tpt)(sourceFile(tree)))
1370
+ }
1351
1371
1352
1372
// Copier methods with default arguments; these demand that the original tree
1353
1373
// is of the same class as the copy. We only include trees with more than 2 elements here.
@@ -1371,6 +1391,8 @@ object Trees {
1371
1391
Template (tree : Tree )(constr, parents, derived, self, body)
1372
1392
def Hole (tree : Hole )(isTerm : Boolean = tree.isTerm, idx : Int = tree.idx, targs : List [Tree ] = tree.targs, args : List [Tree ] = tree.args, content : Tree = tree.content, tpt : Tree = tree.tpt)(using Context ): Hole =
1373
1393
Hole (tree : Tree )(isTerm, idx, targs, args, content, tpt)
1394
+ def PickledHole (tree : PickledHole )(isTerm : Boolean = tree.isTerm, idx : Int = tree.idx, args : List [Tree ] = tree.args, tpt : Tree = tree.tpt)(using Context ): PickledHole =
1395
+ PickledHole (tree : Tree )(isTerm, idx, args, tpt)
1374
1396
1375
1397
}
1376
1398
@@ -1503,6 +1525,8 @@ object Trees {
1503
1525
if (trees1 eq trees) tree else Thicket (trees1)
1504
1526
case tree @ Hole (_, _, targs, args, content, tpt) =>
1505
1527
cpy.Hole (tree)(targs = transform(targs), args = transform(args), content = transform(content), tpt = transform(tpt))
1528
+ case tree @ PickledHole (_, _, args, tpt) =>
1529
+ cpy.PickledHole (tree)(args = transform(args), tpt = transform(tpt))
1506
1530
case _ =>
1507
1531
transformMoreCases(tree)
1508
1532
}
@@ -1644,6 +1668,8 @@ object Trees {
1644
1668
this (x, ts)
1645
1669
case Hole (_, _, targs, args, content, tpt) =>
1646
1670
this (this (this (this (x, targs), args), content), tpt)
1671
+ case PickledHole (_, _, args, tpt) =>
1672
+ this (this (x, args), tpt)
1647
1673
case _ =>
1648
1674
foldMoreCases(x, tree)
1649
1675
}
0 commit comments