From 6ca5787799c25d597a724bbcf2932367793dc6fa Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 2 Nov 2017 12:26:31 +0900 Subject: [PATCH] Kapt: Allow to ignore specific methods/fields from being put into kapt stubs Classes can't be ignored yet as it requires to ignore also all type usages which is a non-trivial operation. --- plugins/kapt3/kapt3-compiler/build.gradle.kts | 6 ++++-- .../stubs/ClassFileToSourceStubConverter.kt | 9 ++++++++- .../kapt3/test/AbstractKotlinKapt3Test.kt | 10 ++++++++++ ...sFileToSourceStubConverterTestGenerated.java | 6 ++++++ .../testData/converter/ignoredMembers.kt | 13 +++++++++++++ .../testData/converter/ignoredMembers.txt | 17 +++++++++++++++++ plugins/kapt3/kapt3-runtime/src/KaptIgnored.kt | 3 ++- 7 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 plugins/kapt3/kapt3-compiler/testData/converter/ignoredMembers.kt create mode 100644 plugins/kapt3/kapt3-compiler/testData/converter/ignoredMembers.txt diff --git a/plugins/kapt3/kapt3-compiler/build.gradle.kts b/plugins/kapt3/kapt3-compiler/build.gradle.kts index cdc9241eb2e..bd06e86ed2f 100644 --- a/plugins/kapt3/kapt3-compiler/build.gradle.kts +++ b/plugins/kapt3/kapt3-compiler/build.gradle.kts @@ -14,9 +14,11 @@ dependencies { testCompile(project(":compiler:tests-common")) testCompile(projectTests(":compiler:tests-common")) testCompile(ideaSdkDeps("idea", "idea_rt", "openapi")) - testCompile(commonDep("junit:junit")) - + compileOnly(project(":kotlin-annotation-processing-runtime")) + + testCompile(commonDep("junit:junit")) + testCompile(project(":kotlin-annotation-processing-runtime")) } sourceSets { 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 90c5f057446..29c6e571561 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 @@ -22,6 +22,7 @@ import com.sun.tools.javac.parser.Tokens import com.sun.tools.javac.tree.JCTree import com.sun.tools.javac.tree.JCTree.* import com.sun.tools.javac.tree.TreeMaker +import kotlinx.kapt.KaptIgnored import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor @@ -361,7 +362,7 @@ class ClassFileToSourceStubConverter( packageFqName: String, explicitInitializer: JCExpression? = null ): JCVariableDecl? { - if (isSynthetic(field.access)) return null + if (isSynthetic(field.access) || isIgnored(field.invisibleAnnotations)) return null // not needed anymore val origin = kaptContext.origins[field] val descriptor = origin?.descriptor @@ -398,6 +399,7 @@ class ClassFileToSourceStubConverter( } private fun convertMethod(method: MethodNode, containingClass: ClassNode, packageFqName: String): JCMethodDecl? { + if (isIgnored(method.invisibleAnnotations)) return null val descriptor = kaptContext.origins[method]?.descriptor as? CallableDescriptor ?: return null val isAnnotationHolderForProperty = descriptor is PropertyDescriptor && isSynthetic(method.access) @@ -496,6 +498,11 @@ class ClassFileToSourceStubConverter( body, defaultValue) } + private fun isIgnored(annotations: List?): Boolean { + val kaptIgnoredAnnotationFqName = KaptIgnored::class.java.name + return annotations?.any { Type.getType(it.desc).className == kaptIgnoredAnnotationFqName } ?: false + } + private fun extractMethodSignatureTypes( descriptor: CallableDescriptor, exceptionTypes: JavacList, 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 a8bb915fbaa..420605df89d 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 @@ -23,6 +23,8 @@ import com.sun.tools.javac.util.JCDiagnostic import com.sun.tools.javac.util.Log import org.jetbrains.kotlin.cli.common.messages.MessageRenderer import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot import org.jetbrains.kotlin.codegen.CodegenTestCase import org.jetbrains.kotlin.codegen.GenerationUtils import org.jetbrains.kotlin.codegen.state.GenerationState @@ -53,6 +55,7 @@ abstract class AbstractKotlinKapt3Test : CodegenTestCase() { val javaSources = javaFilesDir?.let { arrayOf(it) } ?: emptyArray() createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.ALL, *javaSources) + addAnnotationProcessingRuntimeLibrary(myEnvironment) // Use light analysis mode in tests AnalysisHandlerExtension.registerExtension(myEnvironment.project, PartialAnalysisHandlerExtension()) @@ -164,3 +167,10 @@ abstract class AbstractKotlinKaptContextTest : AbstractKotlinKapt3Test() { } } } + +private fun addAnnotationProcessingRuntimeLibrary(environment: KotlinCoreEnvironment) { + environment.apply { + val runtimeLibrary = File(PathUtil.kotlinPathsForCompiler.libPath, "kotlin-annotation-processing-runtime.jar") + updateClasspath(listOf(JvmClasspathRoot(runtimeLibrary))) + } +} \ No newline at end of file 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 2b38e2ae615..9b0bfb37c86 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 @@ -102,6 +102,12 @@ public class ClassFileToSourceStubConverterTestGenerated extends AbstractClassFi doTest(fileName); } + @TestMetadata("ignoredMembers.kt") + public void testIgnoredMembers() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/kapt3/kapt3-compiler/testData/converter/ignoredMembers.kt"); + doTest(fileName); + } + @TestMetadata("importsForErrorTypes.kt") public void testImportsForErrorTypes() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("plugins/kapt3/kapt3-compiler/testData/converter/importsForErrorTypes.kt"); diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/ignoredMembers.kt b/plugins/kapt3/kapt3-compiler/testData/converter/ignoredMembers.kt new file mode 100644 index 00000000000..c3568428905 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/ignoredMembers.kt @@ -0,0 +1,13 @@ +import kotlinx.kapt.* + +class Test { + @KaptIgnored + fun ignoredFun() {} + + @KaptIgnored @get:KaptIgnored + val ignoredProperty: String = "" + + fun nonIgnoredFun() {} + + val nonIgnoredProperty: String = "" +} \ No newline at end of file diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/ignoredMembers.txt b/plugins/kapt3/kapt3-compiler/testData/converter/ignoredMembers.txt new file mode 100644 index 00000000000..3a402a1c451 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/ignoredMembers.txt @@ -0,0 +1,17 @@ +@kotlin.Metadata() +public final class Test { + @org.jetbrains.annotations.NotNull() + private final java.lang.String nonIgnoredProperty = ""; + + public final void nonIgnoredFun() { + } + + @org.jetbrains.annotations.NotNull() + public final java.lang.String getNonIgnoredProperty() { + return null; + } + + public Test() { + super(); + } +} diff --git a/plugins/kapt3/kapt3-runtime/src/KaptIgnored.kt b/plugins/kapt3/kapt3-runtime/src/KaptIgnored.kt index 57c287b5dd6..cd98b5c6b67 100644 --- a/plugins/kapt3/kapt3-runtime/src/KaptIgnored.kt +++ b/plugins/kapt3/kapt3-runtime/src/KaptIgnored.kt @@ -19,6 +19,7 @@ package kotlinx.kapt /** * Declaration annotated with [KaptIgnored] would not be included in stubs passed to annotation processors. */ -@Target(AnnotationTarget.FUNCTION, AnnotationTarget.FIELD) +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.FIELD, + AnnotationTarget.PROPERTY, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER) @Retention(AnnotationRetention.SOURCE) public annotation class KaptIgnored \ No newline at end of file