diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java index a1ad0d28296..14dbdd91141 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java @@ -279,7 +279,7 @@ public abstract class AnnotationCodegen { ClassifierDescriptor classifierDescriptor = annotationDescriptor.getType().getConstructor().getDeclarationDescriptor(); assert classifierDescriptor != null : "Annotation descriptor has no class: " + annotationDescriptor; RetentionPolicy rp = getRetentionPolicy(classifierDescriptor); - if (rp == RetentionPolicy.SOURCE && typeMapper.getClassBuilderMode() != ClassBuilderMode.LIGHT_CLASSES) { + if (rp == RetentionPolicy.SOURCE && typeMapper.getClassBuilderMode() == ClassBuilderMode.FULL) { return null; } diff --git a/compiler/tests-common/org/jetbrains/kotlin/codegen/CodegenTestUtil.java b/compiler/tests-common/org/jetbrains/kotlin/codegen/CodegenTestUtil.java index a0812fb1941..c8c461f1a8a 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/codegen/CodegenTestUtil.java +++ b/compiler/tests-common/org/jetbrains/kotlin/codegen/CodegenTestUtil.java @@ -70,7 +70,10 @@ public class CodegenTestUtil { /* useTypeTableInSerializer = */ false, configuration.get(JVMConfigurationKeys.INHERIT_MULTIFILE_PARTS, false) ); - KotlinCodegenFacade.compileCorrectFiles(state, CompilationErrorHandler.THROW_EXCEPTION); + + if (analysisResult.getShouldGenerateCode()) { + KotlinCodegenFacade.compileCorrectFiles(state, CompilationErrorHandler.THROW_EXCEPTION); + } // For JVM-specific errors AnalyzingUtils.throwExceptionOnErrors(state.getCollectedExtraJvmDiagnostics()); diff --git a/libraries/examples/annotation-processor-example/src/main/kotlin/example/ExampleAnnotation.kt b/libraries/examples/annotation-processor-example/src/main/kotlin/example/ExampleAnnotation.kt deleted file mode 100644 index 0da7a817597..00000000000 --- a/libraries/examples/annotation-processor-example/src/main/kotlin/example/ExampleAnnotation.kt +++ /dev/null @@ -1,8 +0,0 @@ -package example - -import java.lang.annotation.ElementType -import java.lang.annotation.Inherited -import java.lang.annotation.Target - -@Inherited -annotation public class ExampleAnnotation \ No newline at end of file diff --git a/libraries/examples/annotation-processor-example/src/main/kotlin/example/ExampleAnnotationProcessor.kt b/libraries/examples/annotation-processor-example/src/main/kotlin/example/ExampleAnnotationProcessor.kt index 030d4b99d56..e1e85cf75ed 100644 --- a/libraries/examples/annotation-processor-example/src/main/kotlin/example/ExampleAnnotationProcessor.kt +++ b/libraries/examples/annotation-processor-example/src/main/kotlin/example/ExampleAnnotationProcessor.kt @@ -6,19 +6,31 @@ import javax.annotation.processing.RoundEnvironment import javax.lang.model.SourceVersion import javax.lang.model.element.ElementKind import javax.lang.model.element.TypeElement -import javax.tools.Diagnostic +import kotlin.reflect.KClass -public class ExampleAnnotationProcessor : AbstractProcessor() { +class ExampleAnnotationProcessor : AbstractProcessor() { private companion object { - val ANNOTATION_FQ_NAME = ExampleAnnotation::class.java.canonicalName + val ANNOTATION_TO_PREFIX = mapOf(ExampleAnnotation::class to "", + ExampleSourceAnnotation::class to "SourceAnnotated", + ExampleRuntimeAnnotation::class to "RuntimeAnnotated", + ExampleBinaryAnnotation::class to "BinaryAnnotated") + val SUFFIX_OPTION = "suffix" val GENERATE_KOTLIN_CODE_OPTION = "generate.kotlin.code" val KAPT_KOTLIN_GENERATED_OPTION = "kapt.kotlin.generated" } override fun process(annotations: MutableSet?, roundEnv: RoundEnvironment): Boolean { - val elements = roundEnv.getElementsAnnotatedWith(ExampleAnnotation::class.java) + for ((annotation, prefix) in ANNOTATION_TO_PREFIX) { + processAnnotation(roundEnv, annotation, prefix) + } + + return true + } + + private fun processAnnotation(roundEnv: RoundEnvironment, annotationClass: KClass, generatedFilePrefix: String) { + val elements = roundEnv.getElementsAnnotatedWith(annotationClass.java) val elementUtils = processingEnv.elementUtils val filer = processingEnv.filer @@ -30,28 +42,26 @@ public class ExampleAnnotationProcessor : AbstractProcessor() { for (element in elements) { val packageName = elementUtils.getPackageOf(element).qualifiedName.toString() - val simpleName = element.simpleName - val className = simpleName.toString().capitalize() + generatedFileSuffix + val simpleName = element.simpleName.toString() + val generatedJavaClassName = generatedFilePrefix.capitalize() + simpleName.capitalize() + generatedFileSuffix - filer.createSourceFile(className).openWriter().use { with(it) { + filer.createSourceFile(generatedJavaClassName).openWriter().use { with(it) { appendln("package $packageName;") - appendln("public final class $className {}") + appendln("public final class $generatedJavaClassName {}") }} if (generateKotlinCode && kotlinGenerated != null && element.kind == ElementKind.CLASS) { File(kotlinGenerated, "$simpleName.kt").writer().buffered().use { it.appendln("package $packageName") - it.appendln("fun $simpleName.customToString() = \"$simpleName: \" + toString()") + it.appendln("fun $simpleName.customToString() = \"$generatedJavaClassName: \" + toString()") } } } - - return true; } override fun getSupportedSourceVersion() = SourceVersion.RELEASE_6 - override fun getSupportedAnnotationTypes() = setOf(ANNOTATION_FQ_NAME) + override fun getSupportedAnnotationTypes() = ANNOTATION_TO_PREFIX.keys.map { it.java.canonicalName }.toSet() override fun getSupportedOptions() = setOf(SUFFIX_OPTION) } \ No newline at end of file diff --git a/libraries/examples/annotation-processor-example/src/main/kotlin/example/annotations.kt b/libraries/examples/annotation-processor-example/src/main/kotlin/example/annotations.kt new file mode 100644 index 00000000000..a5833ac1918 --- /dev/null +++ b/libraries/examples/annotation-processor-example/src/main/kotlin/example/annotations.kt @@ -0,0 +1,18 @@ +package example + +import java.lang.annotation.Inherited + +@Inherited +annotation class ExampleAnnotation + +@Inherited +@Retention(AnnotationRetention.SOURCE) +annotation class ExampleSourceAnnotation + +@Inherited +@Retention(AnnotationRetention.BINARY) +annotation class ExampleBinaryAnnotation + +@Inherited +@Retention(AnnotationRetention.RUNTIME) +annotation class ExampleRuntimeAnnotation \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIT.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIT.kt index 31d9e2e6468..c988daf983c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIT.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIT.kt @@ -26,6 +26,9 @@ class KaptIT: BaseGradleIT() { assertFileExists("build/generated/source/kapt/main/TestClassGenerated.java") assertFileExists("build/classes/main/example/TestClass.class") assertFileExists("build/classes/main/example/TestClassGenerated.class") + assertNoSuchFile("build/classes/main/example/SourceAnnotatedTestClassGenerated.class") + assertFileExists("build/classes/main/example/BinaryAnnotatedTestClassGenerated.class") + assertFileExists("build/classes/main/example/RuntimeAnnotatedTestClassGenerated.class") } project.build("build") { @@ -46,6 +49,9 @@ class KaptIT: BaseGradleIT() { assertFileExists("build/generated/source/kapt/main/TestClassGenerated.java") assertFileExists("build/classes/main/example/TestClass.class") assertFileExists("build/classes/main/example/TestClassGenerated.class") + assertFileExists("build/classes/main/example/SourceAnnotatedTestClassGenerated.class") + assertFileExists("build/classes/main/example/BinaryAnnotatedTestClassGenerated.class") + assertFileExists("build/classes/main/example/RuntimeAnnotatedTestClassGenerated.class") } project.build("build") { diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptSimple/src/main/java/javaPackage/JavaClass.java b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptSimple/src/main/java/javaPackage/JavaClass.java index 2af6a92fd02..6b11375654f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptSimple/src/main/java/javaPackage/JavaClass.java +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptSimple/src/main/java/javaPackage/JavaClass.java @@ -20,6 +20,8 @@ public class JavaClass { public void test() { System.out.println(example.TestClassGenerated.class.getName()); + System.out.println(example.BinaryAnnotatedTestClassGenerated.class.getName()); + System.out.println(example.RuntimeAnnotatedTestClassGenerated.class.getName()); } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptSimple/src/main/java/test.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptSimple/src/main/java/test.kt index b6e0880ce02..aa71b5fbe2c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptSimple/src/main/java/test.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptSimple/src/main/java/test.kt @@ -1,6 +1,9 @@ package example @example.ExampleAnnotation +@example.ExampleSourceAnnotation +@example.ExampleBinaryAnnotation +@example.ExampleRuntimeAnnotation public class TestClass { @example.ExampleAnnotation diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptStubs/src/main/java/javaPackage/JavaClass.java b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptStubs/src/main/java/javaPackage/JavaClass.java index 2af6a92fd02..e0f3f6ab1e7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptStubs/src/main/java/javaPackage/JavaClass.java +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptStubs/src/main/java/javaPackage/JavaClass.java @@ -20,6 +20,9 @@ public class JavaClass { public void test() { System.out.println(example.TestClassGenerated.class.getName()); + System.out.println(example.SourceAnnotatedTestClassGenerated.class.getName()); + System.out.println(example.BinaryAnnotatedTestClassGenerated.class.getName()); + System.out.println(example.RuntimeAnnotatedTestClassGenerated.class.getName()); } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptStubs/src/main/java/test.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptStubs/src/main/java/test.kt index 1562955d627..e864bd0b3bb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptStubs/src/main/java/test.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kaptStubs/src/main/java/test.kt @@ -1,6 +1,9 @@ package example @example.ExampleAnnotation +@example.ExampleSourceAnnotation +@example.ExampleBinaryAnnotation +@example.ExampleRuntimeAnnotation public class TestClass { @example.ExampleAnnotation diff --git a/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/ClassAnnotation.java b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/ClassAnnotation.java new file mode 100644 index 00000000000..aaab6a104de --- /dev/null +++ b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/ClassAnnotation.java @@ -0,0 +1,4 @@ +import java.lang.annotation.*; + +@Retention(RetentionPolicy.CLASS) +public @interface ClassAnnotation {} \ No newline at end of file diff --git a/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/DefaultAnnotation.java b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/DefaultAnnotation.java new file mode 100644 index 00000000000..c9fc253c40c --- /dev/null +++ b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/DefaultAnnotation.java @@ -0,0 +1,3 @@ +import java.lang.annotation.*; + +public @interface DefaultAnnotation {} \ No newline at end of file diff --git a/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/RuntimeAnnotation.java b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/RuntimeAnnotation.java new file mode 100644 index 00000000000..a9517bb6595 --- /dev/null +++ b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/RuntimeAnnotation.java @@ -0,0 +1,4 @@ +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +public @interface RuntimeAnnotation {} \ No newline at end of file diff --git a/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/SourceAnnotation.java b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/SourceAnnotation.java new file mode 100644 index 00000000000..3eda34e1bf8 --- /dev/null +++ b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/SourceAnnotation.java @@ -0,0 +1,4 @@ +import java.lang.annotation.*; + +@Retention(RetentionPolicy.SOURCE) +public @interface SourceAnnotation {} \ No newline at end of file diff --git a/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/annotations.txt b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/annotations.txt new file mode 100644 index 00000000000..3cd21147b3f --- /dev/null +++ b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/annotations.txt @@ -0,0 +1,6 @@ +a DefaultAnnotation 0 +c 0 DafaultUsage +a ClassAnnotation 1 +c 1 ClassUsage +a RuntimeAnnotation 2 +c 2 RuntimeUsage diff --git a/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/usage.kt b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/usage.kt new file mode 100644 index 00000000000..120111d2ad1 --- /dev/null +++ b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/usage.kt @@ -0,0 +1,11 @@ +@DefaultAnnotation +class DafaultUsage + +@SourceAnnotation +class SourceUsage + +@ClassAnnotation +class ClassUsage + +@RuntimeAnnotation +class RuntimeUsage \ No newline at end of file diff --git a/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/ClassAnnotation.java b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/ClassAnnotation.java new file mode 100644 index 00000000000..aaab6a104de --- /dev/null +++ b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/ClassAnnotation.java @@ -0,0 +1,4 @@ +import java.lang.annotation.*; + +@Retention(RetentionPolicy.CLASS) +public @interface ClassAnnotation {} \ No newline at end of file diff --git a/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/DefaultAnnotation.java b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/DefaultAnnotation.java new file mode 100644 index 00000000000..c9fc253c40c --- /dev/null +++ b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/DefaultAnnotation.java @@ -0,0 +1,3 @@ +import java.lang.annotation.*; + +public @interface DefaultAnnotation {} \ No newline at end of file diff --git a/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/RuntimeAnnotation.java b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/RuntimeAnnotation.java new file mode 100644 index 00000000000..a9517bb6595 --- /dev/null +++ b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/RuntimeAnnotation.java @@ -0,0 +1,4 @@ +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +public @interface RuntimeAnnotation {} \ No newline at end of file diff --git a/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/SourceAnnotation.java b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/SourceAnnotation.java new file mode 100644 index 00000000000..3eda34e1bf8 --- /dev/null +++ b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/SourceAnnotation.java @@ -0,0 +1,4 @@ +import java.lang.annotation.*; + +@Retention(RetentionPolicy.SOURCE) +public @interface SourceAnnotation {} \ No newline at end of file diff --git a/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/annotations.txt b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/annotations.txt new file mode 100644 index 00000000000..cdae8dd108c --- /dev/null +++ b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/annotations.txt @@ -0,0 +1,8 @@ +a DefaultAnnotation 0 +c 0 DafaultUsage +a SourceAnnotation 1 +c 1 SourceUsage +a ClassAnnotation 2 +c 2 ClassUsage +a RuntimeAnnotation 3 +c 3 RuntimeUsage diff --git a/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/usage.kt b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/usage.kt new file mode 100644 index 00000000000..120111d2ad1 --- /dev/null +++ b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/usage.kt @@ -0,0 +1,11 @@ +@DefaultAnnotation +class DafaultUsage + +@SourceAnnotation +class SourceUsage + +@ClassAnnotation +class ClassUsage + +@RuntimeAnnotation +class RuntimeUsage \ No newline at end of file diff --git a/plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotations/annotations.kt b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotations/annotations.kt new file mode 100644 index 00000000000..dc13bd93bf0 --- /dev/null +++ b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotations/annotations.kt @@ -0,0 +1,10 @@ +annotation class DefaultAnnotation + +@Retention(AnnotationRetention.SOURCE) +annotation class SourceAnnotation + +@Retention(AnnotationRetention.BINARY) +annotation class BinaryAnnotation + +@Retention(AnnotationRetention.RUNTIME) +annotation class RuntimeAnnotation \ No newline at end of file diff --git a/plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotations/annotations.txt b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotations/annotations.txt new file mode 100644 index 00000000000..02485909272 --- /dev/null +++ b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotations/annotations.txt @@ -0,0 +1,15 @@ +a java.lang.annotation.Retention 0 +c 0 DefaultAnnotation +a kotlin.annotation.Retention 1 +c 1 SourceAnnotation +c 0 SourceAnnotation +c 1 BinaryAnnotation +c 0 BinaryAnnotation +c 1 RuntimeAnnotation +c 0 RuntimeAnnotation +a DefaultAnnotation 2 +c 2 DafaultUsage +a BinaryAnnotation 3 +c 3 BinaryUsage +a RuntimeAnnotation 4 +c 4 RuntimeUsage diff --git a/plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotations/usage.kt b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotations/usage.kt new file mode 100644 index 00000000000..57070658078 --- /dev/null +++ b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotations/usage.kt @@ -0,0 +1,11 @@ +@DefaultAnnotation +class DafaultUsage + +@SourceAnnotation +class SourceUsage + +@BinaryAnnotation +class BinaryUsage + +@RuntimeAnnotation +class RuntimeUsage \ No newline at end of file diff --git a/plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotationsStubs/annotations.kt b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotationsStubs/annotations.kt new file mode 100644 index 00000000000..dc13bd93bf0 --- /dev/null +++ b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotationsStubs/annotations.kt @@ -0,0 +1,10 @@ +annotation class DefaultAnnotation + +@Retention(AnnotationRetention.SOURCE) +annotation class SourceAnnotation + +@Retention(AnnotationRetention.BINARY) +annotation class BinaryAnnotation + +@Retention(AnnotationRetention.RUNTIME) +annotation class RuntimeAnnotation \ No newline at end of file diff --git a/plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotationsStubs/annotations.txt b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotationsStubs/annotations.txt new file mode 100644 index 00000000000..8424f404d9b --- /dev/null +++ b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotationsStubs/annotations.txt @@ -0,0 +1,17 @@ +a java.lang.annotation.Retention 0 +c 0 DefaultAnnotation +a kotlin.annotation.Retention 1 +c 1 SourceAnnotation +c 0 SourceAnnotation +c 1 BinaryAnnotation +c 0 BinaryAnnotation +c 1 RuntimeAnnotation +c 0 RuntimeAnnotation +a DefaultAnnotation 2 +c 2 DafaultUsage +a SourceAnnotation 3 +c 3 SourceUsage +a BinaryAnnotation 4 +c 4 BinaryUsage +a RuntimeAnnotation 5 +c 5 RuntimeUsage diff --git a/plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotationsStubs/usage.kt b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotationsStubs/usage.kt new file mode 100644 index 00000000000..57070658078 --- /dev/null +++ b/plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotationsStubs/usage.kt @@ -0,0 +1,11 @@ +@DefaultAnnotation +class DafaultUsage + +@SourceAnnotation +class SourceUsage + +@BinaryAnnotation +class BinaryUsage + +@RuntimeAnnotation +class RuntimeUsage \ No newline at end of file diff --git a/plugins/plugins-tests/tests/org/jetbrains/kotlin/annotation/AbstractAnnotationProcessorBoxTest.kt b/plugins/plugins-tests/tests/org/jetbrains/kotlin/annotation/AbstractAnnotationProcessorBoxTest.kt index 9efcb048693..eac407758b5 100644 --- a/plugins/plugins-tests/tests/org/jetbrains/kotlin/annotation/AbstractAnnotationProcessorBoxTest.kt +++ b/plugins/plugins-tests/tests/org/jetbrains/kotlin/annotation/AbstractAnnotationProcessorBoxTest.kt @@ -16,12 +16,14 @@ package org.jetbrains.kotlin.annotation +import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.codegen.CodegenTestCase import org.jetbrains.kotlin.codegen.CodegenTestUtil import org.jetbrains.kotlin.codegen.extensions.ClassBuilderInterceptorExtension import org.jetbrains.kotlin.diagnostics.DiagnosticSink +import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisCompletedHandlerExtension import org.jetbrains.kotlin.test.ConfigurationKind import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.TestJdkKind @@ -29,13 +31,26 @@ import java.io.File import java.io.StringWriter abstract class AbstractAnnotationProcessorBoxTest : CodegenTestCase() { - override fun doTest(path: String) { - val testName = getTestName(true) - val ktFiles = File(path).listFiles { file -> file.isFile && file.extension.toLowerCase() == "kt" } - val testFiles = ktFiles.map { TestFile(it.name, it.readText()) } - val supportInheritedAnnotations = testName.startsWith("inherited") + override fun doTest(path: String) { + val testDir = File(path) - val collectorExtension = createTestEnvironment(supportInheritedAnnotations) + fun filesByExtension(ext: String) = testDir.listFiles { file -> file.isFile && file.extension.equals(ext, ignoreCase = true) } + + val testName = getTestName(true) + val ktFiles = filesByExtension("kt") + val testFiles = ktFiles.map { TestFile(it.name, it.readText()) } + val supportInheritedAnnotations = testName.contains("inherited", ignoreCase = true) + val supportStubs = testName.contains("stubs", ignoreCase = true) + + val javaSourceRoots = mutableListOf() + val javaFiles = filesByExtension("java") + if (javaFiles.isNotEmpty()) { + val javaFilesDir = KotlinTestUtils.tmpDir("java-files") + javaFiles.forEach { it.copyTo(File(javaFilesDir, it.name)) } + javaSourceRoots.add(javaFilesDir) + } + + val collectorExtension = createTestEnvironment(supportInheritedAnnotations, supportStubs, javaSourceRoots) loadMultiFiles(testFiles) CodegenTestUtil.generateFiles(myEnvironment, myFiles) @@ -49,14 +64,27 @@ abstract class AbstractAnnotationProcessorBoxTest : CodegenTestCase() { return "plugins/annotation-collector/testData/codegen/" } - private fun createTestEnvironment(supportInheritedAnnotations: Boolean): AnnotationCollectorExtensionForTests { - val configuration = KotlinTestUtils.compilerConfigurationForTests(ConfigurationKind.ALL, TestJdkKind.MOCK_JDK) + private fun createTestEnvironment( + supportInheritedAnnotations: Boolean, + supportStubs: Boolean, + javaSourceRoots: List + ): AnnotationCollectorExtensionForTests { + val configuration = KotlinTestUtils.compilerConfigurationForTests(ConfigurationKind.ALL, + TestJdkKind.MOCK_JDK, + /* classpath = */ emptyList(), + javaSourceRoots) val environment = KotlinCoreEnvironment.createForTests(testRootDisposable!!, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES) val project = environment.project val collectorExtension = AnnotationCollectorExtensionForTests(supportInheritedAnnotations) ClassBuilderInterceptorExtension.registerExtension(project, collectorExtension) + if (supportStubs) { + val stubsDir = KotlinTestUtils.tmpDir("class-stubs") + val stubProducerExtension = StubProducerExtension(stubsDir, MessageCollector.NONE) + AnalysisCompletedHandlerExtension.registerExtension(project, stubProducerExtension) + } + myEnvironment = environment return collectorExtension diff --git a/plugins/plugins-tests/tests/org/jetbrains/kotlin/annotation/AnnotationProcessorBoxTestGenerated.java b/plugins/plugins-tests/tests/org/jetbrains/kotlin/annotation/AnnotationProcessorBoxTestGenerated.java index 5fe4e59761e..07944865a5b 100644 --- a/plugins/plugins-tests/tests/org/jetbrains/kotlin/annotation/AnnotationProcessorBoxTestGenerated.java +++ b/plugins/plugins-tests/tests/org/jetbrains/kotlin/annotation/AnnotationProcessorBoxTestGenerated.java @@ -83,6 +83,12 @@ public class AnnotationProcessorBoxTestGenerated extends AbstractAnnotationProce doTest(fileName); } + @TestMetadata("inheritedSimple") + public void testInheritedSimple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/annotation-collector/testData/collectToFile/inheritedSimple/"); + doTest(fileName); + } + @TestMetadata("inheritedTopLevel") public void testInheritedTopLevel() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("plugins/annotation-collector/testData/collectToFile/inheritedTopLevel/"); @@ -125,6 +131,30 @@ public class AnnotationProcessorBoxTestGenerated extends AbstractAnnotationProce doTest(fileName); } + @TestMetadata("retentionPoliciesJavaAnnotations") + public void testRetentionPoliciesJavaAnnotations() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/"); + doTest(fileName); + } + + @TestMetadata("retentionPoliciesJavaAnnotationsStubs") + public void testRetentionPoliciesJavaAnnotationsStubs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/"); + doTest(fileName); + } + + @TestMetadata("retentionPoliciesKotlinAnnotations") + public void testRetentionPoliciesKotlinAnnotations() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotations/"); + doTest(fileName); + } + + @TestMetadata("retentionPoliciesKotlinAnnotationsStubs") + public void testRetentionPoliciesKotlinAnnotationsStubs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotationsStubs/"); + doTest(fileName); + } + @TestMetadata("topLevelAnnotated") public void testTopLevelAnnotated() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("plugins/annotation-collector/testData/collectToFile/topLevelAnnotated/");