From 1deba19e1c2abab521a17cb38eebd2d2f5f988ae Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Thu, 19 Sep 2019 19:20:06 +0300 Subject: [PATCH] Refactoring NoArg compiler plugin Remove NoArgClassKey relation betwen AbstractNoArgDeclarationChecker and NoArgExpressionCodegenExtension Separate NoArgExpressionCodegenExtension to Ide and Cli versions --- idea/resources/META-INF/jvm.xml | 2 +- idea/resources/META-INF/jvm.xml.183 | 2 +- ...bstractNoArgExpressionCodegenExtension.kt} | 16 ++++++++++---- plugins/noarg/noarg-cli/src/NoArgClassKey.kt | 21 ------------------- plugins/noarg/noarg-cli/src/NoArgPlugin.kt | 2 +- .../diagnostic/CliNoArgDeclarationChecker.kt | 16 ++++++-------- .../AbstractBlackBoxCodegenTestForNoArg.kt | 17 +++------------ .../AbstractBytecodeListingTestForNoArg.kt | 2 +- .../src/IdeArgExpressionCodegenExtension.kt | 21 +++++++++++++++++++ 9 files changed, 46 insertions(+), 53 deletions(-) rename plugins/noarg/noarg-cli/src/{NoArgExpressionCodegenExtension.kt => AbstractNoArgExpressionCodegenExtension.kt} (86%) delete mode 100644 plugins/noarg/noarg-cli/src/NoArgClassKey.kt create mode 100644 plugins/noarg/noarg-ide/src/IdeArgExpressionCodegenExtension.kt diff --git a/idea/resources/META-INF/jvm.xml b/idea/resources/META-INF/jvm.xml index 866d3914cd6..eed12b6c756 100644 --- a/idea/resources/META-INF/jvm.xml +++ b/idea/resources/META-INF/jvm.xml @@ -201,7 +201,7 @@ - + diff --git a/idea/resources/META-INF/jvm.xml.183 b/idea/resources/META-INF/jvm.xml.183 index 2c18b264ff8..c42f0b7c995 100644 --- a/idea/resources/META-INF/jvm.xml.183 +++ b/idea/resources/META-INF/jvm.xml.183 @@ -201,7 +201,7 @@ - + diff --git a/plugins/noarg/noarg-cli/src/NoArgExpressionCodegenExtension.kt b/plugins/noarg/noarg-cli/src/AbstractNoArgExpressionCodegenExtension.kt similarity index 86% rename from plugins/noarg/noarg-cli/src/NoArgExpressionCodegenExtension.kt rename to plugins/noarg/noarg-cli/src/AbstractNoArgExpressionCodegenExtension.kt index 86775c82fff..f8c3ab44c1d 100644 --- a/plugins/noarg/noarg-cli/src/NoArgExpressionCodegenExtension.kt +++ b/plugins/noarg/noarg-cli/src/AbstractNoArgExpressionCodegenExtension.kt @@ -12,7 +12,9 @@ import org.jetbrains.kotlin.codegen.extensions.ExpressionCodegenExtension import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl +import org.jetbrains.kotlin.extensions.AnnotationBasedExtension import org.jetbrains.kotlin.psi.KtClass +import org.jetbrains.kotlin.psi.KtModifierListOwner import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny import org.jetbrains.kotlin.resolve.jvm.AsmTypes @@ -21,7 +23,15 @@ import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.org.objectweb.asm.Opcodes -class NoArgExpressionCodegenExtension(val invokeInitializers: Boolean = false) : ExpressionCodegenExtension { + +class CliNoArgExpressionCodegenExtension(private val annotations: List, invokeInitializers: Boolean = false) : + AbstractNoArgExpressionCodegenExtension(invokeInitializers) { + + override fun getAnnotationFqNames(modifierListOwner: KtModifierListOwner?): List = annotations +} + +abstract class AbstractNoArgExpressionCodegenExtension(val invokeInitializers: Boolean) : ExpressionCodegenExtension, AnnotationBasedExtension { + override fun generateClassSyntheticParts(codegen: ImplementationBodyCodegen) = with(codegen) { if (shouldGenerateNoArgConstructor()) { generateNoArgConstructor() @@ -71,12 +81,10 @@ class NoArgExpressionCodegenExtension(val invokeInitializers: Boolean = false) : } } - private fun KtClass.isNoArgClass() = this.getUserData(NO_ARG_CLASS_KEY) ?: false - private fun ImplementationBodyCodegen.shouldGenerateNoArgConstructor(): Boolean { val origin = myClass as? KtClass ?: return false - if (descriptor.kind != ClassKind.CLASS || !origin.isNoArgClass()) { + if (descriptor.kind != ClassKind.CLASS || !descriptor.hasSpecialAnnotation(origin)) { return false } diff --git a/plugins/noarg/noarg-cli/src/NoArgClassKey.kt b/plugins/noarg/noarg-cli/src/NoArgClassKey.kt deleted file mode 100644 index e7daf12b785..00000000000 --- a/plugins/noarg/noarg-cli/src/NoArgClassKey.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2010-2016 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.noarg - -import com.intellij.openapi.util.Key - -val NO_ARG_CLASS_KEY = Key("org.jetbrains.kotlin.noarg.NoArgClassKey") \ No newline at end of file diff --git a/plugins/noarg/noarg-cli/src/NoArgPlugin.kt b/plugins/noarg/noarg-cli/src/NoArgPlugin.kt index 5dd7dbc4414..0fa73c79ee7 100644 --- a/plugins/noarg/noarg-cli/src/NoArgPlugin.kt +++ b/plugins/noarg/noarg-cli/src/NoArgPlugin.kt @@ -83,7 +83,7 @@ class NoArgComponentRegistrar : ComponentRegistrar { StorageComponentContainerContributor.registerExtension(project, CliNoArgComponentContainerContributor(annotations)) val invokeInitializers = configuration[INVOKE_INITIALIZERS] ?: false - ExpressionCodegenExtension.registerExtension(project, NoArgExpressionCodegenExtension(invokeInitializers)) + ExpressionCodegenExtension.registerExtension(project, CliNoArgExpressionCodegenExtension(annotations, invokeInitializers)) } } diff --git a/plugins/noarg/noarg-cli/src/org/jetbrains/kotlin/noarg/diagnostic/CliNoArgDeclarationChecker.kt b/plugins/noarg/noarg-cli/src/org/jetbrains/kotlin/noarg/diagnostic/CliNoArgDeclarationChecker.kt index 39597a1aff5..42bdf2d8ba7 100644 --- a/plugins/noarg/noarg-cli/src/org/jetbrains/kotlin/noarg/diagnostic/CliNoArgDeclarationChecker.kt +++ b/plugins/noarg/noarg-cli/src/org/jetbrains/kotlin/noarg/diagnostic/CliNoArgDeclarationChecker.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.noarg.diagnostic import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.diagnostics.reportFromPlugin import org.jetbrains.kotlin.extensions.AnnotationBasedExtension -import org.jetbrains.kotlin.noarg.NO_ARG_CLASS_KEY import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtModifierListOwner @@ -27,7 +26,7 @@ import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny -class CliNoArgDeclarationChecker(val noArgAnnotationFqNames: List) : AbstractNoArgDeclarationChecker() { +class CliNoArgDeclarationChecker(private val noArgAnnotationFqNames: List) : AbstractNoArgDeclarationChecker() { override fun getAnnotationFqNames(modifierListOwner: KtModifierListOwner?) = noArgAnnotationFqNames } @@ -36,15 +35,12 @@ abstract class AbstractNoArgDeclarationChecker : DeclarationChecker, AnnotationB // Handle only classes if (descriptor !is ClassDescriptor || declaration !is KtClass) return if (descriptor.kind != ClassKind.CLASS) return + if (!descriptor.hasSpecialAnnotation(declaration)) return - val hasSpecialAnnotation = descriptor.hasSpecialAnnotation(declaration) - declaration.putUserData(NO_ARG_CLASS_KEY, hasSpecialAnnotation) - if (hasSpecialAnnotation) { - val superClass = descriptor.getSuperClassOrAny() - if (superClass.constructors.none { it.isNoArgConstructor() } && !superClass.hasSpecialAnnotation(declaration)) { - val reportTarget = declaration.nameIdentifier ?: declaration.getClassOrInterfaceKeyword() ?: declaration - context.trace.reportFromPlugin(ErrorsNoArg.NO_NOARG_CONSTRUCTOR_IN_SUPERCLASS.on(reportTarget), DefaultErrorMessagesNoArg) - } + val superClass = descriptor.getSuperClassOrAny() + if (superClass.constructors.none { it.isNoArgConstructor() } && !superClass.hasSpecialAnnotation(declaration)) { + val reportTarget = declaration.nameIdentifier ?: declaration.getClassOrInterfaceKeyword() ?: declaration + context.trace.reportFromPlugin(ErrorsNoArg.NO_NOARG_CONSTRUCTOR_IN_SUPERCLASS.on(reportTarget), DefaultErrorMessagesNoArg) } } diff --git a/plugins/noarg/noarg-cli/test/org/jetbrains/kotlin/noarg/AbstractBlackBoxCodegenTestForNoArg.kt b/plugins/noarg/noarg-cli/test/org/jetbrains/kotlin/noarg/AbstractBlackBoxCodegenTestForNoArg.kt index 9897322b370..8175da2f181 100644 --- a/plugins/noarg/noarg-cli/test/org/jetbrains/kotlin/noarg/AbstractBlackBoxCodegenTestForNoArg.kt +++ b/plugins/noarg/noarg-cli/test/org/jetbrains/kotlin/noarg/AbstractBlackBoxCodegenTestForNoArg.kt @@ -1,17 +1,6 @@ /* - * Copyright 2010-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ package org.jetbrains.kotlin.noarg @@ -26,7 +15,7 @@ abstract class AbstractBlackBoxCodegenTestForNoArg : AbstractBlackBoxCodegenTest val project = myEnvironment.project registerExtension(project, CliNoArgComponentContainerContributor(NOARG_ANNOTATIONS)) val invokeInitializers = files.any { "// INVOKE_INITIALIZERS" in it.content } - ExpressionCodegenExtension.registerExtension(project, NoArgExpressionCodegenExtension(invokeInitializers)) + ExpressionCodegenExtension.registerExtension(project, CliNoArgExpressionCodegenExtension(NOARG_ANNOTATIONS, invokeInitializers)) super.loadMultiFiles(files) } diff --git a/plugins/noarg/noarg-cli/test/org/jetbrains/kotlin/noarg/AbstractBytecodeListingTestForNoArg.kt b/plugins/noarg/noarg-cli/test/org/jetbrains/kotlin/noarg/AbstractBytecodeListingTestForNoArg.kt index 5995160c3a2..2dff5c63275 100644 --- a/plugins/noarg/noarg-cli/test/org/jetbrains/kotlin/noarg/AbstractBytecodeListingTestForNoArg.kt +++ b/plugins/noarg/noarg-cli/test/org/jetbrains/kotlin/noarg/AbstractBytecodeListingTestForNoArg.kt @@ -29,6 +29,6 @@ abstract class AbstractBytecodeListingTestForNoArg : AbstractBytecodeListingTest override fun setupEnvironment(environment: KotlinCoreEnvironment) { val project = environment.project StorageComponentContainerContributor.registerExtension(project, CliNoArgComponentContainerContributor(NOARG_ANNOTATIONS)) - ExpressionCodegenExtension.registerExtension(project, NoArgExpressionCodegenExtension(false)) + ExpressionCodegenExtension.registerExtension(project, CliNoArgExpressionCodegenExtension(NOARG_ANNOTATIONS, false)) } } \ No newline at end of file diff --git a/plugins/noarg/noarg-ide/src/IdeArgExpressionCodegenExtension.kt b/plugins/noarg/noarg-ide/src/IdeArgExpressionCodegenExtension.kt new file mode 100644 index 00000000000..f1cdbb89606 --- /dev/null +++ b/plugins/noarg/noarg-ide/src/IdeArgExpressionCodegenExtension.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.noarg.ide + +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.annotation.plugin.ide.CachedAnnotationNames +import org.jetbrains.kotlin.annotation.plugin.ide.getAnnotationNames +import org.jetbrains.kotlin.noarg.AbstractNoArgExpressionCodegenExtension +import org.jetbrains.kotlin.psi.KtModifierListOwner + +class IdeNoArgExpressionCodegenExtension(project: Project) : + AbstractNoArgExpressionCodegenExtension(invokeInitializers = false) { + + private val cachedAnnotationsNames = CachedAnnotationNames(project, NO_ARG_ANNOTATION_OPTION_PREFIX) + + override fun getAnnotationFqNames(modifierListOwner: KtModifierListOwner?): List = + cachedAnnotationsNames.getAnnotationNames(modifierListOwner) +}