0Pricing
Kotlin Academy · บทเรียน

การเขียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. KSP กับ KAPT: เหตุใด KSP จึงเร็วกว่า
  2. การเขียน SymbolProcessor แรกของคุณ
  3. การสร้างซอร์สไฟล์ Kotlin ด้วย KotlinPoet
  4. ผสานตัวประมวลผล KSP เข้ากับบิลด์ Gradle
← กลับไปที่ Kotlin Academy