diff --git a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/AdapterGenerator.kt b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/AdapterGenerator.kt index 2d3b6b9..cb6fac4 100644 --- a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/AdapterGenerator.kt +++ b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/AdapterGenerator.kt @@ -31,7 +31,6 @@ import com.squareup.kotlinpoet.asClassName import com.squareup.kotlinpoet.asTypeName import com.squareup.kotlinpoet.joinToCode import com.squareup.moshi.JsonAdapter -import com.squareup.moshi.JsonDataException import com.squareup.moshi.JsonReader import com.squareup.moshi.JsonWriter import com.squareup.moshi.Moshi @@ -176,16 +175,6 @@ internal class AdapterGenerator( .build() } - private fun jsonDataException( - description: String, - identifier: String, - condition: String, - reader: ParameterSpec - ): CodeBlock { - return CodeBlock.of("%T(%T(%S).append(%S).append(%S).append(%N.path).toString())", - JsonDataException::class, StringBuilder::class, description, identifier, condition, reader) - } - private fun generateFromJsonFun(): FunSpec { val result = FunSpec.builder("fromJson") .addModifiers(KModifier.OVERRIDE) @@ -210,8 +199,7 @@ internal class AdapterGenerator( result.addStatement("%N = %N.fromJson(%N)", property.localName, nameAllocator[property.delegateKey], readerParam) } else { - val exception = jsonDataException( - "Non-null value '", property.localName, "' was null at ", readerParam) + val exception = unexpectedNull(property.localName, readerParam) result.addStatement("%N = %N.fromJson(%N) ?: throw·%L", property.localName, nameAllocator[property.delegateKey], readerParam, exception) } @@ -222,8 +210,7 @@ internal class AdapterGenerator( result.addStatement("%L -> %N = %N.fromJson(%N)", index, property.localName, nameAllocator[property.delegateKey], readerParam) } else { - val exception = jsonDataException( - "Non-null value '", property.localName, "' was null at ", readerParam) + val exception = unexpectedNull(property.localName, readerParam) result.addStatement("%L -> %N = %N.fromJson(%N) ?: throw·%L", index, property.localName, nameAllocator[property.delegateKey], readerParam, exception) @@ -306,8 +293,9 @@ internal class AdapterGenerator( result.addCode("%N = %N", property.name, property.localName) } if (!property.isTransient && property.isRequired) { - result.addCode(" ?: throw·%L", jsonDataException( - "Required property '", property.localName, "' missing at ", readerParam)) + val missingPropertyBlock = + CodeBlock.of("%T.missingProperty(%S, %N)", Util::class, property.localName, readerParam) + result.addCode(" ?: throw·%L", missingPropertyBlock) } separator = ",\n" } @@ -334,6 +322,10 @@ internal class AdapterGenerator( return result.build() } + private fun unexpectedNull(identifier: String, reader: ParameterSpec): CodeBlock { + return CodeBlock.of("%T.unexpectedNull(%S, %N)", Util::class, identifier, reader) + } + private fun generateToJsonFun(): FunSpec { val result = FunSpec.builder("toJson") .addModifiers(KModifier.OVERRIDE) diff --git a/moshi/src/main/java/com/squareup/moshi/internal/Util.java b/moshi/src/main/java/com/squareup/moshi/internal/Util.java index 2ad07a3..574332b 100644 --- a/moshi/src/main/java/com/squareup/moshi/internal/Util.java +++ b/moshi/src/main/java/com/squareup/moshi/internal/Util.java @@ -17,7 +17,9 @@ package com.squareup.moshi.internal; import com.squareup.moshi.JsonAdapter; import com.squareup.moshi.JsonClass; +import com.squareup.moshi.JsonDataException; import com.squareup.moshi.JsonQualifier; +import com.squareup.moshi.JsonReader; import com.squareup.moshi.Moshi; import com.squareup.moshi.Types; import java.lang.annotation.Annotation; @@ -42,6 +44,8 @@ import static com.squareup.moshi.Types.subtypeOf; import static com.squareup.moshi.Types.supertypeOf; public final class Util { + private static final String REQUIRED_PROPERTY_TEMPLATE = "Required property '%s' missing at %s"; + private static final String UNEXPECTED_NULL_TEMPLATE = "Non-null value '%s' was null at %s"; public static final Set NO_ANNOTATIONS = Collections.emptySet(); public static final Type[] EMPTY_TYPE_ARRAY = new Type[] {}; @Nullable private static final Class DEFAULT_CONSTRUCTOR_MARKER; @@ -619,4 +623,18 @@ public final class Util { } return mask; } + + public static JsonDataException missingProperty(String property, JsonReader reader) { + return jsonDataException(REQUIRED_PROPERTY_TEMPLATE, property, reader); + } + + public static JsonDataException unexpectedNull(String property, JsonReader reader) { + return jsonDataException(UNEXPECTED_NULL_TEMPLATE, property, reader); + } + + private static JsonDataException jsonDataException( + String template, String property, JsonReader reader) { + return new JsonDataException( + String.format(template, property, reader.getPath())); + } }