JsonToKotlinClass icon indicating copy to clipboard operation
JsonToKotlinClass copied to clipboard

Class names duplicated when generating models in single file

Open matteo-bloomandwild opened this issue 2 years ago • 1 comments

Hello, I used to use this plugin by letting it generate all models in one kotlin file, which worked great until I had to serialise a json that contains multiple fields named data, which results in multiple inner classes of the same name.

@JsonClass(generateAdapter = true)
data class Test(
  @Json(name = "data")
  val `data`: List<Data?>? = null,
  ...
) {
  @JsonClass(generateAdapter = true)
  data class Data(
    ...
  ) {
    ...
  
      @JsonClass(generateAdapter = true)
      data class SomeInnerClass(
        @Json(name = "data")
        val `data`: Data? = null
      ) {
        @JsonClass(generateAdapter = true)
        data class Data(
          ...
        )
      }
      ...

While the generated file passes the IDE's compile-checks, because the kotlin compiler is smart enough to apply the correct scope of each subclass, the kapt processor explodes.

Caused by: java.lang.IllegalStateException: No type element found for: <my.class.package>.Data.
	at com.squareup.moshi.kotlinpoet.metadata.classinspectors.ElementsClassInspector.declarationContainerFor(ElementsClassInspector.kt:115)
	at com.squareup.moshi.kotlinpoet.metadata.specs.ClassInspectorKt.classFor(ClassInspector.kt:112)
	at com.squareup.moshi.kotlinpoet.metadata.specs.KotlinPoetMetadataSpecs.toTypeSpec(KotlinPoetMetadataSpecs.kt:470)
	at com.squareup.moshi.kotlinpoet.metadata.specs.KotlinPoetMetadataSpecs.toTypeSpec(KotlinPoetMetadataSpecs.kt:476)
	at com.squareup.moshi.kotlinpoet.metadata.specs.KotlinPoetMetadataSpecs.toTypeSpec(KotlinPoetMetadataSpecs.kt:476)
	at com.squareup.moshi.kotlinpoet.metadata.specs.KotlinPoetMetadataSpecs.toTypeSpec(KotlinPoetMetadataSpecs.kt:476)
	at com.squareup.moshi.kotlinpoet.metadata.specs.KotlinPoetMetadataSpecs.toTypeSpec(KotlinPoetMetadataSpecs.kt:182)
	at com.squareup.moshi.kotlinpoet.metadata.specs.KotlinPoetMetadataSpecs.toTypeSpec$default(KotlinPoetMetadataSpecs.kt:178)
	at com.squareup.moshi.kotlin.codegen.apt.MoshiCachedClassInspector.toTypeSpec(MoshiCachedClassInspector.kt:47)
	at com.squareup.moshi.kotlin.codegen.apt.MetadataKt.targetType(metadata.kt:205)
	at com.squareup.moshi.kotlin.codegen.apt.JsonClassCodegenProcessor.adapterGenerator(JsonClassCodegenProcessor.kt:141)
	at com.squareup.moshi.kotlin.codegen.apt.JsonClassCodegenProcessor.process(JsonClassCodegenProcessor.kt:107)
	at org.jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor.process(incrementalProcessors.kt:90)
	at org.jetbrains.kotlin.kapt3.base.ProcessorWrapper.process(annotationProcessing.kt:197)
	at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:985)
	... 44 more

When generating from the same json but allowing multiple files, the duplicated classes are renamed appending an increasing number of X, which works great with kapt but forces me to have hundreds of files, which is not ideal.

Is there any workaround for this so far, or would it be possible in the future to force the plugin to append the Xs to duplicated class names even when using a single file?

matteo-bloomandwild avatar Jan 10 '23 17:01 matteo-bloomandwild

Maybe can force or wait for the apt to support this case as this code is legally, is it?😆

wuseal avatar Feb 11 '23 12:02 wuseal