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.ParameterizedTypeName.Companion.parameterizedBy
import com.squareup.kotlinpoet.PropertySpec import com.squareup.kotlinpoet.PropertySpec
import com.squareup.kotlinpoet.TypeName import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.jvm.transient
import com.squareup.kotlinpoet.ksp.TypeParameterResolver import com.squareup.kotlinpoet.ksp.TypeParameterResolver
import com.squareup.kotlinpoet.ksp.toClassName import com.squareup.kotlinpoet.ksp.toClassName
import com.squareup.kotlinpoet.ksp.toKModifier import com.squareup.kotlinpoet.ksp.toKModifier
@@ -258,8 +259,12 @@ private fun KSPropertyDeclaration.toPropertySpec(
.mutable(isMutable) .mutable(isMutable)
.addModifiers(modifiers.map { KModifier.valueOf(it.name) }) .addModifiers(modifiers.map { KModifier.valueOf(it.name) })
.apply { .apply {
if (isAnnotationPresent(Transient::class)) { // Check modifiers and annotation since annotation is source-only
addAnnotation(Transient::class) // 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( addAnnotations(
this@toPropertySpec.annotations this@toPropertySpec.annotations

View File

@@ -17,6 +17,9 @@ package com.squareup.moshi.kotlin.codegen
import com.squareup.moshi.Json import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass 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 import kotlin.annotation.AnnotationTarget.TYPE
/* /*
@@ -117,3 +120,23 @@ data class SmokeTestType(
typealias TypeAliasName = String typealias TypeAliasName = String
typealias GenericTypeAlias = List<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 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.Json
import com.squareup.moshi.JsonClass import com.squareup.moshi.JsonClass
import com.squareup.moshi.JsonDataException import com.squareup.moshi.JsonDataException
import com.squareup.moshi.JsonQualifier
import com.squareup.moshi.Moshi import com.squareup.moshi.Moshi
import com.squareup.moshi.ToJson import com.squareup.moshi.ToJson
import com.squareup.moshi.Types import com.squareup.moshi.Types
import com.squareup.moshi.adapter import com.squareup.moshi.adapter
import com.squareup.moshi.kotlin.codegen.test.extra.AbstractClassInModuleA
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import org.intellij.lang.annotations.Language import org.intellij.lang.annotations.Language
import org.junit.Assert.fail import org.junit.Assert.fail
@@ -648,23 +646,3 @@ typealias NullableB = B?
typealias C = NullableA typealias C = NullableA
typealias D = C typealias D = C
typealias E = D 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()