Skip to content

Commit 973b04a

Browse files
committed
add @NonDataProp to skip getter-like concrete methods
1 parent 81d2b82 commit 973b04a

File tree

5 files changed

+46
-12
lines changed

5 files changed

+46
-12
lines changed

example/src/test/java/com/fivemiles/auto/dataclass/SimpleDataTest.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,14 @@ import org.junit.Test
3939
/**
4040
* Or abstract classes is also supported.
4141
*/
42+
@Suppress("unused")
4243
@DataClass abstract class SimpleAbsData : Parcelable {
4344
abstract val name: String
4445
abstract var age: Int
4546

47+
/** Getter-like concrete methods will be skipped */
48+
fun description(): String = "$name is $age years old."
49+
4650
companion object {
4751
fun create(name: String = "Jon", age: Int = 18): SimpleAbsData =
4852
DC_SimpleAbsData(name, age)
@@ -57,6 +61,10 @@ import org.junit.Test
5761
*/
5862
@DataClass data class SimpleFinalData(val name: String, var age: Int) {
5963
override fun toString() = "$name, $age years old"
64+
65+
/** Skip getter-like methods by annotating [NonDataProp] */
66+
@NonDataProp
67+
fun description(): String = "$name is $age years old."
6068
}
6169

6270
/**

lib/src/main/java/com/fivemiles/auto/dataclass/DataProp.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,19 @@ import kotlin.reflect.KClass
88
* Define a Data property
99
*/
1010
@Retention(AnnotationRetention.SOURCE)
11-
@Target(AnnotationTarget.PROPERTY_GETTER)
11+
@Target(AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.FUNCTION)
1212
@MustBeDocumented
1313
annotation class DataProp(
1414
/** Name of the JSON field for the property */
1515
val jsonField: String = "",
1616
/** Alternative JSON field names */
17-
val jsonFieldAlternate: Array<String> = emptyArray(),
17+
val jsonFieldAlternate: Array<String> = [],
1818
/** The literal of the default value, used in generated source */
1919
val defaultValueLiteral: String = "",
2020
/** Customized Gson [TypeAdapter] for this property */
2121
val gsonTypeAdapter: KClass<out TypeAdapter<*>> = TypeAdapter::class,
2222
/** Customized [ParcelAdapter] for this property */
2323
val parcelAdapter: KClass<out ParcelAdapter<*>> = ParcelAdapter::class,
24-
/** If the property is transient */
24+
/** If the property is transient (will be skipped by the generators) */
2525
val isTransient: Boolean = false
2626
)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.fivemiles.auto.dataclass
2+
3+
/**
4+
* Tell the generators to ignore the annotated getters or methods.
5+
*/
6+
@Retention(AnnotationRetention.SOURCE)
7+
@Target(AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.FUNCTION)
8+
@MustBeDocumented
9+
annotation class NonDataProp

processor/src/main/java/com/fivemiles/auto/dataclass/models.kt

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
package com.fivemiles.auto.dataclass
22

3-
/* ktlint-disable no-wildcard-imports */
4-
import com.google.auto.common.*
5-
import com.squareup.kotlinpoet.*
3+
import com.google.auto.common.AnnotationMirrors
4+
import com.google.auto.common.MoreElements
5+
import com.squareup.kotlinpoet.ClassName
6+
import com.squareup.kotlinpoet.TypeName
7+
import com.squareup.kotlinpoet.asClassName
68
import java.beans.Introspector
79
import javax.annotation.processing.ProcessingEnvironment
8-
import javax.lang.model.element.*
9-
import javax.lang.model.type.*
10+
import javax.lang.model.element.AnnotationMirror
11+
import javax.lang.model.element.Element
12+
import javax.lang.model.element.ExecutableElement
13+
import javax.lang.model.element.Modifier
14+
import javax.lang.model.element.TypeElement
15+
import javax.lang.model.type.TypeKind
16+
import javax.lang.model.type.TypeMirror
17+
import javax.lang.model.util.Elements
1018
import javax.lang.model.util.Types
1119

1220
private const val CLASS_NAME_PREFIX = "DC"
@@ -41,7 +49,7 @@ internal data class DataClassDef(
4149
) {
4250

4351
val typeUtils: Types by lazy { processingEnv.typeUtils }
44-
val elementUtils = processingEnv.elementUtils
52+
private val elementUtils: Elements = processingEnv.elementUtils
4553

4654
/**
4755
* [ClassName] of the data class to be generated
@@ -103,7 +111,8 @@ internal data class DataClassDef(
103111
element: TypeElement,
104112
methods: Set<ExecutableElement>?
105113
): Set<ExecutableElement> = methods?.filter {
106-
it.parameters.isEmpty() &&
114+
!it.isAnnotationPresent(NonDataProp::class.java.name) && // ignore non-property
115+
it.parameters.isEmpty() &&
107116
(element.isConcreteClass || Modifier.ABSTRACT in it.modifiers) && // allow concrete properties in Parcelized class
108117
it.returnType?.kind != TypeKind.VOID &&
109118
!hasDefaultImplement(element, it, typeUtils) &&

processor/src/test/java/com/fivemiles/auto/dataclass/DataClassStepTest.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,15 @@ package com.fivemiles.auto.dataclass
44
import com.google.common.truth.Truth.assertAbout
55
import com.google.testing.compile.JavaFileObjects
66
import com.google.testing.compile.JavaSourcesSubjectFactory.javaSources
7-
import com.squareup.kotlinpoet.*
8-
import org.junit.*
7+
import com.squareup.kotlinpoet.FileSpec
8+
import com.squareup.kotlinpoet.FunSpec
9+
import com.squareup.kotlinpoet.KModifier
10+
import com.squareup.kotlinpoet.PropertySpec
11+
import com.squareup.kotlinpoet.TypeSpec
12+
import com.squareup.kotlinpoet.asClassName
13+
import org.junit.Before
14+
import org.junit.Ignore
15+
import org.junit.Test
916
import java.nio.charset.Charset
1017
import javax.tools.JavaFileObject
1118
import javax.tools.StandardLocation.SOURCE_OUTPUT
@@ -15,6 +22,7 @@ import javax.tools.StandardLocation.SOURCE_OUTPUT
1522
*
1623
* Created by ywu on 2017/7/6.
1724
*/
25+
@Suppress("UNUSED_VARIABLE")
1826
class DataClassStepTest {
1927

2028
private lateinit var dataClassSource: JavaFileObject

0 commit comments

Comments
 (0)