11package me.mozidev.keepdefault
22
33import com.google.auto.service.AutoService
4- import com.squareup.kotlinpoet.ClassName
5- import com.squareup.kotlinpoet.FileSpec
6- import com.squareup.kotlinpoet.FunSpec
7- import com.squareup.kotlinpoet.KModifier
8- import com.squareup.kotlinpoet.ParameterSpec
4+ import com.squareup.kotlinpoet.*
95import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
10- import com.squareup.kotlinpoet.TypeName
11- import com.squareup.kotlinpoet.TypeSpec
12- import com.squareup.kotlinpoet.asClassName
13- import com.squareup.kotlinpoet.asTypeName
14- import me.eugeniomarletti.kotlin.metadata.KotlinClassMetadata
15- import me.eugeniomarletti.kotlin.metadata.KotlinMetadataUtils
16- import me.eugeniomarletti.kotlin.metadata.declaresDefaultValue
17- import me.eugeniomarletti.kotlin.metadata.isDataClass
18- import me.eugeniomarletti.kotlin.metadata.isPrimary
19- import me.eugeniomarletti.kotlin.metadata.kotlinMetadata
6+ import me.eugeniomarletti.kotlin.metadata.*
207import me.eugeniomarletti.kotlin.metadata.shadow.metadata.ProtoBuf
218import me.eugeniomarletti.kotlin.metadata.shadow.metadata.deserialization.NameResolver
229import me.eugeniomarletti.kotlin.metadata.shadow.serialization.deserialization.getName
@@ -91,7 +78,7 @@ class KeepDefaultProcessor : KotlinAbstractProcessor(), KotlinMetadataUtils {
9178 .addFunction(generateTryKeepDefault(typeName, kotlinClassMetadata))
9279 .build())
9380
94- result.build().writeTo(File (fileDir, helperClassName))
81+ result.build().writeTo(File (fileDir, helperClassName). also { if ( ! it.exists()) it.mkdirs() } )
9582
9683 return helperClassName
9784 }
@@ -100,16 +87,20 @@ class KeepDefaultProcessor : KotlinAbstractProcessor(), KotlinMetadataUtils {
10087
10188 val (nameAllocator, classProto) = metadata.data
10289
90+ // the Gson-parsed data object
10391 val originParam = ParameterSpec
10492 .builder(" originData" , typeName.asNullable())
10593 .build()
10694
95+ // retrieve all the fields from DataClass' constructor
10796 val propList = classProto.constructorList.single { it.isPrimary }.valueParameterList
10897
10998 val noDefaultMarked = propList.count { it.declaresDefaultValue } == 0
11099 if (showErrorIfNoDefault && noDefaultMarked) {
111100 messager.printMessage(Diagnostic .Kind .ERROR , " There is no default value for any property" )
112101 }
102+
103+ // if non field is marked with "default", return the Gson-pared data object
113104 val statements = if (noDefaultMarked) {
114105 generateNoDefaultSpecified()
115106 } else {
@@ -131,6 +122,12 @@ class KeepDefaultProcessor : KotlinAbstractProcessor(), KotlinMetadataUtils {
131122 return listOf (" return originData" )
132123 }
133124
125+ /* *
126+ * do the real work,
127+ * 1. check all the fields set with "default" modifier
128+ * 2. check if it is "nullable"
129+ * 3. override the null value of "NonNull-Default" field
130+ */
134131 private fun generateCheckDefault (
135132 typeName : TypeName ,
136133 nameAllocator : NameResolver ,
0 commit comments