@@ -140,8 +140,7 @@ object desugar {
140
140
* def x_=($1: <TypeTree()>): Unit = ()
141
141
*/
142
142
def valDef (vdef0 : ValDef )(implicit ctx : Context ): Tree = {
143
- val vdef = transformQuotedPatternName(vdef0)
144
- val ValDef (name, tpt, rhs) = vdef
143
+ val vdef @ ValDef (name, tpt, rhs) = transformQuotedPatternName(vdef0)
145
144
val mods = vdef.mods
146
145
val setterNeeded =
147
146
(mods is Mutable ) && ctx.owner.isClass && (! (mods is PrivateLocal ) || (ctx.owner is Trait ))
@@ -165,14 +164,6 @@ object desugar {
165
164
else vdef
166
165
}
167
166
168
- def transformQuotedPatternName (vdef : ValDef )(implicit ctx : Context ): ValDef = {
169
- if (ctx.mode.is(Mode .QuotedPattern ) && ! vdef.isBackquoted && vdef.name.startsWith(" $" )) {
170
- val name = vdef.name.toString.substring(1 ).toTermName
171
- val mods = vdef.mods.withAddedAnnotation(New (ref(defn.InternalQuoted_patternBindHoleAnnot .typeRef)).withSpan(vdef.span))
172
- cpy.ValDef (vdef)(name).withMods(mods)
173
- } else vdef
174
- }
175
-
176
167
def makeImplicitParameters (tpts : List [Tree ], contextualFlag : FlagSet = EmptyFlags , forPrimaryConstructor : Boolean = false )(implicit ctx : Context ): List [ValDef ] =
177
168
for (tpt <- tpts) yield {
178
169
val paramFlags : FlagSet = if (forPrimaryConstructor) PrivateLocalParamAccessor else Param
@@ -207,9 +198,7 @@ object desugar {
207
198
* inline def f(x: Boolean): Any = (if (x) 1 else ""): Any
208
199
*/
209
200
private def defDef (meth0 : DefDef , isPrimaryConstructor : Boolean = false )(implicit ctx : Context ): Tree = {
210
- val meth = transformQuotedPatternName(meth0)
211
-
212
- val DefDef (_, tparams, vparamss, tpt, rhs) = meth
201
+ val meth @ DefDef (_, tparams, vparamss, tpt, rhs) = transformQuotedPatternName(meth0)
213
202
val methName = normalizeName(meth, tpt).asTermName
214
203
val mods = meth.mods
215
204
val epbuf = new ListBuffer [ValDef ]
@@ -283,12 +272,30 @@ object desugar {
283
272
}
284
273
}
285
274
286
- def transformQuotedPatternName (ddef : DefDef )(implicit ctx : Context ): DefDef = {
287
- if (ctx.mode.is(Mode .QuotedPattern ) && ! ddef.isBackquoted && ddef.name != nme.ANON_FUN && ddef.name.startsWith(" $" )) {
288
- val name = ddef.name.toString.substring(1 ).toTermName
289
- val mods = ddef.mods.withAddedAnnotation(New (ref(defn.InternalQuoted_patternBindHoleAnnot .typeRef)).withSpan(ddef.span))
290
- cpy.DefDef (ddef)(name).withMods(mods)
291
- } else ddef
275
+ /** Transforms a definition with a name starting with a `$` in a quoted pattern into a `quoted.binding.Binding` splice.
276
+ *
277
+ * The desugaring consists in renaming the the definition and adding the `@patternBindHole` annotation. This
278
+ * annotation is used during typing to perform the full transformation.
279
+ *
280
+ * A definition
281
+ * ```scala
282
+ * case '{ def $a(...) = ... a() ...; ... a() ... }
283
+ * ```
284
+ * into
285
+ * ```scala
286
+ * case '{ @patternBindHole def a(...) = ... a() ...; ... a() ... }
287
+ * ```
288
+ */
289
+ def transformQuotedPatternName (tree : ValOrDefDef )(implicit ctx : Context ): ValOrDefDef = {
290
+ if (ctx.mode.is(Mode .QuotedPattern ) && ! tree.isBackquoted && tree.name != nme.ANON_FUN && tree.name.startsWith(" $" )) {
291
+ val name = tree.name.toString.substring(1 ).toTermName
292
+ val newTree : ValOrDefDef = tree match {
293
+ case tree : ValDef => cpy.ValDef (tree)(name)
294
+ case tree : DefDef => cpy.DefDef (tree)(name)
295
+ }
296
+ val mods = tree.mods.withAddedAnnotation(New (ref(defn.InternalQuoted_patternBindHoleAnnot .typeRef)).withSpan(tree.span))
297
+ newTree.withMods(mods)
298
+ } else tree
292
299
}
293
300
294
301
// Add all evidence parameters in `params` as implicit parameters to `meth` */
0 commit comments