@@ -9,7 +9,7 @@ import dotty.tools.dotc.core.Constants._
9
9
import dotty .tools .dotc .core .Contexts ._
10
10
import dotty .tools .dotc .core .Decorators ._
11
11
import dotty .tools .dotc .core .Flags ._
12
- import dotty .tools .dotc .core .NameKinds .UniqueName
12
+ import dotty .tools .dotc .core .NameKinds .{ UniqueName , PatMatVarName }
13
13
import dotty .tools .dotc .core .Names ._
14
14
import dotty .tools .dotc .core .StagingContext ._
15
15
import dotty .tools .dotc .core .StdNames ._
@@ -156,19 +156,21 @@ trait QuotesAndSplices {
156
156
if ctx.mode.is(Mode .QuotedPattern ) && level == 1 then
157
157
def spliceOwner (ctx : Context ): Symbol =
158
158
if (ctx.mode.is(Mode .QuotedPattern )) spliceOwner(ctx.outer) else ctx.owner
159
- val name = tree.expr match {
160
- case Ident (name) => (" $" + name).toTypeName
159
+ val (name, expr) = tree.expr match {
160
+ case Ident (name) =>
161
+ val nameOfSyntheticGiven = PatMatVarName .fresh()
162
+ (name.toTypeName, untpd.cpy.Ident (tree.expr)(nameOfSyntheticGiven))
161
163
case expr =>
162
164
report.error(" expected a name binding" , expr.srcPos)
163
- " $error" .toTypeName
165
+ ( " $error" .toTypeName, expr)
164
166
}
165
167
166
168
val typeSymInfo = pt match
167
169
case pt : TypeBounds => pt
168
170
case _ => TypeBounds .empty
169
171
val typeSym = newSymbol(spliceOwner(ctx), name, EmptyFlags , typeSymInfo, NoSymbol , tree.expr.span)
170
172
typeSym.addAnnotation(Annotation (New (ref(defn.InternalQuotedPatterns_patternTypeAnnot .typeRef)).withSpan(tree.expr.span)))
171
- val pat = typedPattern(tree. expr, defn.QuotedTypeClass .typeRef.appliedTo(typeSym.typeRef))(
173
+ val pat = typedPattern(expr, defn.QuotedTypeClass .typeRef.appliedTo(typeSym.typeRef))(
172
174
using spliceContext.retractMode(Mode .QuotedPattern ).withOwner(spliceOwner(ctx)))
173
175
pat.select(tpnme.spliceType)
174
176
else
@@ -214,7 +216,7 @@ trait QuotesAndSplices {
214
216
def getBinding (sym : Symbol ): Bind =
215
217
typeBindings.getOrElseUpdate(sym, {
216
218
val bindingBounds = sym.info
217
- val bsym = newPatternBoundSymbol(sym.name.toTypeName, bindingBounds, quoted.span)
219
+ val bsym = newPatternBoundSymbol(sym.name.toString.stripPrefix( " $ " ). toTypeName, bindingBounds, quoted.span)
218
220
Bind (bsym, untpd.Ident (nme.WILDCARD ).withType(bindingBounds)).withSpan(quoted.span)
219
221
})
220
222
@@ -263,13 +265,14 @@ trait QuotesAndSplices {
263
265
val sym = tree.tpe.dealias.typeSymbol
264
266
if sym.exists then
265
267
val tdef = TypeDef (sym.asType).withSpan(sym.span)
266
- freshTypeBindingsBuff += transformTypeBindingTypeDef(tdef, freshTypePatBuf)
268
+ val nameOfSyntheticGiven = pat.symbol.name.toTermName
269
+ freshTypeBindingsBuff += transformTypeBindingTypeDef(nameOfSyntheticGiven, tdef, freshTypePatBuf)
267
270
TypeTree (tree.tpe.dealias).withSpan(tree.span)
268
271
else
269
272
tree
270
273
case tdef : TypeDef =>
271
274
if tdef.symbol.hasAnnotation(defn.InternalQuotedPatterns_patternTypeAnnot ) then
272
- transformTypeBindingTypeDef(tdef, typePatBuf)
275
+ transformTypeBindingTypeDef(PatMatVarName .fresh(), tdef, typePatBuf)
273
276
else if tdef.symbol.isClass then
274
277
val kind = if tdef.symbol.is(Module ) then " objects" else " classes"
275
278
report.error(" Implementation restriction: cannot match " + kind, tree.srcPos)
@@ -305,13 +308,12 @@ trait QuotesAndSplices {
305
308
super .transform(tree)
306
309
}
307
310
308
- private def transformTypeBindingTypeDef (tdef : TypeDef , buff : mutable.Builder [Tree , List [Tree ]])(using Context ): Tree = {
311
+ private def transformTypeBindingTypeDef (nameOfSyntheticGiven : TermName , tdef : TypeDef , buff : mutable.Builder [Tree , List [Tree ]])(using Context ): Tree = {
309
312
if (variance == - 1 )
310
313
tdef.symbol.addAnnotation(Annotation (New (ref(defn.InternalQuotedPatterns_fromAboveAnnot .typeRef)).withSpan(tdef.span)))
311
314
val bindingType = getBinding(tdef.symbol).symbol.typeRef
312
315
val bindingTypeTpe = AppliedType (defn.QuotedTypeClass .typeRef, bindingType :: Nil )
313
- val bindName = tdef.name.toString.stripPrefix(" $" ).toTermName
314
- val sym = newPatternBoundSymbol(bindName, bindingTypeTpe, tdef.span, flags = ImplicitTerm )(using ctx0)
316
+ val sym = newPatternBoundSymbol(nameOfSyntheticGiven, bindingTypeTpe, tdef.span, flags = ImplicitTerm )(using ctx0)
315
317
buff += Bind (sym, untpd.Ident (nme.WILDCARD ).withType(bindingTypeTpe)).withSpan(tdef.span)
316
318
super .transform(tdef)
317
319
}
0 commit comments