diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt index 34fbb6d7459..c87f97ce0dd 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt @@ -389,6 +389,7 @@ class Kapt3GradleSubplugin @Inject internal constructor(private val registry: To pluginOptions += SubpluginOption("dumpDefaultParameterValues", "${kaptExtension.dumpDefaultParameterValues}") pluginOptions += SubpluginOption("mapDiagnosticLocations", "${kaptExtension.mapDiagnosticLocations}") pluginOptions += SubpluginOption("strictMode", "${kaptExtension.strictMode}") + pluginOptions += SubpluginOption("stripMetadata", "${kaptExtension.stripMetadata}") pluginOptions += SubpluginOption("showProcessorTimings", "${kaptExtension.showProcessorTimings}") pluginOptions += SubpluginOption("detectMemoryLeaks", kaptExtension.detectMemoryLeaks) pluginOptions += SubpluginOption("infoAsWarnings", "${project.isInfoAsWarnings()}") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KaptExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KaptExtension.kt index 48eba8e1554..1f409de535c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KaptExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KaptExtension.kt @@ -34,6 +34,8 @@ open class KaptExtension { open var mapDiagnosticLocations: Boolean = false open var strictMode: Boolean = false + + open var stripMetadata: Boolean = false open var showProcessorTimings: Boolean = false diff --git a/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/KaptOptions.kt b/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/KaptOptions.kt index 12f308e50cb..5f3d8914e02 100644 --- a/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/KaptOptions.kt +++ b/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/KaptOptions.kt @@ -114,6 +114,7 @@ enum class KaptFlag(val description: String) { STRICT("Strict mode"), INCLUDE_COMPILE_CLASSPATH("Detect annotation processors in compile classpath"), INCREMENTAL_APT("Incremental annotation processing (apt mode)"), + STRIP_METADATA("Strip @Metadata annotations from stubs") ; } diff --git a/plugins/kapt3/kapt3-cli/src/KaptCliOption.kt b/plugins/kapt3/kapt3-cli/src/KaptCliOption.kt index 6048562528c..7a77e139860 100644 --- a/plugins/kapt3/kapt3-cli/src/KaptCliOption.kt +++ b/plugins/kapt3/kapt3-cli/src/KaptCliOption.kt @@ -188,6 +188,13 @@ enum class KaptCliOption( cliToolOption = CliToolOption("-Kapt-strict", FLAG) ), + STRIP_METADATA_OPTION( + "stripMetadata", + "true | false", + "Strip @Metadata annotations from stubs", + cliToolOption = CliToolOption("-Kapt-strip-metadata", FLAG) + ), + DETECT_MEMORY_LEAKS_OPTION("detectMemoryLeaks", "true | false", "Detect memory leaks in annotation processors"), INCLUDE_COMPILE_CLASSPATH( "includeCompileClasspath", diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt index 1a11e6529ee..62f22dca4c2 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt @@ -116,6 +116,7 @@ class Kapt3CommandLineProcessor : CommandLineProcessor { MAP_DIAGNOSTIC_LOCATIONS_OPTION -> setFlag(KaptFlag.MAP_DIAGNOSTIC_LOCATIONS, value) INFO_AS_WARNINGS_OPTION -> setFlag(KaptFlag.INFO_AS_WARNINGS, value) STRICT_MODE_OPTION -> setFlag(KaptFlag.STRICT, value) + STRIP_METADATA_OPTION -> setFlag(KaptFlag.STRIP_METADATA, value) SHOW_PROCESSOR_TIMINGS -> setFlag(KaptFlag.SHOW_PROCESSOR_TIMINGS, value) INCLUDE_COMPILE_CLASSPATH -> setFlag(KaptFlag.INCLUDE_COMPILE_CLASSPATH, value) diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt index 0b085442198..0b0ab672bed 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt @@ -95,6 +95,8 @@ class ClassFileToSourceStubConverter(val kaptContext: KaptContextForStubGenerati "kotlin.jvm." // Kotlin annotations from runtime ) + private val KOTLIN_METADATA_ANNOTATION = Metadata::class.java.name + private val NON_EXISTENT_CLASS_NAME = FqName("error.NonExistentClass") private val JAVA_KEYWORD_FILTER_REGEX = "[a-z]+".toRegex() @@ -107,6 +109,7 @@ class ClassFileToSourceStubConverter(val kaptContext: KaptContextForStubGenerati private val correctErrorTypes = kaptContext.options[KaptFlag.CORRECT_ERROR_TYPES] private val strictMode = kaptContext.options[KaptFlag.STRICT] + private val stripMetadata = kaptContext.options[KaptFlag.STRIP_METADATA] private val mutableBindings = mutableMapOf() @@ -1063,6 +1066,7 @@ class ClassFileToSourceStubConverter(val kaptContext: KaptContextForStubGenerati if (filtered) { if (BLACKLISTED_ANNOTATIONS.any { fqName.startsWith(it) }) return null + if (stripMetadata && fqName == KOTLIN_METADATA_ANNOTATION) return null } val ktAnnotation = (annotationDescriptor?.source as? PsiSourceElement)?.psi as? KtAnnotationEntry diff --git a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3Test.kt b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3Test.kt index a2483871265..2394550aa3a 100644 --- a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3Test.kt +++ b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3Test.kt @@ -243,6 +243,22 @@ open class AbstractClassFileToSourceStubConverterTest : AbstractKotlinKapt3Test( fun testSuppressWarning() {} override fun doTest(filePath: String) { + val wholeFile = File(filePath) + + kaptFlags.add(KaptFlag.MAP_DIAGNOSTIC_LOCATIONS) + + if (wholeFile.isOptionSet("CORRECT_ERROR_TYPES")) { + kaptFlags.add(KaptFlag.CORRECT_ERROR_TYPES) + } + + if (wholeFile.isOptionSet("STRICT_MODE")) { + kaptFlags.add(KaptFlag.STRICT) + } + + if (wholeFile.isOptionSet("STRIP_METADATA")) { + kaptFlags.add(KaptFlag.STRIP_METADATA) + } + super.doTest(filePath) doTestWithJdk9(AbstractClassFileToSourceStubConverterTest::class.java, filePath) doTestWithJdk11(AbstractClassFileToSourceStubConverterTest::class.java, filePath) diff --git a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java index 16c488d8e8e..66d723b9961 100644 --- a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java +++ b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java @@ -418,6 +418,11 @@ public class ClassFileToSourceStubConverterTestGenerated extends AbstractClassFi runTest("plugins/kapt3/kapt3-compiler/testData/converter/strangeNames.kt"); } + @TestMetadata("stripMetadata.kt") + public void testStripMetadata() throws Exception { + runTest("plugins/kapt3/kapt3-compiler/testData/converter/stripMetadata.kt"); + } + @TestMetadata("suspendErrorTypes.kt") public void testSuspendErrorTypes() throws Exception { runTest("plugins/kapt3/kapt3-compiler/testData/converter/suspendErrorTypes.kt"); diff --git a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/IrClassFileToSourceStubConverterTestGenerated.java b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/IrClassFileToSourceStubConverterTestGenerated.java index 31f579a8bf0..5c78e74cbb0 100644 --- a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/IrClassFileToSourceStubConverterTestGenerated.java +++ b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/IrClassFileToSourceStubConverterTestGenerated.java @@ -419,6 +419,11 @@ public class IrClassFileToSourceStubConverterTestGenerated extends AbstractIrCla runTest("plugins/kapt3/kapt3-compiler/testData/converter/strangeNames.kt"); } + @TestMetadata("stripMetadata.kt") + public void testStripMetadata() throws Exception { + runTest("plugins/kapt3/kapt3-compiler/testData/converter/stripMetadata.kt"); + } + @TestMetadata("suspendErrorTypes.kt") public void testSuspendErrorTypes() throws Exception { runTest("plugins/kapt3/kapt3-compiler/testData/converter/suspendErrorTypes.kt"); diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/stripMetadata.kt b/plugins/kapt3/kapt3-compiler/testData/converter/stripMetadata.kt new file mode 100644 index 00000000000..7341ac4616a --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/stripMetadata.kt @@ -0,0 +1,15 @@ +// STRIP_METADATA + +interface Context + +enum class Result { + SUCCESS, ERROR +} + +abstract class BaseClass(context: Context, num: Int, bool: Boolean) { + abstract fun doJob(): Result +} + +class Inheritor(context: Context) : BaseClass(context, 5, true) { + override fun doJob() = Result.SUCCESS +} \ No newline at end of file diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/stripMetadata.txt b/plugins/kapt3/kapt3-compiler/testData/converter/stripMetadata.txt new file mode 100644 index 00000000000..030ac7a8089 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/stripMetadata.txt @@ -0,0 +1,52 @@ +import java.lang.System; + +public abstract class BaseClass { + + @org.jetbrains.annotations.NotNull() + public abstract Result doJob(); + + public BaseClass(@org.jetbrains.annotations.NotNull() + Context context, int num, boolean bool) { + super(); + } +} + +//////////////////// + + +import java.lang.System; + +public abstract interface Context { +} + +//////////////////// + + +import java.lang.System; + +public final class Inheritor extends BaseClass { + + @org.jetbrains.annotations.NotNull() + @java.lang.Override() + public Result doJob() { + return null; + } + + public Inheritor(@org.jetbrains.annotations.NotNull() + Context context) { + super(null, 0, false); + } +} + +//////////////////// + + +import java.lang.System; + +public enum Result { + /*public static final*/ SUCCESS /* = new Result() */, + /*public static final*/ ERROR /* = new Result() */; + + Result() { + } +}