@@ -149,7 +149,7 @@ object desugar {
149
149
* def f$default$1[T] = 1
150
150
* def f$default$2[T](x: Int) = x + "m"
151
151
*/
152
- def defDef (meth : DefDef , isPrimaryConstructor : Boolean = false )(implicit ctx : Context ): Tree = {
152
+ private def defDef (meth : DefDef , isPrimaryConstructor : Boolean = false )(implicit ctx : Context ): Tree = {
153
153
val DefDef (name, tparams, vparamss, tpt, rhs) = meth
154
154
val mods = meth.mods
155
155
val epbuf = new ListBuffer [ValDef ]
@@ -254,11 +254,17 @@ object desugar {
254
254
.withFlags((mods.flags & AccessFlags ).toCommonFlags)
255
255
.withMods(Nil )
256
256
257
- val (constr1, defaultGetters) = defDef(constr0, isPrimaryConstructor = true ) match {
258
- case meth : DefDef => (meth, Nil )
259
- case Thicket ((meth : DefDef ) :: defaults) => (meth, defaults)
257
+ var defaultGetters : List [Tree ] = Nil
258
+
259
+ def decompose (ddef : Tree ): DefDef = ddef match {
260
+ case meth : DefDef => meth
261
+ case Thicket ((meth : DefDef ) :: defaults) =>
262
+ defaultGetters = defaults
263
+ meth
260
264
}
261
265
266
+ val constr1 = decompose(defDef(constr0, isPrimaryConstructor = true ))
267
+
262
268
// The original type and value parameters in the constructor already have the flags
263
269
// needed to be type members (i.e. param, and possibly also private and local unless
264
270
// prefixed by type or val). `tparams` and `vparamss` are the type parameters that
@@ -299,9 +305,11 @@ object desugar {
299
305
// to auxiliary constructors
300
306
val normalizedBody = impl.body map {
301
307
case ddef : DefDef if ddef.name.isConstructorName =>
302
- addEvidenceParams(
303
- cpy.DefDef (ddef)(tparams = constrTparams),
304
- evidenceParams(constr1).map(toDefParam))
308
+ decompose(
309
+ defDef(
310
+ addEvidenceParams(
311
+ cpy.DefDef (ddef)(tparams = constrTparams),
312
+ evidenceParams(constr1).map(toDefParam))))
305
313
case stat =>
306
314
stat
307
315
}
@@ -680,7 +688,9 @@ object desugar {
680
688
def defTree (tree : Tree )(implicit ctx : Context ): Tree = tree match {
681
689
case tree : ValDef => valDef(tree)
682
690
case tree : TypeDef => if (tree.isClassDef) classDef(tree) else tree
683
- case tree : DefDef => defDef(tree)
691
+ case tree : DefDef =>
692
+ if (tree.name.isConstructorName) tree // was already handled by enclosing classDef
693
+ else defDef(tree)
684
694
case tree : ModuleDef => moduleDef(tree)
685
695
case tree : PatDef => patDef(tree)
686
696
}
0 commit comments