@@ -673,18 +673,23 @@ trait CaseClassMacros extends ReprTypes with CaseClassMacrosVersionSpecifics {
673
673
else mkCoproductTypTree1(ctorsOf1(tpe), param, arg)
674
674
}
675
675
676
+ /** Returns the parameter lists of `tpe`, removing any implicit parameters. */
677
+ private def nonImplicitParamLists (tpe : Type ): List [List [Symbol ]] =
678
+ tpe.paramLists.takeWhile(params => params.isEmpty || ! params.head.isImplicit)
679
+
676
680
def isCaseClassLike (sym : ClassSymbol ): Boolean = {
677
681
def isConcrete = ! (sym.isAbstract || sym.isTrait || sym == symbolOf[Object ])
678
682
def isFinalLike = sym.isFinal || sym.knownDirectSubclasses.isEmpty
679
- def ctor = for {
680
- ctor <- accessiblePrimaryCtorOf(sym.typeSignature)
681
- Seq (params) <- Option (ctor .typeSignature.paramLists )
682
- if params.size == fieldsOf(sym.typeSignature).size
683
- } yield ctor
684
- sym.isCaseClass || (isConcrete && isFinalLike && ctor .isDefined)
683
+ def constructor = for {
684
+ constructor <- accessiblePrimaryCtorOf(sym.typeSignature)
685
+ Seq (params) <- Option (nonImplicitParamLists(constructor .typeSignature) )
686
+ if params.length == fieldsOf(sym.typeSignature).length
687
+ } yield constructor
688
+ sym.isCaseClass || (isConcrete && isFinalLike && constructor .isDefined)
685
689
}
686
690
687
- def isCaseObjectLike (sym : ClassSymbol ): Boolean = sym.isModuleClass
691
+ def isCaseObjectLike (sym : ClassSymbol ): Boolean =
692
+ sym.isModuleClass
688
693
689
694
def isCaseAccessorLike (sym : TermSymbol ): Boolean = {
690
695
val isGetter =
@@ -867,27 +872,18 @@ trait CaseClassMacros extends ReprTypes with CaseClassMacrosVersionSpecifics {
867
872
def numNonCaseParamLists (tpe : Type ): Int = {
868
873
val companion = patchedCompanionSymbolOf(tpe.typeSymbol).typeSignature
869
874
val apply = companion.member(TermName (" apply" ))
870
- if (apply.isMethod && ! isNonGeneric(apply) && isAccessible(companion, apply)) {
871
- val paramLists = apply.typeSignatureIn(companion).paramLists
872
- val numParamLists = paramLists.length
873
- if (numParamLists <= 1 ) 0
874
- else {
875
- if (paramLists.last.headOption.map(_.isImplicit).getOrElse(false ))
876
- numParamLists- 2
877
- else
878
- numParamLists- 1
879
- }
880
- } else 0
875
+ if (! apply.isMethod || isNonGeneric(apply) || ! isAccessible(companion, apply)) 0
876
+ else nonImplicitParamLists(apply.typeSignatureIn(companion)).length.max(1 ) - 1
881
877
}
882
878
883
879
object HasApply {
884
880
def unapply (tpe : Type ): Option [List [(TermName , Type )]] = for {
885
881
companion <- Option (patchedCompanionSymbolOf(tpe.typeSymbol).typeSignature)
886
- apply = companion.member(TermName (" apply" ))
882
+ apply <- Option ( companion.member(TermName (" apply" ) ))
887
883
if apply.isTerm && ! apply.asTerm.isOverloaded
888
884
if apply.isMethod && ! isNonGeneric(apply)
889
885
if isAccessible(companion, apply)
890
- Seq (params) <- Option (apply.typeSignatureIn(companion).paramLists )
886
+ Seq (params) <- Option (nonImplicitParamLists( apply.typeSignatureIn(companion)) )
891
887
aligned <- alignFields(tpe, for (param <- params)
892
888
yield param.name.toTermName -> param.typeSignature)
893
889
} yield aligned
@@ -896,20 +892,20 @@ trait CaseClassMacros extends ReprTypes with CaseClassMacrosVersionSpecifics {
896
892
object HasUnapply {
897
893
def unapply (tpe : Type ): Option [List [Type ]] = for {
898
894
companion <- Option (patchedCompanionSymbolOf(tpe.typeSymbol).typeSignature)
899
- unapply = companion.member(TermName (" unapply" ))
895
+ unapply <- Option ( companion.member(TermName (" unapply" ) ))
900
896
if unapply.isTerm && ! unapply.asTerm.isOverloaded
901
897
if unapply.isMethod && ! isNonGeneric(unapply)
902
898
if isAccessible(companion, unapply)
903
- returnTpe <- unapply.asMethod. typeSignatureIn(companion).finalResultType
899
+ returnTpe <- unapply.typeSignatureIn(companion).finalResultType
904
900
.baseType(symbolOf[Option [_]]).typeArgs.headOption
905
901
} yield if (returnTpe <:< typeOf[Product ]) returnTpe.typeArgs else List (returnTpe)
906
902
}
907
903
908
904
object HasUniqueCtor {
909
905
def unapply (tpe : Type ): Option [List [(TermName , Type )]] = for {
910
- ctor <- accessiblePrimaryCtorOf(tpe)
911
- if ! isNonGeneric(ctor )
912
- Seq (params) <- Option (ctor .typeSignatureIn(tpe).paramLists )
906
+ constructor <- accessiblePrimaryCtorOf(tpe)
907
+ if ! isNonGeneric(constructor )
908
+ Seq (params) <- Option (nonImplicitParamLists(constructor .typeSignatureIn(tpe)) )
913
909
aligned <- alignFields(tpe, for (param <- params)
914
910
yield param.name.toTermName -> param.typeSignature)
915
911
} yield aligned
0 commit comments