diff --git a/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/ComplexGenericsInheritanceTest.kt b/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/ComplexGenericsInheritanceTest.kt index a736342..891ea37 100644 --- a/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/ComplexGenericsInheritanceTest.kt +++ b/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/ComplexGenericsInheritanceTest.kt @@ -20,7 +20,6 @@ package com.squareup.moshi.kotlin.codegen import com.google.common.truth.Truth.assertThat import com.squareup.moshi.JsonClass import com.squareup.moshi.Moshi -import com.squareup.moshi.adapter import org.intellij.lang.annotations.Language import org.junit.Test diff --git a/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/DefaultConstructorTest.kt b/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/DefaultConstructorTest.kt index a211c7a..79b3bfb 100644 --- a/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/DefaultConstructorTest.kt +++ b/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/DefaultConstructorTest.kt @@ -17,7 +17,6 @@ package com.squareup.moshi.kotlin.codegen import com.squareup.moshi.JsonClass import com.squareup.moshi.Moshi -import com.squareup.moshi.adapter import org.junit.Test class DefaultConstructorTest { diff --git a/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/GeneratedAdaptersTest.kt b/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/GeneratedAdaptersTest.kt index f42dff6..311a259 100644 --- a/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/GeneratedAdaptersTest.kt +++ b/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/GeneratedAdaptersTest.kt @@ -26,7 +26,6 @@ import com.squareup.moshi.JsonReader import com.squareup.moshi.JsonWriter import com.squareup.moshi.Moshi import com.squareup.moshi.ToJson -import com.squareup.moshi.adapter import com.squareup.moshi.internal.NullSafeJsonAdapter import com.squareup.moshi.kotlin.codegen.annotation.UppercaseInAnnotationPackage import com.squareup.moshi.kotlin.codegen.annotation.UppercaseInAnnotationPackageJsonAdapter diff --git a/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/MixingReflectAndCodeGen.kt b/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/MixingReflectAndCodeGen.kt index 29510c9..61248c3 100644 --- a/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/MixingReflectAndCodeGen.kt +++ b/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/MixingReflectAndCodeGen.kt @@ -18,7 +18,6 @@ package com.squareup.moshi.kotlin.codegen import com.google.common.truth.Truth.assertThat import com.squareup.moshi.JsonClass import com.squareup.moshi.Moshi -import com.squareup.moshi.adapter import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import org.junit.Test diff --git a/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/MoshiKspTest.kt b/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/MoshiKspTest.kt index 01884b4..4ef7b51 100644 --- a/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/MoshiKspTest.kt +++ b/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/MoshiKspTest.kt @@ -18,7 +18,6 @@ package com.squareup.moshi.kotlin.codegen import com.google.common.truth.Truth.assertThat import com.squareup.moshi.JsonClass import com.squareup.moshi.Moshi -import com.squareup.moshi.adapter import org.junit.Test // Regression tests specific to Moshi-KSP diff --git a/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/MultipleMasksTest.kt b/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/MultipleMasksTest.kt index b7946fe..e1a4268 100644 --- a/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/MultipleMasksTest.kt +++ b/moshi-kotlin-tests/codegen-only/src/test/kotlin/com/squareup/moshi/kotlin/codegen/MultipleMasksTest.kt @@ -17,7 +17,6 @@ package com.squareup.moshi.kotlin.codegen import com.squareup.moshi.JsonClass import com.squareup.moshi.Moshi -import com.squareup.moshi.adapter import org.intellij.lang.annotations.Language import org.junit.Assert.assertEquals import org.junit.Test diff --git a/moshi-kotlin-tests/src/test/kotlin/com/squareup/moshi/kotlin/DualKotlinTest.kt b/moshi-kotlin-tests/src/test/kotlin/com/squareup/moshi/kotlin/DualKotlinTest.kt index de6e517..f3ca5af 100644 --- a/moshi-kotlin-tests/src/test/kotlin/com/squareup/moshi/kotlin/DualKotlinTest.kt +++ b/moshi-kotlin-tests/src/test/kotlin/com/squareup/moshi/kotlin/DualKotlinTest.kt @@ -23,7 +23,6 @@ import com.squareup.moshi.JsonDataException 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.reflect.KotlinJsonAdapterFactory import org.intellij.lang.annotations.Language import org.junit.Assert.fail diff --git a/moshi-kotlin-tests/src/test/kotlin/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapterTest.kt b/moshi-kotlin-tests/src/test/kotlin/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapterTest.kt index 295a61c..5543d48 100644 --- a/moshi-kotlin-tests/src/test/kotlin/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapterTest.kt +++ b/moshi-kotlin-tests/src/test/kotlin/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapterTest.kt @@ -26,7 +26,6 @@ import com.squareup.moshi.JsonReader import com.squareup.moshi.JsonWriter import com.squareup.moshi.Moshi import com.squareup.moshi.ToJson -import com.squareup.moshi.adapter import org.assertj.core.api.Assertions import org.junit.Assert.fail import org.junit.Test diff --git a/moshi/src/main/java/com/squareup/moshi/-MoshiKotlinExtensions.kt b/moshi/src/main/java/com/squareup/moshi/-MoshiKotlinExtensions.kt index e6db542..7878ef8 100644 --- a/moshi/src/main/java/com/squareup/moshi/-MoshiKotlinExtensions.kt +++ b/moshi/src/main/java/com/squareup/moshi/-MoshiKotlinExtensions.kt @@ -13,6 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +@file:Suppress("EXTENSION_SHADOWED_BY_MEMBER") + package com.squareup.moshi import com.squareup.moshi.internal.NonNullJsonAdapter @@ -25,9 +27,11 @@ import kotlin.reflect.typeOf * @return a [JsonAdapter] for [T], creating it if necessary. Note that while nullability of [T] * itself is handled, nested types (such as in generics) are not resolved. */ +@Deprecated("Use the Moshi instance version instead", level = DeprecationLevel.HIDDEN) @ExperimentalStdlibApi public inline fun Moshi.adapter(): JsonAdapter = adapter(typeOf()) +@Deprecated("Use the Moshi instance version instead", level = DeprecationLevel.HIDDEN) @ExperimentalStdlibApi public inline fun Moshi.Builder.addAdapter(adapter: JsonAdapter): Moshi.Builder = add(typeOf().javaType, adapter) @@ -35,6 +39,7 @@ public inline fun Moshi.Builder.addAdapter(adapter: JsonAdapter): * @return a [JsonAdapter] for [ktype], creating it if necessary. Note that while nullability of * [ktype] itself is handled, nested types (such as in generics) are not resolved. */ +@Deprecated("Use the Moshi instance version instead", level = DeprecationLevel.HIDDEN) @ExperimentalStdlibApi public fun Moshi.adapter(ktype: KType): JsonAdapter { val adapter = adapter(ktype.javaType) diff --git a/moshi/src/main/java/com/squareup/moshi/Moshi.kt b/moshi/src/main/java/com/squareup/moshi/Moshi.kt index 0d6aeff..ba3af7f 100644 --- a/moshi/src/main/java/com/squareup/moshi/Moshi.kt +++ b/moshi/src/main/java/com/squareup/moshi/Moshi.kt @@ -17,6 +17,8 @@ package com.squareup.moshi import com.squareup.moshi.Types.createJsonQualifierImplementation import com.squareup.moshi.internal.NO_ANNOTATIONS +import com.squareup.moshi.internal.NonNullJsonAdapter +import com.squareup.moshi.internal.NullSafeJsonAdapter import com.squareup.moshi.internal.canonicalize import com.squareup.moshi.internal.isAnnotationPresent import com.squareup.moshi.internal.removeSubtypeWildcard @@ -24,6 +26,9 @@ import com.squareup.moshi.internal.toStringWithAnnotations import com.squareup.moshi.internal.typesMatch import java.lang.reflect.Type import javax.annotation.CheckReturnValue +import kotlin.reflect.KType +import kotlin.reflect.javaType +import kotlin.reflect.typeOf /** * Coordinates binding between JSON values and Java objects. @@ -68,6 +73,32 @@ public class Moshi internal constructor(builder: Builder) { public fun adapter(type: Type, annotations: Set): JsonAdapter = adapter(type, annotations, fieldName = null) + /** + * @return a [JsonAdapter] for [T], creating it if necessary. Note that while nullability of [T] + * itself is handled, nested types (such as in generics) are not resolved. + */ + @CheckReturnValue + @ExperimentalStdlibApi + public inline fun adapter(): JsonAdapter = adapter(typeOf()) + + /** + * @return a [JsonAdapter] for [ktype], creating it if necessary. Note that while nullability of + * [ktype] itself is handled, nested types (such as in generics) are not resolved. + */ + @CheckReturnValue + @ExperimentalStdlibApi + public fun adapter(ktype: KType): JsonAdapter { + val adapter = adapter(ktype.javaType) + return if (adapter is NullSafeJsonAdapter || adapter is NonNullJsonAdapter) { + // TODO CR - Assume that these know what they're doing? Or should we defensively avoid wrapping for matching nullability? + adapter + } else if (ktype.isMarkedNullable) { + adapter.nullSafe() + } else { + adapter.nonNull() + } + } + /** * @param fieldName An optional field name associated with this type. The field name is used as a * hint for better adapter lookup error messages for nested structures. @@ -161,6 +192,10 @@ public class Moshi internal constructor(builder: Builder) { internal val factories = mutableListOf() internal var lastOffset = 0 + @CheckReturnValue + @ExperimentalStdlibApi + public inline fun addAdapter(adapter: JsonAdapter): Builder = add(typeOf().javaType, adapter) + public fun add(type: Type, jsonAdapter: JsonAdapter): Builder = apply { add(newAdapterFactory(type, jsonAdapter)) }