[KAPT4] KT-51982 Implement Kapt4AnalysisHandlerExtension, add KAPT CLI and Gradle IT

Co-authored-by: Alexander Udalov <Alexander.Udalov@jetbrains.com>
This commit is contained in:
Alexander Udalov
2023-08-31 22:19:13 +00:00
committed by Space Team
parent d50d36f16c
commit 5c19cb3fcb
61 changed files with 1577 additions and 68 deletions
@@ -0,0 +1,11 @@
package test
import apt.Annotation1
import generated.Test123
@Annotation1
class Test
fun main() {
println("Generated class: " + Test123::class.java.name)
}
@@ -0,0 +1,68 @@
package apt
import javax.annotation.processing.*
import javax.lang.model.SourceVersion
import javax.lang.model.element.TypeElement
import javax.tools.Diagnostic
annotation class Annotation1
annotation class Annotation2
annotation class Annotation3
@SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedAnnotationTypes("apt.Annotation1")
class AnnotationProcessor1 : AbstractProcessor() {
override fun process(annotations: Set<TypeElement>, roundEnv: RoundEnvironment): Boolean {
val elements = roundEnv.getElementsAnnotatedWith(Annotation1::class.java)
for (element in elements) {
val generatedSimpleName = "${element.simpleName}1"
val file = processingEnv.filer.createSourceFile("generated.$generatedSimpleName")
file.openWriter().use {
it.write("package generated;\n@apt.Annotation2\npublic class $generatedSimpleName {}")
}
}
return true
}
}
@SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedAnnotationTypes("apt.Annotation2")
class AnnotationProcessor2 : AbstractProcessor() {
override fun process(annotations: Set<TypeElement>, roundEnv: RoundEnvironment): Boolean {
val elements = roundEnv.getElementsAnnotatedWith(Annotation2::class.java)
for (element in elements) {
val generatedSimpleName = "${element.simpleName}2"
val file = processingEnv.filer.createSourceFile("generated.$generatedSimpleName")
file.openWriter().use {
it.write("package generated;\n@apt.Annotation3\npublic class $generatedSimpleName {}")
}
}
return true
}
}
@SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedAnnotationTypes("apt.Annotation3")
class AnnotationProcessor3 : AbstractProcessor() {
override fun process(annotations: Set<TypeElement>, roundEnv: RoundEnvironment): Boolean {
val elements = roundEnv.getElementsAnnotatedWith(Annotation3::class.java)
for (element in elements) {
val generatedSimpleName = "${element.simpleName}3"
val file = processingEnv.filer.createSourceFile("generated.$generatedSimpleName")
file.openWriter().use {
it.write("package generated;\npublic class $generatedSimpleName {}")
}
}
return true
}
}
@@ -0,0 +1,38 @@
# mkdir
output/ap
output/stubs
output/classes
output/javaClasses
output/sources
# kotlinc
-cp %KOTLIN_STDLIB%
-d output/ap
ap/processors.kt
# kapt
-Kapt-stubs=output/stubs
-Kapt-classes=output/classes
-Kapt-sources=output/sources
-Kapt-classpath=output/ap
-Kapt-processors=apt.AnnotationProcessor3
-Kapt-processors=apt.AnnotationProcessor2
-Kapt-processors=apt.AnnotationProcessor1
-d output/classes
-cp output/ap:%KOTLIN_STDLIB%
Test.kt
# javac
-cp output/ap
-d output/javaClasses
-proc:none
output/sources/generated/Test1.java
output/sources/generated/Test12.java
output/sources/generated/Test123.java
# java
-cp output/classes:output/javaClasses:output/ap:%KOTLIN_STDLIB%
test.TestKt
# after
Generated class: generated.Test123