airbnb / airbnb/epoxy

EpoxyModelWithHolder with generics in Kotlin results in `caused by IllegalArgumentException: T has no bounds`

Open
#855 5 comments 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
8.6k
Forks
734
PR merge metrics
No merged PRs in 30d

Description

Hi,

On Epoxy 3.x I encounter following error:

```
error: Epoxy Processor Exception: Caused by IllegalArgumentException: T has no bounds Stacktrace: com.airbnb.epoxy.PoetExtensionsKt.toKPoet(PoetExtensions.kt:161) com.airbnb.epoxy.PoetExtensionsKt.toKPoet(PoetExtensions.kt:181) com.airbnb.epoxy.PoetExtensionsKt.toKPoet$default(PoetExtensions.kt:166) com.airbnb.epoxy.PoetExtensionsKt.toKPoet(PoetExtensions.kt:193) com.airbnb.epoxy.PoetExtensionsKt.toKPoet(PoetExtensions.kt:133) com.airbnb.epoxy.PoetExtensionsKt.toKPoet(PoetExtensions.kt:179) com.airbnb.epoxy.PoetExtensionsKt.toKPoet$default(PoetExtensions.kt:166) com.airbnb.epoxy.KotlinModelBuilderExtensionWriter.buildExtensionsForModel(KotlinModelBuilderExtensionWriter.kt:97) com.airbnb.epoxy.KotlinModelBuilderExtensionWriter.buildExtensionFile(KotlinModelBuilderExtensionWriter.kt:66) com.airbnb.epoxy.KotlinModelBuilderExtensionWriter.generateExtensionsForModels(KotlinModelBuilderExtensionWriter.kt:41) com.airbnb.epoxy.EpoxyProcessor.processRound(EpoxyProcessor.java:204) com.airbnb.epoxy.EpoxyProcessor.process(EpoxyProcessor.java:170)
```

When trying to generate the classes from following setup:

```

@EpoxyModelClass(layout = R.layout.dropdown_layout)
abstract class DropdownEpoxyModel : EpoxyModelWithHolder>() {
@EpoxyAttribute
lateinit var values: List>

@EpoxyAttribute
var selectedValue: T? = null

@EpoxyAttribute(DoNotHash)
var onSelected: ((T) -> Unit)? = null

override fun bind(holder: Holder) {

}
}

class Holder : EpoxyHolder() {

override fun bindView(itemView: View) {

}
}
```

Worth saying is that same code works fine with `2.19.0`.
Gradle version used: 5.6.3
Can you point me what is solution to make this code working on `3.x` version?

Contributor guide

Open the contributing guide

Research direction

Start with the generic reproducer in the issue and inspect PoetExtensions.kt at line 161, following the toKPoet calls in the stack trace. Then trace KotlinModelBuilderExtensionWriter.kt, especially lines 66 and 97, while running annotation processing on the shown EpoxyModelWithHolder setup. Done means Epoxy 3.x processes the model with unbounded T and generates the classes without the IllegalArgumentException.

Written by the indexing model from the issue text.

Assessment

Tech stack
kotlin
Domain
mobile-dev
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.