diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TreePickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/TreePickler.scala index 42281f023e8e..e62c78ec63f9 100644 --- a/compiler/src/dotty/tools/dotc/core/tasty/TreePickler.scala +++ b/compiler/src/dotty/tools/dotc/core/tasty/TreePickler.scala @@ -26,7 +26,7 @@ object TreePickler { override def isTerm: Boolean = isTermHole override def isType: Boolean = !isTermHole override def fallbackToText(printer: Printer): Text = - s"[[$idx|" ~~ printer.toTextGlobal(args, ", ") ~~ "]]" + s"[[$idx|" ~~ printer.toTextGlobal(tpe) ~~ "|" ~~ printer.toTextGlobal(args, ", ") ~~ "]]" } } @@ -603,6 +603,7 @@ class TreePickler(pickler: TastyPickler) { writeByte(HOLE) withLength { writeNat(idx) + pickleType(tree.tpe, richTypes = true) args.foreach(pickleTree) } } diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala index 1f3d68f0672a..4191daff94e6 100644 --- a/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala +++ b/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala @@ -1301,6 +1301,7 @@ class TreeUnpickler(reader: TastyReader, def readHole(end: Addr, isType: Boolean)(implicit ctx: Context): Tree = { val idx = readNat() + val tpe = readType() val args = until(end)(readTerm()) val splice = splices(idx) def wrap(arg: Tree) = diff --git a/compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala b/compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala index ac9acb130ad5..ca6a7fc0c74e 100644 --- a/compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala +++ b/compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala @@ -331,7 +331,23 @@ class ReifyQuotes extends MacroTransform { */ private def makeHole(isTermHole: Boolean, body: Tree, splices: List[Tree], tpe: Type)(implicit ctx: Context): Hole = { val idx = embedded.addTree(body, NoSymbol) - Hole(isTermHole, idx, splices).withType(tpe).asInstanceOf[Hole] + val holeType = getHoleType(tpe) + Hole(isTermHole, idx, splices).withType(holeType).asInstanceOf[Hole] + } + + private def getHoleType(using ctx: Context) = new TypeMap() { + override def apply(tp: Type): Type = tp match + case tp: TypeRef if tp.typeSymbol.isSplice => + apply(tp.dealias) + case tp @ TypeRef(pre, _) if pre == NoPrefix || pre.termSymbol.isLocal => + val hiBound = tp.typeSymbol.info match + case info @ ClassInfo(_, _, classParents, _, _) => classParents.reduce(_ & _) + case info => info.hiBound + apply(hiBound) + case tp @ TermRef(NoPrefix, _) => + apply(tp.widenTermRefExpr) + case tp => + mapOver(tp) } override def transform(tree: Tree)(implicit ctx: Context): Tree =