การเขียน SymbolProcessor แรกของคุณ
สร้างตัวประมวลผล KSP ที่ค้นหาคลาสซึ่งมีคำอธิบายประกอบและบันทึกคลาสเหล่านั้น
การเขียน SymbolProcessor แรกของคุณ เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
โครงสร้างโครงการ
ตัวประมวลผล KSP อยู่ในโมดูล Gradle แยกต่างหาก เช่น :processor โมดูลที่ใช้งานตัวประมวลผลจะใช้ปลั๊กอิน KSP และประกาศการพึ่งพาแบบ ksp ไปยังโมดูลตัวประมวลผล ส่วนโมดูลตัวประมวลผลเองจะมีการพึ่งพาแบบ implementation ตามปกติไปยัง API ของ KSP
การเพิ่มการพึ่งพา KSP
ในไฟล์ build.gradle.kts ของโมดูลตัวประมวลผล:
plugins { kotlin("jvm") }
dependencies {
implementation("com.google.devtools.ksp:symbol-processing-api:2.0.0-1.0.21")
}อินเทอร์เฟซ SymbolProcessor
ใช้งาน SymbolProcessor จุดเริ่มต้นหลักคือ process(resolver: Resolver): List ให้ส่งคืนสัญลักษณ์ที่ยังประมวลผลไม่ได้ เช่น สัญลักษณ์ที่การพึ่งพายังแก้ไขไม่เสร็จ เพื่อให้ระบบนำไปประมวลผลอีกครั้งในรอบถัดไป
import com.google.devtools.ksp.processing.*
import com.google.devtools.ksp.symbol.*
class MyProcessor(private val logger: KSPLogger,
private val codeGenerator: CodeGenerator) : SymbolProcessor {
override fun process(resolver: Resolver): List<KSAnnotated> {
val symbols = resolver.getSymbolsWithAnnotation("com.example.MyAnnotation")
// process symbols here
return emptyList()
}
}SymbolProcessorProvider
KSP ค้นพบตัวประมวลผลของคุณผ่าน SymbolProcessorProvider ให้ลงทะเบียนใน resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider:
class MyProcessorProvider : SymbolProcessorProvider {
override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor =
MyProcessor(
logger = environment.logger,
codeGenerator = environment.codeGenerator
)
}ไฟล์ลงทะเบียนบริการ
สร้างไฟล์ตามเส้นทางที่ระบุอย่างตรงตัวในโฟลเดอร์ทรัพยากรของโมดูลตัวประมวลผล:
- เส้นทาง:
src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider - เนื้อหา: ชื่อเต็มของคลาส
SymbolProcessorProviderของคุณ
การค้นหาสัญลักษณ์ตามแอนโนเทชัน
ใช้ resolver.getSymbolsWithAnnotation(fqn) เพื่อรับการประกาศทั้งหมดที่มีแอนโนเทชันของคุณ แล้วกรองให้เหลือชนิดการประกาศที่คาดไว้ เช่น การประกาศคลาส:
val classes = resolver
.getSymbolsWithAnnotation("com.example.MyAnnotation")
.filterIsInstance<KSClassDeclaration>()การตรวจสอบสัญลักษณ์
ก่อนประมวลผล ให้ตรวจสอบว่าสัญลักษณ์แต่ละตัวสามารถแก้ไขได้ครบถ้วน สัญลักษณ์ที่การอ้างอิงชนิดข้อมูลยังคอมไพล์ไม่เสร็จถือว่ายังไม่ถูกต้อง ให้ส่งคืนสัญลักษณ์เหล่านี้จาก process() เพื่อให้ลองใหม่ในรอบถัดไป:
val (valid, deferred) = classes.partition { it.validate() }
// process valid; return deferredการเยี่ยมชมการประกาศคลาส
ใช้รูปแบบผู้เยี่ยมชม KSVisitorVoid เพื่อวนสำรวจโครงสร้างของคลาส แทนที่การทำงานของ visitClassDeclaration เพื่อเข้าถึงพร็อพเพอร์ตี ฟังก์ชัน และคลาสซ้อน:
class MyVisitor : KSVisitorVoid() {
override fun visitClassDeclaration(classDeclaration: KSClassDeclaration, data: Unit) {
val name = classDeclaration.simpleName.asString()
val props = classDeclaration.getAllProperties().toList()
println("Class: $name, props: ${props.size}")
}
}การบันทึกข้อความจากตัวประมวลผล
ใช้ KSPLogger เพื่อส่งข้อความในระดับต่าง ๆ logger.error() จะทำให้การสร้างล้มเหลว logger.warn() จะแสดงคำเตือน และ logger.info() จะแสดงข้อความให้ข้อมูลที่มองเห็นได้เมื่อใช้ --info
logger.info("Processing class: ${classDeclaration.simpleName.asString()}")
logger.error("Missing required annotation", classDeclaration)การเข้าถึงแอนโนเทชันบนสัญลักษณ์
KSDeclaration แต่ละตัวมีลำดับ annotations ให้ใช้ filter และ arguments เพื่ออ่านค่าของแอนโนเทชัน:
val ann = classDeclaration.annotations
.first { it.shortName.asString() == "MyAnnotation" }
val value = ann.arguments.first { it.name?.asString() == "value" }.value as Stringคำแนะนำสำหรับการประมวลผลแบบเพิ่มทีละส่วน
ระบุให้ KSP ทราบว่าไฟล์เอาต์พุตใดขึ้นอยู่กับสัญลักษณ์อินพุตใด โดยเชื่อมโยงทั้งสองผ่าน CodeGenerator.createNewFile(dependencies = ...) วิธีนี้ช่วยให้ KSP ข้ามตัวประมวลผลของคุณได้เมื่อไม่มีอินพุตใดเปลี่ยนแปลง
ตรวจสอบความเข้าใจ
KSP ค้นพบการใช้งาน SymbolProcessorProvider ของคุณได้อย่างไร
สรุป: การเขียน SymbolProcessor ตัวแรก
ประเด็นสำคัญ:
- ใช้งาน
SymbolProcessorและSymbolProcessorProviderในโมดูลแยกต่างหาก - ลงทะเบียนตัวให้บริการผ่าน
META-INF/services/ - ใช้
resolver.getSymbolsWithAnnotation()เพื่อค้นหาสัญลักษณ์ที่มีแอนโนเทชัน - ตรวจสอบสัญลักษณ์ก่อนประมวลผล และส่งคืนสัญลักษณ์ที่ยังแก้ไขไม่ได้เพื่อลองใหม่
- ใช้
KSPLoggerสำหรับข้อความขณะสร้าง และใช้CodeGeneratorเพื่อเขียนไฟล์
คำถามที่พบบ่อย
บทเรียน “การเขียน SymbolProcessor แรกของคุณ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การเขียน SymbolProcessor แรกของคุณ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การเขียน SymbolProcessor แรกของคุณ”
สร้างตัวประมวลผล KSP ที่ค้นหาคลาสซึ่งมีคำอธิบายประกอบและบันทึกคลาสเหล่านั้น คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การเขียน SymbolProcessor แรกของคุณ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม
ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- KSP กับ KAPT: เหตุใด KSP จึงเร็วกว่า
- การเขียน SymbolProcessor แรกของคุณ
- การสร้างซอร์สไฟล์ Kotlin ด้วย KotlinPoet
- ผสานตัวประมวลผล KSP เข้ากับบิลด์ Gradle