Skip to content

Commit 84f0e9e

Browse files
committed
Fix #1729. Properly handle type resolving for type parameters.
1 parent 24cf12c commit 84f0e9e

File tree

4 files changed

+52
-2
lines changed

4 files changed

+52
-2
lines changed

moshi-kotlin-codegen/src/main/java/com/squareup/moshi/kotlin/codegen/apt/metadata.kt

+5-1
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,11 @@ private fun resolveTypeArgs(
332332
): TypeName {
333333
val unwrappedType = propertyType.unwrapTypeAlias()
334334

335-
if (unwrappedType !is TypeVariableName) {
335+
if (unwrappedType is ParameterizedTypeName) {
336+
return unwrappedType.copy(typeArguments = unwrappedType.typeArguments.map {
337+
resolveTypeArgs(targetClass, it, resolvedTypes, allowedTypeVars, entryStartIndex)
338+
})
339+
} else if (unwrappedType !is TypeVariableName) {
336340
return unwrappedType
337341
} else if (entryStartIndex == -1) {
338342
return unwrappedType

moshi-kotlin-codegen/src/main/java/com/squareup/moshi/kotlin/codegen/ksp/TargetTypes.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,9 @@ private fun declaredProperties(
228228
val result = mutableMapOf<String, TargetProperty>()
229229
for (property in classDecl.getDeclaredProperties()) {
230230
val initialType = property.type.resolve()
231-
val resolvedType = if (initialType.declaration is KSTypeParameter) {
231+
val resolvedType = if (initialType.declaration is KSTypeParameter ||
232+
initialType.arguments.any { it.type?.resolve()?.declaration is KSTypeParameter }
233+
) {
232234
property.asMemberOf(originalType.asType())
233235
} else {
234236
initialType

moshi-kotlin-codegen/src/test/java/com/squareup/moshi/kotlin/codegen/apt/JsonClassCodegenProcessorTest.kt

+22
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,28 @@ class JsonClassCodegenProcessorTest {
510510
assertThat(result.messages).contains("JsonQualifier @UpperCase must have RUNTIME retention")
511511
}
512512

513+
@Test
514+
fun genericSuperClassPropertyTypeSubstitution() {
515+
val result = compile(
516+
kotlin(
517+
"source.kt",
518+
"""
519+
package test
520+
import com.squareup.moshi.JsonClass
521+
522+
open class GenericSuperClass<T> {
523+
var t: T? = null
524+
var list: List<T>? = null
525+
}
526+
527+
@JsonClass(generateAdapter = true)
528+
class SubClassOfGeneric : GenericSuperClass<String>()
529+
""",
530+
),
531+
)
532+
assertThat(result.exitCode).isEqualTo(KotlinCompilation.ExitCode.OK)
533+
}
534+
513535
@Test
514536
fun `TypeAliases with the same backing type should share the same adapter`() {
515537
val result = compile(

moshi-kotlin-codegen/src/test/java/com/squareup/moshi/kotlin/codegen/ksp/JsonClassSymbolProcessorTest.kt

+22
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,28 @@ class JsonClassSymbolProcessorTest {
557557
assertThat(result.messages).contains("Error preparing ElementEnvelope")
558558
}
559559

560+
@Test
561+
fun genericSuperClassPropertyTypeSubstitution() {
562+
val result = compile(
563+
kotlin(
564+
"source.kt",
565+
"""
566+
package test
567+
import com.squareup.moshi.JsonClass
568+
569+
open class GenericSuperClass<T> {
570+
var t: T? = null
571+
var list: List<T>? = null
572+
}
573+
574+
@JsonClass(generateAdapter = true)
575+
class SubClassOfGeneric : GenericSuperClass<String>()
576+
""",
577+
),
578+
)
579+
assertThat(result.exitCode).isEqualTo(KotlinCompilation.ExitCode.OK)
580+
}
581+
560582
@Test
561583
fun `TypeAliases with the same backing type should share the same adapter`() {
562584
val result = compile(

0 commit comments

Comments
 (0)