Support externally-compiled transient property recognition in KSP (#1416)

This commit is contained in:
Zac Sweers
2021-11-03 15:49:28 -04:00
committed by GitHub
parent 92add003fe
commit 48e6dd3f03
4 changed files with 37 additions and 25 deletions

View File

@@ -39,6 +39,7 @@ import com.squareup.kotlinpoet.KModifier
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
import com.squareup.kotlinpoet.PropertySpec
import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.jvm.transient
import com.squareup.kotlinpoet.ksp.TypeParameterResolver
import com.squareup.kotlinpoet.ksp.toClassName
import com.squareup.kotlinpoet.ksp.toKModifier
@@ -258,8 +259,12 @@ private fun KSPropertyDeclaration.toPropertySpec(
.mutable(isMutable)
.addModifiers(modifiers.map { KModifier.valueOf(it.name) })
.apply {
if (isAnnotationPresent(Transient::class)) {
addAnnotation(Transient::class)
// Check modifiers and annotation since annotation is source-only
// Note that this won't work properly until https://github.com/google/ksp/issues/710 is fixed
val isTransient = Modifier.JAVA_TRANSIENT in this@toPropertySpec.modifiers ||
isAnnotationPresent(Transient::class)
if (isTransient) {
transient()
}
addAnnotations(
this@toPropertySpec.annotations

View File

@@ -17,6 +17,9 @@ package com.squareup.moshi.kotlin.codegen
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import com.squareup.moshi.JsonQualifier
import com.squareup.moshi.kotlin.codegen.test.extra.AbstractClassInModuleA
import kotlin.annotation.AnnotationRetention.RUNTIME
import kotlin.annotation.AnnotationTarget.TYPE
/*
@@ -117,3 +120,23 @@ data class SmokeTestType(
typealias TypeAliasName = String
typealias GenericTypeAlias = List<String>
// Regression test for enum constants in annotations and array types
// https://github.com/ZacSweers/MoshiX/issues/103
@Retention(RUNTIME)
@JsonQualifier
annotation class UpperCase(val foo: Array<Foo>)
enum class Foo { BAR }
@JsonClass(generateAdapter = true)
data class ClassWithQualifier(
@UpperCase(foo = [Foo.BAR])
val a: Int
)
// Regression for https://github.com/ZacSweers/MoshiX/issues/120
@JsonClass(generateAdapter = true)
data class DataClassInModuleB(
val id: String
) : AbstractClassInModuleA()

View File

@@ -15,4 +15,10 @@
*/
package com.squareup.moshi.kotlin.codegen.test.extra
public abstract class AbstractClassInModuleA
public abstract class AbstractClassInModuleA {
// Transients to ensure processor sees them across module boundaries since @Transient is
// SOURCE-only
// TODO uncomment these when https://github.com/google/ksp/issues/710 is fixed
// @Transient private lateinit var lateinitTransient: String
// @Transient private var regularTransient: String = "regularTransient"
}

View File

@@ -20,12 +20,10 @@ import com.squareup.moshi.FromJson
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import com.squareup.moshi.JsonDataException
import com.squareup.moshi.JsonQualifier
import com.squareup.moshi.Moshi
import com.squareup.moshi.ToJson
import com.squareup.moshi.Types
import com.squareup.moshi.adapter
import com.squareup.moshi.kotlin.codegen.test.extra.AbstractClassInModuleA
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import org.intellij.lang.annotations.Language
import org.junit.Assert.fail
@@ -648,23 +646,3 @@ typealias NullableB = B?
typealias C = NullableA
typealias D = C
typealias E = D
// Regression test for enum constants in annotations and array types
// https://github.com/ZacSweers/MoshiX/issues/103
@Retention(RUNTIME)
@JsonQualifier
annotation class UpperCase(val foo: Array<Foo>)
enum class Foo { BAR }
@JsonClass(generateAdapter = true)
data class ClassWithQualifier(
@UpperCase(foo = [Foo.BAR])
val a: Int
)
// Regression for https://github.com/ZacSweers/MoshiX/issues/120
@JsonClass(generateAdapter = true)
data class DataClassInModuleB(
val id: String
) : AbstractClassInModuleA()