$30 off During Our Annual Pro Sale. View Details »

KanmobaInKanto

 KanmobaInKanto

Takuji Nishibayashi

November 21, 2017
Tweet

More Decks by Takuji Nishibayashi

Other Decks in Technology

Transcript

  1. Pluggable Annotation ProcessingͰ
    KotlinͷίʔυΛੜ੒͢Δ
    ؔϞό in ؔ౦
    @takuji31

    View Slide

  2. @takuji31
    (Takuji Nishibayashi)
    Application Engineer at Hatena

    View Slide

  3. Loves
    • ! (AVG 175)
    • " #
    • http://photo.takuji31.jp
    • $
    • http://nazuna.takuji31.jp
    • Android
    • Kotlin

    View Slide

  4. AGENDA
    • Pluggable Annotation Processing
    • KotlinPoet

    View Slide

  5. Pluggable
    Annotation
    Processing

    View Slide

  6. JavaͰιʔείʔυʹ෇༩͞Εͨ஫
    ऍΛղऍͯ͠ɺιʔείʔυΛੜ੒
    ͢Δ࢓૊Έ

    View Slide

  7. Α͘APTͬͯݺͿ(ݺͼؒҧ͑ΒΕ
    Δ΍ͭ)Ͱ͢Ͷ

    View Slide

  8. APT͸Deprecatedʹͳ͍ͬͯΔ

    View Slide

  9. Pluggable Annotation Processiong
    ͱͪΌΜͱݺͼ·͠ΐ͏

    View Slide

  10. Data Binding

    View Slide

  11. Dagger2

    View Slide

  12. ButterKnife

    View Slide

  13. etc.

    View Slide

  14. ࢖͍ํ

    View Slide

  15. ࢖͍ํ ࡞Γํ

    View Slide

  16. AbstractAnnotationProcessorΛ
    ܧঝ

    View Slide

  17. processΛ࣮૷

    View Slide


  18. // ιʔείʔυͷόʔδϣϯ
    @SupportedSourceVersion(SourceVersion.RELEASE_8)
    // ॲཧ͢ΔΞϊςʔγϣϯͷҰཡ
    @SupportedAnnotationTypes("jp.takuji31.annotations.SomeAnnotation")
    // αϙʔτ͢ΔΦϓγϣϯ
    @SupportedOptions("kapt.kotlin.generated")
    class ExampleProcessor : AbstractProcessor() {
    override fun process(annotations: MutableSet, roundEnv: RoundEnvironment): Boolean {
    // do something
    return true
    }
    }

    View Slide

  19. ࣮͸Kotlinͷ
    ίʔυ΋ੜ੒Ͱ͖Δ

    View Slide

  20. Kotlin
    ͷίʔυ΋ੜ੒Ͱ͖Δʂ

    View Slide

  21. େࣄͳ͜ͱͰ͢Ͷ

    View Slide

  22. ੜ੒͢Δίʔυ΋Kotlinʹ͍ͨ͠

    View Slide

  23. ͔͠͠खͰॻ͘ͷ͸໘౗

    View Slide

  24. KotlinPoet

    View Slide

  25. JavaPoetͷKotlin൛

    View Slide

  26. https://github.com/square/
    kotlinpoet/

    View Slide

  27. ίʔυੜ੒ͯ͠ΈΔ

    View Slide

  28. ΫϥεΛ࡞Δ
    val packageName = "jp.takuji31.kanmoba"
    val userClassName = ClassName(packageName = packageName, simpleName = "User")
    val userClass = TypeSpec
    .classBuilder(userClassName)
    .addModifiers(KModifier.DATA)
    .build()

    View Slide

  29. ίϯετϥΫλʔΛఆٛ
    val userClass = TypeSpec
    .classBuilder(userClassName)
    .primaryConstructor(
    FunSpec
    .constructorBuilder()
    .addParameter(ParameterSpec
    .builder("id", Int::class)
    .build()
    )
    .addParameter(ParameterSpec
    .builder("name", String::class)
    .build()
    )
    .build()
    )
    .build()

    View Slide

  30. ϓϩύςΟʔΛఆٛ
    val userClass = TypeSpec
    .classBuilder(userClassName)
    .addProperty(
    PropertySpec
    .builder("id", Int::class)
    .initializer("id")
    .build()
    )
    .addProperty(
    PropertySpec
    .builder("name", String::class)
    .initializer("name")
    .build()
    )
    .build()

    View Slide

  31. ग़ྗ
    val kotlinFile = KotlinFile.builder(packageName, "User")
    .addType(userClass)
    .build()
    print(kotlinFile.toString())

    View Slide

  32. ݁Ռ
    package jp.takuji31.kanmoba
    import kotlin.Int
    import kotlin.String
    data class User(val id: Int, val name: String)

    View Slide

  33. !

    View Slide

  34. ͜ΕΛAnnotation Processor্Ͱ࣮
    ߦͯ͠΍Ε͹Α͍

    View Slide

  35. Ͳ͏΍ͬͯॻ͖ग़͢ͷ͔ʁ

    View Slide

  36. ॻ͖ग़͢
    val generatedDir = processingEnv.options["kapt.kotlin.generated"]
    ?: throw IllegalStateException("Needs kapt support.")
    KotlinFile.builder(packageName = packageName, fileName = "User")
    .addType(userClass.build())
    .build()
    .writeTo(File(generatedDir))

    View Slide

  37. kaptͷ࣮ߦޙʹίϯύΠϧ͞ΕΔ

    View Slide

  38. ※ ੜ੒͞ΕͨΫϥεΛ
    ࠶౓ॲཧͰ͖ͳ͍

    View Slide

  39. Javaͷ࣌ͱҧ͏ͷͰཁ஫ҙ

    View Slide

  40. Annotation Processor࡞ͬͨ

    View Slide

  41. R.kt

    View Slide

  42. Android͕ੜ੒͢ΔR.javaͷ͍͢͝
    ΍ͭ

    View Slide

  43. Πϝʔδ
    class MainActivity() : Activity() {
    val R by lazy { RKt(context = this) }
    fun onCreate(savedInstanceState: Bundle?) {
    // ic_launcher.png
    val icon: Drawable = R.drawable.ic_launcher.asDrawable()
    // Hello %1$s
    val message: String = R.string.welcome_message.format("Kanmoba") // Hello Kanmoba
    }
    }

    View Slide

  44. takuji31/R.kt

    View Slide

  45. ࠓ͸·ͩಈ͔ͳ͍ !

    View Slide

  46. ੜ੒͞ΕͨίʔυΛIDE͕ೝࣝͰ͖
    ͳ͍

    View Slide

  47. https://youtrack.jetbrains.com/
    issue/KT-20269

    View Slide

  48. 1.2Ͱ௚ΔͬΆ͍…ʁ

    View Slide

  49. Enjoy Annotation Processing !

    View Slide