Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

@takuji31 (Takuji Nishibayashi) Application Engineer at Hatena

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

AGENDA • Pluggable Annotation Processing • KotlinPoet

Slide 5

Slide 5 text

Pluggable Annotation Processing

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

APT͸Deprecatedʹͳ͍ͬͯΔ

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

Data Binding

Slide 11

Slide 11 text

Dagger2

Slide 12

Slide 12 text

ButterKnife

Slide 13

Slide 13 text

etc.

Slide 14

Slide 14 text

࢖͍ํ

Slide 15

Slide 15 text

࢖͍ํ ࡞Γํ

Slide 16

Slide 16 text

AbstractAnnotationProcessorΛ ܧঝ

Slide 17

Slide 17 text

processΛ࣮૷

Slide 18

Slide 18 text

ྫ // ιʔείʔυͷόʔδϣϯ @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 } }

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

େࣄͳ͜ͱͰ͢Ͷ

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

͔͠͠खͰॻ͘ͷ͸໘౗

Slide 24

Slide 24 text

KotlinPoet

Slide 25

Slide 25 text

JavaPoetͷKotlin൛

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

ίʔυੜ੒ͯ͠ΈΔ

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

!

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

ॻ͖ग़͢ 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))

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

Javaͷ࣌ͱҧ͏ͷͰཁ஫ҙ

Slide 40

Slide 40 text

Annotation Processor࡞ͬͨ

Slide 41

Slide 41 text

R.kt

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

Πϝʔδ 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 } }

Slide 44

Slide 44 text

takuji31/R.kt

Slide 45

Slide 45 text

ࠓ͸·ͩಈ͔ͳ͍ !

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

1.2Ͱ௚ΔͬΆ͍…ʁ

Slide 49

Slide 49 text

Enjoy Annotation Processing !