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 a5dbbdd..ac76ae8 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 @@ -49,7 +49,7 @@ internal class AdapterGenerator( ) { private val className = target.name private val isDataClass = target.proto.isDataClass - private val hasCompanionObject = target.hasCompanionObject + private val companionObjectName = target.companionObjectName private val visibility = target.proto.visibility!! private val typeVariables = target.typeVariables @@ -94,8 +94,8 @@ internal class AdapterGenerator( val result = FileSpec.builder(className.packageName(), adapterName) result.addComment("Code generated by moshi-kotlin-codegen. Do not edit.") - if (hasCompanionObject) { - result.addFunction(generateJsonAdapterFun()) + companionObjectName?.let { + result.addFunction(generateJsonAdapterFun(it)) } result.addType(generateType(messager, generatedOption)) return result.build() @@ -312,7 +312,7 @@ internal class AdapterGenerator( return result.build() } - private fun generateJsonAdapterFun(): FunSpec { + private fun generateJsonAdapterFun(name: String): FunSpec { val rawType = when (originalTypeName) { is TypeVariableName -> throw IllegalArgumentException("Cannot get raw type of TypeVariable!") is ParameterizedTypeName -> originalTypeName.rawType @@ -320,7 +320,7 @@ internal class AdapterGenerator( } val result = FunSpec.builder("jsonAdapter") - .receiver(rawType.nestedClass("Companion")) + .receiver(rawType.nestedClass(name)) .returns(jsonAdapterTypeName) .addParameter(moshiParam) diff --git a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/TargetType.kt b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/TargetType.kt index c354bff..3a9aa47 100644 --- a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/TargetType.kt +++ b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/TargetType.kt @@ -53,10 +53,10 @@ internal data class TargetType( val element: TypeElement, val constructor: TargetConstructor, val properties: Map, - val typeVariables: List + val typeVariables: List, + val companionObjectName: String? ) { val name = element.className - val hasCompanionObject = proto.hasCompanionObjectName() companion object { private val OBJECT_CLASS = ClassName("java.lang", "Object") @@ -129,7 +129,12 @@ internal data class TargetType( properties.putIfAbsent(name, property) } } - return TargetType(proto, element, constructor, properties, typeVariables) + val companionObjectName = if (proto.hasCompanionObjectName()) { + typeMetadata.data.nameResolver.getQualifiedClassName(proto.companionObjectName) + } else { + null + } + return TargetType(proto, element, constructor, properties, typeVariables, companionObjectName) } /** Returns the properties declared by `typeElement`. */ diff --git a/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/codgen/GeneratedAdaptersTest.kt b/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/codgen/GeneratedAdaptersTest.kt index b332516..5d582c0 100644 --- a/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/codgen/GeneratedAdaptersTest.kt +++ b/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/codgen/GeneratedAdaptersTest.kt @@ -786,6 +786,22 @@ class GeneratedAdaptersTest { @JsonClass(generateAdapter = true) class DuplicateValue(var a: Int = -1, var b: Int = -2) + @Test fun companionObjectsTests() { + val moshi = Moshi.Builder().build() + val standardAdapter = CompanionObjectClass.jsonAdapter(moshi) + val customNameAdapter = NamedCompanionObjectClass.jsonAdapter(moshi) + } + + @JsonClass(generateAdapter = true) + data class CompanionObjectClass(val foo: String) { + companion object + } + + @JsonClass(generateAdapter = true) + data class NamedCompanionObjectClass(val foo: String) { + companion object CustomCompanionObject + } + @JsonQualifier annotation class Uppercase(val inFrench: Boolean, val onSundays: Boolean = false)