CodeBlanks Logo Icon CodeBlanks

Compiler plugin

Kotlin compiler plugin kavramını öğrenirsin.

Compiler plugin nedir?

Bir compiler plugin, Kotlin derleyicisinin içine kanca (hook) atan eklentidir; derleme sırasında kodu dönüştürebilir. KSP'den farklı olarak tüm AST'ye erişir.

Eklenti, derleme aşamasında sınıfları open yapabilir, sentetik kurucu ekleyebilir ya da IR'yi (Intermediate Representation) dönüştürebilir. Kotlin 2.x'te tüm resmi plugin'ler üzerinden çalışır: all-open, no-arg, compose ve kotlinx.serialization. Eklenti Gradle'da compilerPlugin bağımlılığı ile eklenir; çıktı değişmiş bytecode olur. Bu derste temel eklenti iskeletini kuracaksın.

Eklenti yaşam döngüsü

Bir compiler plugin, derleme yaşam döngüsünde belli aşamalara kanca atar: Frontend (parsing ve çözümleme), IR (ara sunum) ve Backend (code generation).

Örnek: all-open plugin'i frontend aşamasında belirli annotation'lara sahip sınıfları open yapar. compose plugin'i IR aşamasında @Composable fonksiyonları dönüştürür. Her aşamanın kendine özgü API'leri vardır; en yaygın olanı IR'dir. Bir eklenti yazmak için ComponentRegistrar arabirimi uygulanır ve ilgili aşamaya kanca atan bir extension kaydedilir.

Uygulama CompilerPlugin iskeleti yaz

CompilerPlugin sınıfı tanımla. fun load() metodu println("plugin loaded") çağrısı yapsın. main içinde CompilerPlugin().load() ile çağır.

Başlangıç kodu

Main.kt
// CompilerPlugin sınıfını ekle

fun main() {
    // eklentiyi yükle
}

Örnek çözüm

Main.kt
class CompilerPlugin {
    fun load() {
        println("plugin loaded")
    }
}
fun main() {
    CompilerPlugin().load()
}

Beklenen çıktı

plugin loaded

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bir compiler plugin neye erişebilir?

  • Yalnızca annotation'lara
  • Sadece çalışma zamanı verisine
  • Tüm AST'ye Doğru cevap
  • Yalnızca kaynak dosya adına

Açıklama: Compiler plugin tüm AST'ye erişir; KSP yalnızca sembolleri görür.

2 load metodunu tamamla

Soru
class CompilerPlugin {
    fun ____() {
        println("plugin loaded")
    }
}
Cevap
class CompilerPlugin {
    fun load() {
        println("plugin loaded")
    }
}

Açıklama: load() metodu eklenti başlatma noktasıdır.

3 Eklenti parçalarını eşle

Kavram Anlamı
ComponentRegistrar Eklenti kaydı
extension Aşama kancası
frontend Parsing ve çözümleme
backend Code generation

Uzman bölümündeki tüm dersler