KSP processor
- Kotlin kursu
- Uzman
- Ders 8/47
- 5 dk
KSP processor yazmayı öğrenirsin.
Bir processor nasıl yazılır?
Bir KSP processor yazmak için SymbolProcessorProvider ile işleyiciyi sunarsın. Sağlayıcı (provider), create(environment) metoduyla processor örneği üretir.
İşleyici process(resolver) içinde annotation'lı sembolleri bulur ve işler. Her sembol için tipik olarak: resolver.getSymbolsWithAnnotation("Entity") çağrılır, sonuç bir liste toplanır, her birinden Kotlin kodu üretilir ve codeGenerator'e yazılır. Bu derste basit bir EntityProcessor yazacaksın; gerçek codegen yerine kabul edilen sembolleri loglayacak.
Sembol filtreleme
Bir processor nadiren tüm sembolleri işler; genellikle belirli bir annotation'a sahip olanları seçer. Buna sembol filtreleme denir.
Örnek: symbols.filter { it.startsWith("Entity") }.forEach { ... }. Burada filter ile yalnızca Entity ile başlayanlar alınır; forEach ile her biri için bir işlem yapılır. Gerçek KSP'de bu filtre getSymbolsWithAnnotation ile yapılır; bu derste basit bir List<String> üzerinde gösteriyoruz. Filtreleme, processor'ın yalnızca ilgili sembollerle uğraşmasını sağlar.
Uygulama EntityProcessor yaz
EntityProcessor sınıfı tanımla. fun process(symbols: List<String>) metodu, symbols listesinde filter { it.startsWith("Entity") } yapsın ve her biri için println("processed: $it") çağrısı yapsın. main içinde listOf("Entity:User", "Plain", "Entity:Order") ile çağır.
Başlangıç kodu
// EntityProcessor sınıfını ekle
fun main() {
EntityProcessor().process(listOf("Entity:User", "Plain", "Entity:Order"))
}Örnek çözüm
class EntityProcessor {
fun process(symbols: List<String>) {
symbols.filter { it.startsWith("Entity") }.forEach { println("processed: $it") }
}
}
fun main() {
EntityProcessor().process(listOf("Entity:User", "Plain", "Entity:Order"))
}Beklenen çıktı
processed: Entity:User processed: Entity:Order
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 process metodunu çağır
fun main() {
val p = EntityProcessor()
p.____(listOf("User", "Order"))
}
fun main() {
val p = EntityProcessor()
p.process(listOf("User", "Order"))
}
Açıklama: processor.process(...) ile semboller işlenir.
2 Processor adımlarını eşle
| Kavram | Anlamı |
|---|---|
getSymbolsWithAnnotation |
Sembol bulma |
filter |
Sembol süzme |
forEach |
Her birini işleme |
codeGenerator |
Kod yazma |
3 Bir processor sembolleri nasıl bulur?
- Rastgele liste tarayarak
- HTTP isteği atarak
- getSymbolsWithAnnotation ile Doğru cevap
- Reflection ile runtime'da
Açıklama: getSymbolsWithAnnotation ile ilgili semboller derleme zamanında bulunur.