diff --git a/kotlin/reflect/src/main/java/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapter.kt b/kotlin/reflect/src/main/java/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapter.kt index 3bc8eaa..d32ae5c 100644 --- a/kotlin/reflect/src/main/java/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapter.kt +++ b/kotlin/reflect/src/main/java/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapter.kt @@ -17,6 +17,7 @@ package com.squareup.moshi.kotlin.reflect import com.squareup.moshi.Json import com.squareup.moshi.JsonAdapter +import com.squareup.moshi.JsonClass import com.squareup.moshi.JsonDataException import com.squareup.moshi.JsonReader import com.squareup.moshi.JsonWriter @@ -173,6 +174,8 @@ class KotlinJsonAdapterFactory : JsonAdapter.Factory { if (rawType.isEnum) return null if (!rawType.isAnnotationPresent(KOTLIN_METADATA)) return null if (Util.isPlatformType(rawType)) return null + val jsonClass = rawType.getAnnotation(JsonClass::class.java) + if (jsonClass != null && jsonClass.generateAdapter) return null if (rawType.isLocalClass) { throw IllegalArgumentException("Cannot serialize local class or object expression ${rawType.name}") diff --git a/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapterTest.kt b/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapterTest.kt index f671d60..7ee003a 100644 --- a/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapterTest.kt +++ b/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapterTest.kt @@ -17,6 +17,7 @@ package com.squareup.moshi.kotlin.reflect 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 @@ -840,6 +841,25 @@ class KotlinJsonAdapterTest { assertThat(adapter.toJson(value)).isEqualTo(json) } + @Test fun mixingReflectionAndCodegen() { + val moshi = Moshi.Builder() + .add(KotlinJsonAdapterFactory()) + .build() + val generatedAdapter = moshi.adapter(UsesGeneratedAdapter::class.java) + val reflectionAdapter = moshi.adapter(UsesReflectionAdapter::class.java) + + assertThat(generatedAdapter.javaClass.name) + .contains("KotlinJsonAdapterTest_UsesGeneratedAdapterJsonAdapter") + assertThat(reflectionAdapter.javaClass.name) + .doesNotContain("KotlinJsonAdapterTest_UsesReflectionAdapterJsonAdapter") + } + + @JsonClass(generateAdapter = true) + class UsesGeneratedAdapter(var a: Int, var b: Int) + + @JsonClass(generateAdapter = false) + class UsesReflectionAdapter(var a: Int, var b: Int) + @Retention(RUNTIME) @JsonQualifier annotation class Uppercase