@@ -12,20 +12,19 @@ private[focus] trait SelectFieldParser {
12
12
13
13
def unapply (term : Term ): Option [FocusResult [(RemainingCode , FocusAction )]] = term match {
14
14
15
- case Select (CaseClass (remainingCode, classSymbol), fieldName) =>
16
- if (isCaseField(classSymbol, fieldName)) {
17
- val fromType = getType(remainingCode)
18
- val action = (hasOnlyOneParameterList(classSymbol), hasOnlyOneField(classSymbol)) match {
19
- case (true , false ) => getSelectFieldAction(fromType, fieldName)
20
- case (false , false ) => getSelectFieldActionWithImplicits(fromType, fieldName)
21
- case (true , true ) => getSelectOnlyFieldAction(fromType, classSymbol, fieldName)
22
- case (false , true ) => getSelectOnlyFieldActionWithImplicits(fromType, classSymbol, fieldName)
23
- }
24
- val remainingCodeWithAction = action.map(a => (RemainingCode (remainingCode), a))
25
- Some (remainingCodeWithAction)
26
- } else {
27
- Some (FocusError .NotACaseField (remainingCode.tpe.show, fieldName).asResult)
28
- }
15
+ case Select (remainingCode @ CaseClassExtractor (caseClass : CaseClass ), fieldName) =>
16
+ Some (
17
+ for {
18
+ _ <- caseClass.allOtherParametersAreImplicitResult
19
+ caseFieldSymbol <- caseClass.getCaseFieldSymbol(fieldName)
20
+ action <- (caseClass.hasOnlyOneParameterList, caseClass.hasOnlyOneCaseField) match {
21
+ case (true , false ) => getSelectFieldAction(caseClass, caseFieldSymbol)
22
+ case (false , false ) => getSelectFieldActionWithImplicits(caseClass, caseFieldSymbol)
23
+ case (true , true ) => getSelectOnlyFieldAction(caseClass, caseFieldSymbol)
24
+ case (false , true ) => getSelectOnlyFieldActionWithImplicits(caseClass, caseFieldSymbol)
25
+ }
26
+ } yield (RemainingCode (remainingCode), action)
27
+ )
29
28
30
29
case Select (remainingCode, fieldName) =>
31
30
Some (FocusError .NotACaseClass (remainingCode.tpe.show, fieldName).asResult)
@@ -34,57 +33,60 @@ private[focus] trait SelectFieldParser {
34
33
}
35
34
}
36
35
37
- private def isCaseField (classSymbol : Symbol , fieldName : String ): Boolean =
38
- classSymbol.caseFields.exists(_.name == fieldName)
39
-
40
- private def hasOnlyOneField (classSymbol : Symbol ): Boolean =
41
- classSymbol.caseFields.length == 1
42
-
43
- private def hasOnlyOneParameterList (classSymbol : Symbol ): Boolean =
44
- classSymbol.primaryConstructor.paramSymss match {
45
- case _ :: Nil => true
46
- case (head :: _) :: _ :: Nil if head.isTypeParam => true
47
- case _ => false
48
- }
49
-
50
- private def getCompanionObject (classSymbol : Symbol ): Term =
51
- Ref (classSymbol.companionModule)
52
-
53
- private def getSelectFieldAction (fromType : TypeRepr , fieldName : String ): FocusResult [FocusAction ] =
54
- getFieldType(fromType, fieldName).flatMap { toType =>
55
- Right (FocusAction .SelectField (fieldName, fromType, getSuppliedTypeArgs(fromType), toType))
56
- }
57
-
58
- private def getSelectFieldActionWithImplicits (fromType : TypeRepr , fieldName : String ): FocusResult [FocusAction ] =
59
- getFieldType(fromType, fieldName).flatMap { toType =>
60
- val typeArgs = getSuppliedTypeArgs(fromType)
61
- constructSetter(fieldName, fromType, toType, typeArgs).map { setter =>
62
- FocusAction .SelectFieldWithImplicits (fieldName, fromType, toType, setter)
63
- }
64
- }
36
+ private def getSelectFieldAction (
37
+ caseClass : CaseClass ,
38
+ caseFieldSymbol : Symbol
39
+ ): FocusResult [FocusAction ] =
40
+ for {
41
+ toType <- caseClass.getCaseFieldType(caseFieldSymbol)
42
+ } yield FocusAction .SelectField (
43
+ caseFieldSymbol,
44
+ caseClass.typeRepr,
45
+ caseClass.typeArgs,
46
+ toType
47
+ )
48
+
49
+ private def getSelectFieldActionWithImplicits (
50
+ caseClass : CaseClass ,
51
+ caseFieldSymbol : Symbol
52
+ ): FocusResult [FocusAction ] =
53
+ for {
54
+ toType <- caseClass.getCaseFieldType(caseFieldSymbol)
55
+ setter <- constructSetter(caseFieldSymbol.name, caseClass.typeRepr, toType, caseClass.typeArgs)
56
+ } yield FocusAction .SelectFieldWithImplicits (
57
+ caseFieldSymbol,
58
+ caseClass.typeRepr,
59
+ toType,
60
+ setter
61
+ )
65
62
66
63
private def getSelectOnlyFieldAction (
67
- fromType : TypeRepr ,
68
- fromClassSymbol : Symbol ,
69
- fieldName : String
64
+ caseClass : CaseClass ,
65
+ caseFieldSymbol : Symbol
70
66
): FocusResult [FocusAction ] =
71
67
for {
72
- toType <- getFieldType(fromType, fieldName)
73
- companion = getCompanionObject(fromClassSymbol)
74
- supplied = getSuppliedTypeArgs(fromType)
75
- } yield FocusAction .SelectOnlyField (fieldName, fromType, supplied, companion, toType)
68
+ toType <- caseClass.getCaseFieldType(caseFieldSymbol)
69
+ } yield FocusAction .SelectOnlyField (
70
+ caseFieldSymbol,
71
+ caseClass.typeRepr,
72
+ caseClass.typeArgs,
73
+ caseClass.companionObject,
74
+ toType
75
+ )
76
76
77
77
private def getSelectOnlyFieldActionWithImplicits (
78
- fromType : TypeRepr ,
79
- fromClassSymbol : Symbol ,
80
- fieldName : String
78
+ caseClass : CaseClass ,
79
+ caseFieldSymbol : Symbol
81
80
): FocusResult [FocusAction ] =
82
81
for {
83
- toType <- getFieldType(fromType, fieldName)
84
- companion = getCompanionObject(fromClassSymbol)
85
- supplied = getSuppliedTypeArgs(fromType)
86
- reverseGet <- constructReverseGet(companion, fromType, toType, supplied)
87
- } yield FocusAction .SelectOnlyFieldWithImplicits (fieldName, fromType, toType, reverseGet)
82
+ toType <- caseClass.getCaseFieldType(caseFieldSymbol)
83
+ reverseGet <- constructReverseGet(caseClass.companionObject, caseClass.typeRepr, toType, caseClass.typeArgs)
84
+ } yield FocusAction .SelectOnlyFieldWithImplicits (
85
+ caseFieldSymbol,
86
+ caseClass.typeRepr,
87
+ toType,
88
+ reverseGet
89
+ )
88
90
89
91
private case class LiftException (error : FocusError ) extends Exception
90
92
0 commit comments