Kapt: Allow to strip @Metadata annotation from stubs (KT-36667)

This commit is contained in:
Yan Zhulanow
2020-02-13 17:12:47 +09:00
parent da16b8e527
commit 62affd8e0d
11 changed files with 109 additions and 0 deletions
@@ -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()}")
@@ -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
@@ -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")
;
}
@@ -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",
@@ -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)
@@ -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<String, KaptJavaFileObject>()
@@ -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
@@ -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)
@@ -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");
@@ -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");
@@ -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
}
@@ -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() {
}
}