@@ -97,58 +97,39 @@ internal class KotlinAnnotationIntrospector(private val context: Module.SetupCon
97
97
return (this .annotations.firstOrNull { it.annotationClass.java == JsonProperty ::class .java } as ? JsonProperty )?.required
98
98
}
99
99
100
- private fun AnnotatedMethod.hasRequiredMarker (): Boolean? {
101
- // This could be a setter or a getter of a class property or
102
- // a setter-like/getter-like method.
103
- val paramGetter = this .getCorrespondingGetter()
104
- if (paramGetter != null ) {
105
- val byAnnotation = paramGetter.javaGetter?.isRequiredByAnnotation()
106
- return requiredAnnotationOrNullability(byAnnotation, paramGetter.returnType.isRequired())
107
- }
108
-
109
- val paramSetter = this .getCorrespondingSetter()
110
- if (paramSetter != null ) {
111
- val byAnnotation = paramSetter.javaMethod?.isRequiredByAnnotation()
112
- return requiredAnnotationOrNullability(byAnnotation, paramSetter.isMethodParameterRequired(0 ))
113
- }
114
-
115
- // Is the member method a regular method of the data class or
116
- val method = this .member.kotlinFunction
117
- if (method != null ) {
118
- val byAnnotation = method.javaMethod?.isRequiredByAnnotation()
119
- if (method.isGetterLike()) {
120
- return requiredAnnotationOrNullability(byAnnotation, method.returnType.isRequired())
121
- }
122
-
123
- if (method.isSetterLike()) {
124
- return requiredAnnotationOrNullability(byAnnotation, method.isMethodParameterRequired(0 ))
100
+ // Since Kotlin's property has the same Type for each field, getter, and setter,
101
+ // nullability can be determined from the returnType of KProperty.
102
+ private fun KProperty1 <* , * >.isRequiredByNullability () = returnType.isRequired()
103
+
104
+ // This could be a setter or a getter of a class property or
105
+ // a setter-like/getter-like method.
106
+ private fun AnnotatedMethod.hasRequiredMarker (): Boolean? = this .getRequiredMarkerFromCorrespondingAccessor()
107
+ ? : this .member.getRequiredMarkerFromAccessorLikeMethod()
108
+
109
+ private fun AnnotatedMethod.getRequiredMarkerFromCorrespondingAccessor (): Boolean? {
110
+ member.declaringClass.kotlin.declaredMemberProperties.forEach { kProperty ->
111
+ if (kProperty.javaGetter == this .member || (kProperty as ? KMutableProperty1 )?.javaSetter == this .member) {
112
+ val byAnnotation = this .member.isRequiredByAnnotation()
113
+ val byNullability = kProperty.isRequiredByNullability()
114
+ return requiredAnnotationOrNullability(byAnnotation, byNullability)
125
115
}
126
116
}
127
-
128
117
return null
129
118
}
130
119
131
- private fun KFunction <* >.isGetterLike (): Boolean = parameters.size == 1
132
- private fun KFunction <* >.isSetterLike (): Boolean =
133
- parameters.size == 2 && returnType == Unit ::class .createType()
134
-
135
-
136
- private fun AnnotatedMethod.getCorrespondingGetter (): KProperty1 <out Any , Any ?>? =
137
- member.declaringClass.kotlin.declaredMemberProperties.find {
138
- it.getter.javaMethod == this .member
139
- }
140
-
141
- @Suppress(" UNCHECKED_CAST" )
142
- private fun AnnotatedMethod.getCorrespondingSetter (): KMutableProperty1 .Setter <out Any , Any ?>? {
143
- val mutableProperty = member.declaringClass.kotlin.declaredMemberProperties.find {
144
- when (it) {
145
- is KMutableProperty1 -> it.javaSetter == this .member
146
- else -> false
147
- }
120
+ // Is the member method a regular method of the data class or
121
+ private fun Method.getRequiredMarkerFromAccessorLikeMethod (): Boolean? = this .kotlinFunction?.let { method ->
122
+ val byAnnotation = this .isRequiredByAnnotation()
123
+ return when {
124
+ method.isGetterLike() -> requiredAnnotationOrNullability(byAnnotation, method.returnType.isRequired())
125
+ method.isSetterLike() -> requiredAnnotationOrNullability(byAnnotation, method.isMethodParameterRequired(0 ))
126
+ else -> null
148
127
}
149
- return (mutableProperty as ? KMutableProperty1 <out Any , Any ?>)?.setter
150
128
}
151
129
130
+ private fun KFunction <* >.isGetterLike (): Boolean = parameters.size == 1
131
+ private fun KFunction <* >.isSetterLike (): Boolean = parameters.size == 2 && returnType == UNIT_TYPE
132
+
152
133
private fun AnnotatedParameter.hasRequiredMarker (): Boolean? {
153
134
val member = this .member
154
135
val byAnnotation = this .getAnnotation(JsonProperty ::class .java)?.required
@@ -185,4 +166,7 @@ internal class KotlinAnnotationIntrospector(private val context: Module.SetupCon
185
166
186
167
private fun KType.isRequired (): Boolean = ! isMarkedNullable
187
168
169
+ companion object {
170
+ val UNIT_TYPE : KType = Unit ::class .createType()
171
+ }
188
172
}
0 commit comments