blob: 5f3063279f75cd24d145904738f3ca36e5f0b7ee [file] [log] [blame] [view]
# Quickstart
[Here's](https://github.com/google/ksp/releases/download/1.5.30-1.0.0-beta08/playground.zip) a sample processor that you can check out.
## Create a processor of your own
* Create an empty gradle project.
* Specify version `1.5.30` of the Kotlin plugin in the root project for use in other project modules.
```kotlin
plugins {
kotlin("jvm") version "1.5.30" apply false
}
buildscript {
dependencies {
classpath(kotlin("gradle-plugin", version = "1.5.30"))
}
}
```
* Add a module for hosting the processor.
* In the module's `build.gradle.kts` file, do the following:
* Apply Kotlin plugin
* Add the KSP API to the `dependencies` block.
```kotlin
plugins {
kotlin("jvm")
}
repositories {
mavenCentral()
}
dependencies {
implementation("com.google.devtools.ksp:symbol-processing-api:1.5.30-1.0.0-beta08")
}
```
* You'll need to implement [`com.google.devtools.ksp.processing.SymbolProcessor`](../api/src/main/kotlin/com/google/devtools/ksp/processing/SymbolProcessor.kt) and
[`com.google.devtools.ksp.processing.SymbolProcessorProvider`](../api/src/main/kotlin/com/google/devtools/ksp/processing/SymbolProcessorProvider.kt).
Your implementation of `SymbolProcessorProvider` will be loaded as a service to instantiate the `SymbolProcessor` you implement.
Note the following:
* Implement [`SymbolProcessorProvider.create()`](https://github.com/google/ksp/blob/master/api/src/main/kotlin/com/google/devtools/ksp/processing/SymbolProcessorProvider.kt) to create a `SymbolProcessor`. Dependencies your processor needs (e.g. `CodeGenerator`, processor options) are passed through the parameters of `SymbolProcessorProvider.create()`.
* Your main logic should be in the [`SymbolProcessor.process()`](https://github.com/google/ksp/blob/master/api/src/main/kotlin/com/google/devtools/ksp/processing/SymbolProcessor.kt) method.
* Use `resolver.getSymbolsWithAnnotation()` to get the symbols you want to process, given
the fully-qualified name of an annotation.
* A common use case for KSP is to implement a customized visitor (interface
`com.google.devtools.ksp.symbol.KSVisitor`) for operating on symbols. A simple template
visitor is `com.google.devtools.ksp.symbol.KSDefaultVisitor`.
* For sample implementations of the `SymbolProcessorProvider` and `SymbolProcessor` interfaces, see the following files
in the sample project.
* `src/main/kotlin/BuilderProcessor.kt`
* `src/main/kotlin/TestProcessor.kt`
* After writing your own processor, register your processor provider to the package by including
its fully-qualified name in
`resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider`.
## Use your own processor in a project
<details open>
<summary>Setup using Kotlin DSL</summary>
* Create another module that contains a workload where you want to try out your processor.
```kotlin
pluginManagement {
repositories {
gradlePluginPortal()
}
}
```
* In the new module's `build.gradle.kts`, do the following:
* Apply the `com.google.devtools.ksp` plugin with the specified version.
* Add `ksp(<your processor>)` to the list of dependencies.
* Run `./gradlew build`. You can find the generated code under
`build/generated/source/ksp`.
* Here's a `sample build.gradle.kts` to apply the KSP plugin to a workload.
```kotlin
plugins {
id("com.google.devtools.ksp") version "1.5.30-1.0.0-beta08"
kotlin("jvm")
}
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
dependencies {
implementation(kotlin("stdlib-jdk8"))
implementation(project(":test-processor"))
ksp(project(":test-processor"))
}
```
</details>
<details>
<summary>Setup using Groovy</summary>
```groovy
pluginManagement {
repositories {
gradlePluginPortal()
}
}
```
* In your projects `build.gradle` file add a plugins block containing the ksp plugin:
```groovy
plugins {
id "com.google.devtools.ksp" version "1.5.30-1.0.0-beta08"
}
```
* In the modules `build.gradle`, add the following:
* Apply the `com.google.devtools.ksp` plugin:
```groovy
apply plugin: 'com.google.devtools.ksp'
```
* Add `ksp <your processor>` to the list of dependencies.
```groovy
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation project(":test-processor")
ksp project(":test-processor")
}
```
</details>
## Pass Options to Processors
Processor options in `SymbolProcessorEnvironment.options` are specified in gradle build scripts:
```
ksp {
arg("option1", "value1")
arg("option2", "value2")
...
}
```
## Make IDE Aware Of Generated Code
By default, IntelliJ or other IDEs don't know about the generated code and therefore
references to those generated symbols will be marked unresolvable.
To make, for example, IntelliJ be able to reason about the generated symbols,
the following paths need to be marked as generated source root:
```
build/generated/ksp/main/kotlin/
build/generated/ksp/main/java/
```
and perhaps also resource directory if your IDE supports them:
```
build/generated/ksp/main/resources/
```
It may also be necessary to configure these directories in your KSP consumer module:
###### build.gradle.kts
```kotlin
kotlin {
sourceSets.main {
kotlin.srcDir("build/generated/ksp/main/kotlin")
}
sourceSets.test {
kotlin.srcDir("build/generated/ksp/test/kotlin")
}
}
```