Быстрый старт KSP
Для быстрого старта вы можете создать свой собственный процессор или взять образец.
Создание собственного процессора
Создайте пустой проект gradle.
Укажите версию
1.8.0плагина Kotlin в корневом проекте для использования в других модулях проекта:
plugins {
kotlin("jvm") version "1.8.0" apply false
}
buildscript {
dependencies {
classpath(kotlin("gradle-plugin", version = "1.8.0"))
}
}
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.8.0' apply false
}
buildscript {
dependencies {
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0'
}
}
Добавьте модуль для размещения процессора.
В скрипте сборки модуля примените плагин Kotlin и добавьте API KSP в блок
dependencies.
plugins {
kotlin("jvm")
}
repositories {
mavenCentral()
}
dependencies {
implementation("com.google.devtools.ksp:symbol-processing-api:1.8.0-1.0.8")
}
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.8.0'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'com.google.devtools.ksp:symbol-processing-api:1.8.0-1.0.8'
}
-
Вам нужно будет реализовать
com.google.devtools.ksp.processing.SymbolProcessorиcom.google.devtools.ksp.processing.SymbolProcessorProvider. Ваша реализацияSymbolProcessorProviderбудет загружена как служба для создания экземпляра реализованного вамиSymbolProcessor. Обратите внимание на следующее:Реализуйте
SymbolProcessorProvider.create(), чтобы создатьSymbolProcessor. Передавайте зависимости, необходимые вашему процессору (например,CodeGenerator, параметры процессора) через параметрыSymbolProcessorProvider.create().Основная логика должна находиться в методе
SymbolProcessor.process().Используйте
resolver.getSymbolsWithAnnotation()для получения символов, которые вы хотите обработать, зная полное имя аннотации.Распространенный случай использования KSP — реализация настраиваемого посетителя (интерфейс
com.google.devtools.ksp.symbol.KSVisitor) для работы со символами. Простой шаблон посетителя —com.google.devtools.ksp.symbol.KSDefaultVisitor.-
Для примеров реализации интерфейсов
SymbolProcessorProviderиSymbolProcessorсм. следующие файлы в образце проекта.src/main/kotlin/BuilderProcessor.ktsrc/main/kotlin/TestProcessor.kt
После написания собственного процессора зарегистрируйте свой процессор-поставщик в пакете, включив его полное имя в
resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider.
Использование собственного процессора в проекте
Создайте другой модуль, содержащий рабочую нагрузку, где вы хотите опробовать свой процессор.
pluginManagement {
repositories {
gradlePluginPortal()
}
}
pluginManagement {
repositories {
gradlePluginPortal()
}
}
В скрипте сборки модуля примените плагин
com.google.devtools.kspсо специфицированной версией и добавьте свой процессор в список зависимостей.
plugins {
id("com.google.devtools.ksp") version "1.8.0-1.0.8"
}
dependencies {
implementation(kotlin("stdlib-jdk8"))
implementation(project(":test-processor"))
ksp(project(":test-processor"))
}
plugins {
id 'com.google.devtools.ksp' version '1.8.0-1.0.8'
}
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version'
implementation project(':test-processor')
ksp project(':test-processor')
}
Запустите
./gradlew build. Сгенерированный код вы найдете вbuild/generated/source/ksp.
Вот пример скрипта сборки для применения плагина KSP к рабочей нагрузке:
plugins {
id("com.google.devtools.ksp") version "1.8.0-1.0.8"
kotlin("jvm")
}
repositories {
mavenCentral()
}
dependencies {
implementation(kotlin("stdlib-jdk8"))
implementation(project(":test-processor"))
ksp(project(":test-processor"))
}
plugins {
id 'com.google.devtools.ksp' version '1.8.0-1.0.8'
id 'org.jetbrains.kotlin.jvm' version '1.8.0'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.8.0'
implementation project(':test-processor')
ksp project(':test-processor')
}
Передача параметров процессорам
Параметры процессора в SymbolProcessorEnvironment.options указываются в скриптах gradle:
ksp {
arg("option1", "value1")
arg("option2", "value2")
...
}
Информирование IDE о сгенерированном коде
По умолчанию IntelliJ IDEA или другие IDE не знают о сгенерированном коде. Поэтому ссылки на сгенерированные символы будут помечены как неразрешимые. Чтобы IDE могла работать с сгенерированными символами, пометьте следующие пути как корни сгенерированных исходников:
build/generated/ksp/main/kotlin/ build/generated/ksp/main/java/
Если ваша IDE поддерживает каталоги ресурсов, также отметьте следующие:
build/generated/ksp/main/resources/
Также может потребоваться настройка этих каталогов в скрипте сборки модуля-потребителя KSP:
kotlin {
sourceSets.main {
kotlin.srcDir("build/generated/ksp/main/kotlin")
}
sourceSets.test {
kotlin.srcDir("build/generated/ksp/test/kotlin")
}
}
kotlin {
sourceSets {
main.kotlin.srcDirs += 'build/generated/ksp/main/kotlin'
test.kotlin.srcDirs += 'build/generated/ksp/test/kotlin'
}
}
Если вы используете IntelliJ IDEA и KSP в плагине Gradle, то вышеприведенный фрагмент выдаст следующее предупреждение:
Execution optimizations have been disabled for task ':publishPluginJar' to ensure correctness due to the following reasons: Gradle detected a problem with the following location: '../build/generated/ksp/main/kotlin'. Reason: Task ':publishPluginJar' uses this output of task ':kspKotlin' without declaring an explicit or implicit dependency.
В этом случае используйте следующий скрипт:
plugins {
// ...
idea
}
idea {
module {
// Not using += due to https://github.com/gradle/gradle/issues/8749
sourceDirs = sourceDirs + file("build/generated/ksp/main/kotlin") // or tasks["kspKotlin"].destination
testSourceDirs = testSourceDirs + file("build/generated/ksp/test/kotlin")
generatedSourceDirs = generatedSourceDirs + file("build/generated/ksp/main/kotlin") + file("build/generated/ksp/test/kotlin")
}
}
plugins {
// ...
id 'idea'
}
idea {
module {
// Not using += due to https://github.com/gradle/gradle/issues/8749
sourceDirs = sourceDirs + file('build/generated/ksp/main/kotlin') // or tasks["kspKotlin"].destination
testSourceDirs = testSourceDirs + file('build/generated/ksp/test/kotlin')
generatedSourceDirs = generatedSourceDirs + file('build/generated/ksp/main/kotlin') + file('build/generated/ksp/test/kotlin')
}
}
© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/ksp-quickstart.html