@@ -368,10 +368,14 @@ trait CaseClassMacros extends ReprTypes with CaseClassMacrosVersionSpecifics {
368
368
* */
369
369
def fieldsOf (tpe : Type ): List [(TermName , Type )] = {
370
370
val clazz = tpe.typeSymbol.asClass
371
+ // Case class field names have an extra space at the end.
372
+ val nameOf : TermSymbol => TermName =
373
+ if (! clazz.isCaseClass) _.name
374
+ else field => TermName (field.name.toString.dropRight(1 ))
371
375
if (isCaseObjectLike(clazz) || isAnonOrRefinement(clazz)) Nil
372
376
else tpe.decls.sorted.collect {
373
- case sym : TermSymbol if isCaseAccessorLike(sym ) =>
374
- (sym.name, sym .typeSignatureIn(tpe).finalResultType)
377
+ case field : TermSymbol if isCaseAccessorLike(field ) =>
378
+ nameOf(field) -> field .typeSignatureIn(tpe).finalResultType
375
379
}
376
380
}
377
381
@@ -496,11 +500,14 @@ trait CaseClassMacros extends ReprTypes with CaseClassMacrosVersionSpecifics {
496
500
}
497
501
}
498
502
499
- def nameAsString (name : Name ): String = name.decodedName.toString.trim
503
+ def nameAsString (name : Name ): String =
504
+ name.decodedName.toString
500
505
501
- def nameAsValue (name : Name ): Constant = Constant (nameAsString(name))
506
+ def nameAsValue (name : Name ): Constant =
507
+ Constant (nameAsString(name))
502
508
503
- def nameOf (tpe : Type ) = tpe.typeSymbol.name
509
+ def nameOf (tpe : Type ): Name =
510
+ tpe.typeSymbol.name
504
511
505
512
def mkHListValue (elems : List [Tree ]): Tree = {
506
513
val cons = objectRef[:: .type ]
@@ -1030,8 +1037,10 @@ trait CaseClassMacros extends ReprTypes with CaseClassMacrosVersionSpecifics {
1030
1037
(const(singleton), const(objectRef[HNil .type ]))
1031
1038
// case 3: case class
1032
1039
case tpe if tpe.typeSymbol.asClass.isCaseClass =>
1040
+ val companion = patchedCompanionSymbolOf(tpe.typeSymbol)
1041
+ val unapply = companion.typeSignature.member(TermName (" unapply" ))
1033
1042
val fields = fieldsOf(tpe)
1034
- (fromApply(fields), toUnapply(fields))
1043
+ (fromApply(fields), if (unapply.isSynthetic) toUnapply(fields) else toGetters (fields))
1035
1044
// case 4: exactly one matching public apply/unapply
1036
1045
case HasApplyUnapply (args) =>
1037
1046
(fromApply(args), toUnapply(args))
0 commit comments