override fun generateConstructorsFor()

in buildSrc/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)
        }
  }