@@ -559,9 +559,9 @@ object desugar {
559
559
val copiedAccessFlags = if migrateTo3 then EmptyFlags else AccessFlags
560
560
561
561
// Methods to add to a case class C[..](p1: T1, ..., pN: Tn)(moreParams)
562
- // def _1: T1 = this.p1
562
+ // def _1: T1 = this.p1
563
563
// ...
564
- // def _N: TN = this.pN
564
+ // def _N: TN = this.pN (unless already given as valdef or parameterless defdef)
565
565
// def copy(p1: T1 = p1: @uncheckedVariance, ...,
566
566
// pN: TN = pN: @uncheckedVariance)(moreParams) =
567
567
// new C[...](p1, ..., pN)(moreParams)
@@ -572,12 +572,21 @@ object desugar {
572
572
val caseClassMeths = {
573
573
def syntheticProperty (name : TermName , tpt : Tree , rhs : Tree ) =
574
574
DefDef (name, Nil , Nil , tpt, rhs).withMods(synthetic)
575
- def productElemMeths = {
575
+
576
+ def productElemMeths =
576
577
val caseParams = derivedVparamss.head.toArray
577
- for (i <- List .range(0 , arity) if nme.selectorName(i) `ne` caseParams(i).name)
578
- yield syntheticProperty(nme.selectorName(i), caseParams(i).tpt,
578
+ val selectorNamesInBody = normalizedBody.collect {
579
+ case vdef : ValDef if vdef.name.isSelectorName =>
580
+ vdef.name
581
+ case ddef : DefDef if ddef.name.isSelectorName && ddef.tparams.isEmpty && ddef.vparamss.isEmpty =>
582
+ ddef.name
583
+ }
584
+ for i <- List .range(0 , arity)
585
+ selName = nme.selectorName(i)
586
+ if (selName ne caseParams(i).name) && ! selectorNamesInBody.contains(selName)
587
+ yield syntheticProperty(selName, caseParams(i).tpt,
579
588
Select (This (EmptyTypeIdent ), caseParams(i).name))
580
- }
589
+
581
590
def ordinalMeths = if (isEnumCase) ordinalMethLit(nextOrdinal(CaseKind .Class )._1) :: Nil else Nil
582
591
def copyMeths = {
583
592
val hasRepeatedParam = constrVparamss.exists(_.exists {
0 commit comments