From 574b9b76cd2add5514ffa13ab8eb0d787e0b0d47 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 18 Jan 2023 01:12:37 +0100 Subject: [PATCH] Add test checking that JVM_IR is enabled/disabled in kapt #KT-53135 --- .../org/jetbrains/kotlin/gradle/Kapt3IT.kt | 30 +++++++++++++ .../kapt2/repeatableAnnotations/build.gradle | 17 ++++++++ .../processor/build.gradle | 11 +++++ .../main/java/CheckAnnotationIsRepeated.kt | 43 +++++++++++++++++++ .../javax.annotation.processing.Processor | 1 + .../repeatableAnnotations/settings.gradle | 1 + .../src/main/java/test.kt | 11 +++++ .../build.gradle | 17 ++++++++ .../gradle.properties | 1 + .../processor/build.gradle | 11 +++++ .../main/java/CheckAnnotationIsNotRepeated.kt | 34 +++++++++++++++ .../javax.annotation.processing.Processor | 1 + .../settings.gradle | 1 + .../src/main/java/test.kt | 11 +++++ 14 files changed, 190 insertions(+) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/processor/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/processor/src/main/java/CheckAnnotationIsRepeated.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/settings.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/src/main/java/test.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/gradle.properties create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/processor/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/processor/src/main/java/CheckAnnotationIsNotRepeated.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/settings.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/src/main/java/test.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt index b923915c88d..94614c8e438 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt @@ -92,6 +92,14 @@ class Kapt3ClassLoadersCacheIT : Kapt3IT() { override fun testKt33847(gradleVersion: GradleVersion) { } + @Disabled("classloaders cache is leaking file descriptors that prevents cleaning test project") + override fun testRepeatableAnnotations(gradleVersion: GradleVersion) { + } + + @Disabled("classloaders cache is leaking file descriptors that prevents cleaning test project") + override fun testRepeatableAnnotationsWithOldJvmBackend(gradleVersion: GradleVersion) { + } + override fun testAnnotationProcessorAsFqName(gradleVersion: GradleVersion) { project("annotationProcessorAsFqName".withPrefix, gradleVersion) { //classloaders caching is not compatible with includeCompileClasspath @@ -1036,4 +1044,26 @@ open class Kapt3IT : Kapt3BaseIT() { build("assemble") } } + + @DisplayName("KT-53135: check that JVM IR backend is enabled by default by verifying that repeatable annotations are supported") + @GradleTest + open fun testRepeatableAnnotations(gradleVersion: GradleVersion) { + project("repeatableAnnotations".withPrefix, gradleVersion) { + build("build") { + assertKaptSuccessful() + assertTasksExecuted(":kaptGenerateStubsKotlin", ":kaptKotlin", ":compileKotlin") + } + } + } + + @DisplayName("KT-53135: check that JVM IR backend is disabled if kapt.use.jvm.ir=false is specified in gradle.properties") + @GradleTest + open fun testRepeatableAnnotationsWithOldJvmBackend(gradleVersion: GradleVersion) { + project("repeatableAnnotationsWithOldJvmBackend".withPrefix, gradleVersion) { + build("build") { + assertKaptSuccessful() + assertTasksExecuted(":kaptGenerateStubsKotlin", ":kaptKotlin", ":compileKotlin") + } + } + } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/build.gradle new file mode 100644 index 00000000000..68578bf5197 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/build.gradle @@ -0,0 +1,17 @@ +plugins { + id "java" + id "org.jetbrains.kotlin.jvm" + id "org.jetbrains.kotlin.kapt" +} + +repositories { + mavenLocal() + mavenCentral() +} + +dependencies { + implementation(project(":processor")) + kapt(project(":processor")) +} + +compileKotlin.kotlinOptions.allWarningsAsErrors = true diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/processor/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/processor/build.gradle new file mode 100644 index 00000000000..404605016e6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/processor/build.gradle @@ -0,0 +1,11 @@ +plugins { + id "java" + id "org.jetbrains.kotlin.jvm" +} + +repositories { + mavenLocal() + mavenCentral() +} + +compileKotlin.kotlinOptions.allWarningsAsErrors = true diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/processor/src/main/java/CheckAnnotationIsRepeated.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/processor/src/main/java/CheckAnnotationIsRepeated.kt new file mode 100644 index 00000000000..f591243d3f3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/processor/src/main/java/CheckAnnotationIsRepeated.kt @@ -0,0 +1,43 @@ +package processor + +import javax.annotation.processing.AbstractProcessor +import javax.annotation.processing.RoundEnvironment +import javax.lang.model.SourceVersion +import javax.lang.model.element.TypeElement +import javax.tools.Diagnostic + +class CheckAnnotationIsRepeated : AbstractProcessor() { + override fun process(annotations: MutableSet?, roundEnv: RoundEnvironment): Boolean { + val element = processingEnv.elementUtils.getTypeElement("example.TestClass") + val containerAnnotation = element.annotationMirrors.singleOrNull { + it.annotationType.asElement().simpleName.contentEquals("Container") && + it.annotationType.asElement().enclosingElement.simpleName.contentEquals("Anno") + } + if (containerAnnotation == null) { + processingEnv.messager.printMessage( + Diagnostic.Kind.ERROR, + "Repeatable container annotation class example.Anno.Container is not found. " + + "The problem is likely in the fact that JVM IR is NOT enabled for kapt stub generation.", + element, + ) + return true + } + + val expected = "{value()={@example.Anno(\"1\"), @example.Anno(\"2\")}}" + val actual = containerAnnotation.elementValues.toString() + if (actual != expected) { + processingEnv.messager.printMessage( + Diagnostic.Kind.ERROR, + "Repeatable annotation values are incorrect: $actual" + ) + } + + return true + } + + override fun getSupportedSourceVersion(): SourceVersion = + SourceVersion.RELEASE_6 + + override fun getSupportedAnnotationTypes(): Set = + setOf("example.ToBeChecked") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor new file mode 100644 index 00000000000..bbcfec85f7e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor @@ -0,0 +1 @@ +processor.CheckAnnotationIsRepeated diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/settings.gradle new file mode 100644 index 00000000000..8adb821eab3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/settings.gradle @@ -0,0 +1 @@ +include "processor" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/src/main/java/test.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/src/main/java/test.kt new file mode 100644 index 00000000000..d86d2a1b1ac --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotations/src/main/java/test.kt @@ -0,0 +1,11 @@ +package example + +annotation class ToBeChecked + +@Repeatable +annotation class Anno(val value: String) + +@ToBeChecked +@Anno("1") +@Anno("2") +public class TestClass diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/build.gradle new file mode 100644 index 00000000000..68578bf5197 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/build.gradle @@ -0,0 +1,17 @@ +plugins { + id "java" + id "org.jetbrains.kotlin.jvm" + id "org.jetbrains.kotlin.kapt" +} + +repositories { + mavenLocal() + mavenCentral() +} + +dependencies { + implementation(project(":processor")) + kapt(project(":processor")) +} + +compileKotlin.kotlinOptions.allWarningsAsErrors = true diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/gradle.properties new file mode 100644 index 00000000000..b2e4e770b66 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/gradle.properties @@ -0,0 +1 @@ +kapt.use.jvm.ir=false diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/processor/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/processor/build.gradle new file mode 100644 index 00000000000..404605016e6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/processor/build.gradle @@ -0,0 +1,11 @@ +plugins { + id "java" + id "org.jetbrains.kotlin.jvm" +} + +repositories { + mavenLocal() + mavenCentral() +} + +compileKotlin.kotlinOptions.allWarningsAsErrors = true diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/processor/src/main/java/CheckAnnotationIsNotRepeated.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/processor/src/main/java/CheckAnnotationIsNotRepeated.kt new file mode 100644 index 00000000000..1c00a1d0ff0 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/processor/src/main/java/CheckAnnotationIsNotRepeated.kt @@ -0,0 +1,34 @@ +package processor + +import javax.annotation.processing.AbstractProcessor +import javax.annotation.processing.RoundEnvironment +import javax.lang.model.SourceVersion +import javax.lang.model.element.TypeElement +import javax.tools.Diagnostic + +class CheckAnnotationIsNotRepeated : AbstractProcessor() { + override fun process(annotations: MutableSet?, roundEnv: RoundEnvironment): Boolean { + val element = processingEnv.elementUtils.getTypeElement("example.TestClass") + val containerAnnotation = element.annotationMirrors.singleOrNull { + it.annotationType.asElement().simpleName.contentEquals("Container") && + it.annotationType.asElement().enclosingElement.simpleName.contentEquals("Anno") + } + if (containerAnnotation != null) { + processingEnv.messager.printMessage( + Diagnostic.Kind.ERROR, + "Repeatable container annotation class example.Anno.Container is found. " + + "The problem is likely in the fact that JVM IR is NOT DISABLED for kapt stub generation " + + "even though kapt.use.jvm.ir=false is specified in gradle.properties.", + element, + ) + } + + return true + } + + override fun getSupportedSourceVersion(): SourceVersion = + SourceVersion.RELEASE_6 + + override fun getSupportedAnnotationTypes(): Set = + setOf("example.ToBeChecked") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor new file mode 100644 index 00000000000..ae5c944f295 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor @@ -0,0 +1 @@ +processor.CheckAnnotationIsNotRepeated diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/settings.gradle new file mode 100644 index 00000000000..8adb821eab3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/settings.gradle @@ -0,0 +1 @@ +include "processor" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/src/main/java/test.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/src/main/java/test.kt new file mode 100644 index 00000000000..d86d2a1b1ac --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/repeatableAnnotationsWithOldJvmBackend/src/main/java/test.kt @@ -0,0 +1,11 @@ +package example + +annotation class ToBeChecked + +@Repeatable +annotation class Anno(val value: String) + +@ToBeChecked +@Anno("1") +@Anno("2") +public class TestClass