| # Introduction to KSP2 | |
| KSP2 is a new implementation of the KSP API. Unlike KSP 1.x, it is no longer a compiler plugin and is built on the same | |
| set of Kotlin compiler APIs shared with IntelliJ IDEA, Android Lint, etc. Compared to the compiler-plugin approach, this | |
| allows a finer control of the program life cycle, simplifies KSP’s implementation and is more efficient. It is also a | |
| response to the compiler migration to K2, whose compiler plugin API is different from the one KSP1 uses. | |
| Not being a compiler plugin and having a better control of the program life cycles means that it’s straightforward to | |
| provide an entry point that can be called by other programs. This is especially convenient for testing processors | |
| as a processor author. | |
| KSP2 also provides a new command line tool that has its own main function, instead of being part of the compiler | |
| invocation. | |
| With the new implementation, it is also a great opportunity to introduce some refinements in the API behavior so that | |
| developers building on KSP will be more productive, have better debuggability and error recovery. For example, when | |
| resolving `Map<String, NonExistentType>`, KSP1 simply returns an error type. In KSP2, `Map<String, ErrorType>` will be | |
| returned instead. | |
| ## API Changes | |
| Please refer to [KSP2 API Changes](ksp2api.md) to see more details. | |
| ## Debugging | |
| Unlike KSP1, which runs in `KotlinCompileDaemon`, KSP2 runs in Gradle daemon. This has 2 implications: | |
| 1. Gradle daemon usually has a lower default heap limit. You may need to increase it by the following Gradle property, | |
| for example: `org.gradle.jvmargs=-Xmx4096M -XX:MaxMetaspaceSize=1024m` | |
| 2. The debug flags now need to be passed to Gradle rather than `KotlinCompileDaemon`. To debug KSP2 and/or processors, | |
| pass the system property `-Dorg.gradle.debug=true` in the Gradle command line. | |
| ## Using KSP 2 from command line and in program | |
| Please refer to [Using KSP2 command line](ksp2cmdline.md) and [Calling KSP2 in program](ksp2entrypoints.md). | |
| ## Known Issues | |
| The main gaps between KSP2 Beta and KSP2 Stable are: | |
| * Support of mangled (for `inline` and `internal`) JVM names in `Resolver.getJvmWildcard` and | |
| `Resolver.mapToJvmSignature` | |
| * Support of synthesized Java getters and setters for Kotlin properties in `Resolver.findOverridee` and | |
| `Resolver.asMemberOf`. | |
| * Performance and memory footage are not fully taken care of yet. | |
| * Some type of annotation values are not supported (e.g. nested annotations) | |
| Please check the KSP [2.0](https://github.com/google/ksp/issues?q=is%3Aopen+is%3Aissue+milestone%3A2.0) and | |
| [2.1](https://github.com/google/ksp/issues?q=is%3Aopen+is%3Aissue+milestone%3A2.1) milestones on GitHub for the complete | |
| lists of known issues. | |
| ## Feedback | |
| If you find any bugs that are not included in the above milestones, or if you have any concerns or ideas on API changes, | |
| [please let us know](https://github.com/google/ksp/issues)! |