in artist-core/src/main/kotlin/com/uber/artist/KotlinArtistCodeGenerator.kt [102:149]
override fun generateConstructorsFor(stencil: KotlinViewStencil, type: TypeSpec.Builder, rClass: ClassName) {
val paramContext = ParameterSpec.builder("context", KotlinTypeNames.Android.Context)
.build()
val paramAttrs = ParameterSpec.builder("attrs", KotlinTypeNames.Android.AttributeSet.copy(nullable = true))
.defaultValue("null")
.build()
val paramDefStyleAttr = ParameterSpec.builder("defStyleAttr", INT)
.addAnnotation(KotlinTypeNames.Annotations.AttrRes)
.defaultValue(stencil.defaultAttrRes?.let {
if ("." in it) {
CodeBlock.of(it)
} else {
CodeBlock.of("%T.attr.$it", rClass)
}
} ?: CodeBlock.of("0")
)
.build()
val paramDefStyleRes = ParameterSpec.builder("defStyleRes", INT)
.addAnnotation(KotlinTypeNames.Annotations.StyleRes)
.defaultValue("0")
.build()
val params = listOf(paramContext, paramAttrs, paramDefStyleAttr, paramDefStyleRes)
val superConstructorArgs = listOf("context", "attrs", "defStyleAttr", "defStyleRes")
val ctorOverloadsCount = stencil.constructorCount.coerceAtMost(3)
val overloadsConstructor = FunSpec.constructorBuilder()
.addAnnotation(JvmOverloads::class)
.addParameters(params.subList(0, ctorOverloadsCount))
.callSuperConstructor(*superConstructorArgs.subList(0, ctorOverloadsCount).toTypedArray())
.addStatement(initStatement(ctorOverloadsCount))
.build()
val targetApiConstructor = FunSpec.constructorBuilder()
.addAnnotation(AnnotationSpec.builder(KotlinTypeNames.Annotations.TargetApi)
.addMember("%T.VERSION_CODES.LOLLIPOP", ClassName("android.os", "Build"))
.build())
.addParameters(params)
.callSuperConstructor(*superConstructorArgs.toTypedArray())
.addStatement(initStatement(4))
.build()
type
.addFunction(overloadsConstructor)
.apply {
if (stencil.constructorCount > 3) addFunction(targetApiConstructor)
}
}