Skip to content

Commit f735b00

Browse files
committed
wip
1 parent 5543ee2 commit f735b00

File tree

3 files changed

+19
-13
lines changed

3 files changed

+19
-13
lines changed

compiler/src/dotty/tools/dotc/ast/Trees.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1363,6 +1363,9 @@ object Trees {
13631363
TypeDef(tree: Tree)(name, rhs)
13641364
def Template(tree: Template)(constr: DefDef = tree.constr, parents: List[Tree] = tree.parents, derived: List[untpd.Tree] = tree.derived, self: ValDef = tree.self, body: LazyTreeList = tree.unforcedBody)(using Context): Template =
13651365
Template(tree: Tree)(constr, parents, derived, self, body)
1366+
def Hole(tree: Hole)(isTerm: Boolean = tree.isTerm, idx: Int = tree.idx, args: List[Tree] = tree.args, content: Tree = tree.content, tpt: Tree = tree.tpt)(using Context): Hole =
1367+
Hole(tree: Tree)(isTerm, idx, args, content, tpt)
1368+
13661369
}
13671370

13681371
/** Hook to indicate that a transform of some subtree should be skipped */

compiler/src/dotty/tools/dotc/transform/PickleQuotes.scala

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -147,23 +147,18 @@ class PickleQuotes extends MacroTransform {
147147

148148
class HoleMaker extends Transformer:
149149
private var splices = List.newBuilder[Tree]
150-
private var typeHoles = mutable.Map.empty[Symbol, Hole]
151-
private var idx = -1
152150
override def transform(tree: tpd.Tree)(using Context): tpd.Tree =
153151
tree match
154-
case Hole(true, _, args, content, _) =>
152+
case tree @ Hole(true, _, _, content, _) =>
155153
splices += content
156-
idx += 1
157154
val holeType = getTermHoleType(tree.tpe)
158-
val hole = Hole(true, idx, args, EmptyTree, TypeTree(holeType)).withSpan(content.span).withType(holeType).asInstanceOf[Hole]
155+
val hole = cpy.Hole(tree)(content = EmptyTree, TypeTree(holeType))
159156
Inlined(EmptyTree, Nil, hole).withSpan(tree.span)
160-
case Hole(false, _, args, content, _) =>
161-
def makeTypeHole =
157+
case tree @ Hole(false, _, _, content, _) =>
158+
if !content.isEmpty then
162159
splices += content
163-
idx += 1
164-
val holeType = getTypeHoleType(tree.tpe)
165-
Hole(false, idx, Nil, EmptyTree, TypeTree(holeType)).withType(holeType).asInstanceOf[Hole]
166-
typeHoles.getOrElseUpdate(content.symbol, makeTypeHole)
160+
val holeType = getTypeHoleType(tree.tpe)
161+
cpy.Hole(tree)(content = EmptyTree, TypeTree(holeType))
167162

168163
case tree: DefTree =>
169164
val newAnnotations = tree.symbol.annotations.mapconserve { annot =>

compiler/src/dotty/tools/dotc/transform/Splicing.scala

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ class Splicing extends MacroTransform {
104104
class QuoteTransformer extends Transformer:
105105
private val quotedDefs = mutable.Set.empty[Symbol]
106106
private var holeIdx = -1
107+
private var typeHoles = mutable.Map.empty[Symbol, Hole]
108+
107109
override def transform(tree: tpd.Tree)(using Context): tpd.Tree =
108110
tree match
109111
case Apply(fn, List(splicedCode)) if fn.symbol == defn.QuotedRuntime_exprNestedSplice =>
@@ -114,8 +116,14 @@ class Splicing extends MacroTransform {
114116
case tree: TypeDef if tree.symbol.hasAnnotation(defn.QuotedRuntime_SplicedTypeAnnot) =>
115117
val tp @ TypeRef(qual: TermRef, _) = tree.rhs.tpe.hiBound
116118
quotedDefs += tree.symbol
117-
holeIdx += 1
118-
cpy.TypeDef(tree)(rhs = Hole(false, holeIdx, Nil, ref(qual), TypeTree(tp)).withType(tp))
119+
val hole = typeHoles.get(qual.symbol) match
120+
case Some (hole) => cpy.Hole(hole)(content = EmptyTree)
121+
case None =>
122+
holeIdx += 1
123+
val hole = Hole(false, holeIdx, Nil, ref(qual), TypeTree(tp)).withType(tp).asInstanceOf[Hole]
124+
typeHoles.put(qual.symbol, hole)
125+
hole
126+
cpy.TypeDef(tree)(rhs = hole)
119127
case tree: DefTree =>
120128
quotedDefs += tree.symbol
121129
transformAnnotations(tree)

0 commit comments

Comments
 (0)