Change the Kotlin reflection adapter to yield to the codegen adapter

This commit is contained in:
Jesse Wilson
2018-05-14 18:21:36 -04:00
parent 3f1e4b5a3d
commit dd84b9f8f8
2 changed files with 23 additions and 0 deletions

View File

@@ -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}")

View File

@@ -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