From 48e6dd3f03fb54dac51cc26487d66c4977d1543b Mon Sep 17 00:00:00 2001 From: Zac Sweers Date: Wed, 3 Nov 2021 15:49:28 -0400 Subject: [PATCH] Support externally-compiled transient property recognition in KSP (#1416) --- .../moshi/kotlin/codegen/ksp/TargetTypes.kt | 9 ++++++-- .../moshi/kotlin/codegen/CompileOnlyTests.kt | 23 +++++++++++++++++++ .../test/extra/AbstractClassInModuleA.kt | 8 ++++++- .../squareup/moshi/kotlin/DualKotlinTest.kt | 22 ------------------ 4 files changed, 37 insertions(+), 25 deletions(-) diff --git a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/ksp/TargetTypes.kt b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/ksp/TargetTypes.kt index 7ad227e..e75eebd 100644 --- a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/ksp/TargetTypes.kt +++ b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/ksp/TargetTypes.kt @@ -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 diff --git a/kotlin/tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/CompileOnlyTests.kt b/kotlin/tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/CompileOnlyTests.kt index f231683..b687b07 100644 --- a/kotlin/tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/CompileOnlyTests.kt +++ b/kotlin/tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/CompileOnlyTests.kt @@ -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 + +// 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) + +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() diff --git a/kotlin/tests/extra-moshi-test-module/src/main/kotlin/com/squareup/moshi/kotlin/codegen/test/extra/AbstractClassInModuleA.kt b/kotlin/tests/extra-moshi-test-module/src/main/kotlin/com/squareup/moshi/kotlin/codegen/test/extra/AbstractClassInModuleA.kt index 2445e2e..da8b4cf 100644 --- a/kotlin/tests/extra-moshi-test-module/src/main/kotlin/com/squareup/moshi/kotlin/codegen/test/extra/AbstractClassInModuleA.kt +++ b/kotlin/tests/extra-moshi-test-module/src/main/kotlin/com/squareup/moshi/kotlin/codegen/test/extra/AbstractClassInModuleA.kt @@ -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" +} diff --git a/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/DualKotlinTest.kt b/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/DualKotlinTest.kt index 5a1ff64..e4268b3 100644 --- a/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/DualKotlinTest.kt +++ b/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/DualKotlinTest.kt @@ -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) - -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()