Spec-Zone.ru › Kotlin 1.8

Быстрый старт KSP

Для быстрого старта вы можете создать свой собственный процессор или взять образец.

Создание собственного процессора

  1. Создайте пустой проект gradle.

  2. Укажите версию 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'
    }
}
  1. Добавьте модуль для размещения процессора.

  2. В скрипте сборки модуля примените плагин 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'
}
  1. Вам нужно будет реализовать 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.kt

      • src/main/kotlin/TestProcessor.kt

    • После написания собственного процессора зарегистрируйте свой процессор-поставщик в пакете, включив его полное имя в resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider.

Использование собственного процессора в проекте

  1. Создайте другой модуль, содержащий рабочую нагрузку, где вы хотите опробовать свой процессор.

pluginManagement { 
    repositories { 
        gradlePluginPortal()
    }
}
pluginManagement {
    repositories {
        gradlePluginPortal()
    }
}
  1. В скрипте сборки модуля примените плагин 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')
}
  1. Запустите ./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')
   }
}
Последнее изменение: 10 января 2023
API обработки символов Kotlin Почему KSP

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API