@@ -167,14 +167,15 @@ class Splicing extends MacroTransform:
167
167
* ```
168
168
*/
169
169
private class SpliceTransformer (spliceOwner : Symbol , isCaptured : Symbol => Boolean ) extends Transformer :
170
- private var refBindingMap = mutable.LinkedHashMap .empty[Symbol , (Tree , Symbol )]
170
+ private var refTermBindingMap = mutable.LinkedHashMap .empty[Symbol , (Tree , Symbol )]
171
+ private var refTypeBindingMap = mutable.LinkedHashMap .empty[Symbol , (Tree , Symbol )]
171
172
/** Reference to the `Quotes` instance of the current level 1 splice */
172
173
private var quotes : Tree | Null = null // TODO: add to the context
173
174
174
175
def transformSplice (tree : tpd.Tree , tpe : Type , holeIdx : Int )(using Context ): tpd.Tree =
175
176
assert(level == 0 )
176
177
val newTree = transform(tree)
177
- val (refs, bindings) = refBindingMap .values.toList.unzip
178
+ val (refs, bindings) = (refTypeBindingMap .values ++ refTermBindingMap.values) .toList.unzip
178
179
val bindingsTypes = bindings.map(_.termRef.widenTermRefExpr)
179
180
val methType = MethodType (bindingsTypes, newTree.tpe)
180
181
val meth = newSymbol(spliceOwner, nme.ANON_FUN , Synthetic | Method , methType)
@@ -212,6 +213,11 @@ class Splicing extends MacroTransform:
212
213
case _ : TypeTree | _ : SingletonTypeTree =>
213
214
if containsCapturedType(tree.tpe) && level >= 1 then getTagRefFor(tree)
214
215
else tree
216
+ case _ : This =>
217
+ if isCaptured(tree.symbol) then
218
+ val tag = getTagRefFor(tree)
219
+ spliced(tag.tpe)(capturedTerm(tree))
220
+ else super .transform(tree)
215
221
case tree @ Assign (lhs : RefTree , rhs) =>
216
222
if isCaptured(lhs.symbol) then transformSplicedAssign(tree)
217
223
else super .transform(tree)
@@ -302,7 +308,7 @@ class Splicing extends MacroTransform:
302
308
Param ,
303
309
defn.QuotedExprClass .typeRef.appliedTo(tpe),
304
310
)
305
- val bindingSym = refBindingMap .getOrElseUpdate(tree.symbol, (tree, newBinding))._2
311
+ val bindingSym = refTermBindingMap .getOrElseUpdate(tree.symbol, (tree, newBinding))._2
306
312
ref(bindingSym)
307
313
308
314
private def newQuotedTypeClassBinding (tpe : Type )(using Context ) =
@@ -314,14 +320,14 @@ class Splicing extends MacroTransform:
314
320
)
315
321
316
322
private def capturedType (tree : Tree )(using Context ): Symbol =
317
- refBindingMap .getOrElseUpdate(tree.symbol, (TypeTree (tree.tpe), newQuotedTypeClassBinding(tree.tpe)))._2
323
+ refTypeBindingMap .getOrElseUpdate(tree.symbol, (TypeTree (tree.tpe), newQuotedTypeClassBinding(tree.tpe)))._2
318
324
319
325
private def capturedPartTypes (quote : Quote )(using Context ): Tree =
320
326
val (tags, body1) = inContextWithQuoteTypeTags {
321
327
val capturePartTypes = new TypeMap {
322
328
def apply (tp : Type ) = tp match {
323
329
case typeRef : TypeRef if containsCapturedType(typeRef) =>
324
- val termRef = refBindingMap
330
+ val termRef = refTypeBindingMap
325
331
.getOrElseUpdate(typeRef.symbol, (TypeTree (typeRef), newQuotedTypeClassBinding(typeRef)))._2.termRef
326
332
val tagRef = getTagRef(termRef)
327
333
tagRef
0 commit comments