From 53b08a1d33ad3df4d9d6f961ca33da8f131e452f Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 17 May 2016 17:42:16 +0300 Subject: [PATCH] Spring Support: Report object declarations in "Final Kotlin class or function with Spring annotation" inspection #KT-12148 Fixed --- ChangeLog.md | 1 + .../KotlinFinalClassOrFunSpringInspection.kt | 16 ++++++---- .../inspectionData/expected.xml | 32 +++++++++++++++++++ .../finalSpringAnnotatedDeclaration/test.kt | 16 +++++++++- 4 files changed, 58 insertions(+), 7 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 2720b47958c..65b7d0467f0 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -58,6 +58,7 @@ Issues fixed: - [KT-12366](https://youtrack.jetbrains.com/issue/KT-12366) Fixed exception on analyzing class declaration upon annotation typing - [KT-12122](https://youtrack.jetbrains.com/issue/KT-12122) Fixed line marker popup on functions with @Qualifier-annotated parameters - [KT-12363](https://youtrack.jetbrains.com/issue/KT-12363) Fixed "Autowired members defined in invalid Spring bean (Kotlin)" inspection description +- [KT-12148](https://youtrack.jetbrains.com/issue/KT-12148) Warn about object declarations annotated with Spring `@Configuration`/`@Component`/etc. #### Debugger diff --git a/ultimate/src/org/jetbrains/kotlin/idea/spring/inspections/KotlinFinalClassOrFunSpringInspection.kt b/ultimate/src/org/jetbrains/kotlin/idea/spring/inspections/KotlinFinalClassOrFunSpringInspection.kt index d1c38ea3cfe..440d152e3a3 100644 --- a/ultimate/src/org/jetbrains/kotlin/idea/spring/inspections/KotlinFinalClassOrFunSpringInspection.kt +++ b/ultimate/src/org/jetbrains/kotlin/idea/spring/inspections/KotlinFinalClassOrFunSpringInspection.kt @@ -54,13 +54,15 @@ class KotlinFinalClassOrFunSpringInspection : AbstractKotlinInspection() { private fun getMessage(declaration: KtNamedDeclaration): String? { when (declaration) { - is KtClass -> { + is KtClassOrObject -> { val lightClass = declaration.toLightClass() ?: return null - when { - SpringConfiguration.META.getJamElement(lightClass) != null -> return "@Configuration class should be declared open" - SpringComponent.META.getJamElement(lightClass) != null -> return "@Component class should be declared open" - SpringTransactionalComponent.META.getJamElement(lightClass) != null -> return "@Transactional class should be declared open" + val annotation = when { + SpringConfiguration.META.getJamElement(lightClass) != null -> "@Configuration" + SpringComponent.META.getJamElement(lightClass) != null -> "@Component" + SpringTransactionalComponent.META.getJamElement(lightClass) != null -> "@Transactional" + else -> return null } + return if (declaration is KtClass) "$annotation class should be declared open" else "$annotation should not be applied to object declaration " } is KtNamedFunction -> { @@ -79,17 +81,19 @@ class KotlinFinalClassOrFunSpringInspection : AbstractKotlinInspection() { override fun visitNamedDeclaration(declaration: KtNamedDeclaration) { when (declaration) { is KtClass -> if (declaration.isInheritable()) return + is KtObjectDeclaration -> {} is KtNamedFunction -> if (declaration.isOverridable()) return else -> return } val message = getMessage(declaration) ?: return + val fixes = if (declaration !is KtObjectDeclaration) arrayOf(QuickFix(declaration)) else LocalQuickFix.EMPTY_ARRAY holder.registerProblem( declaration.nameIdentifier ?: declaration, message, ProblemHighlightType.GENERIC_ERROR_OR_WARNING, - QuickFix(declaration) + *fixes ) } } diff --git a/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/inspectionData/expected.xml b/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/inspectionData/expected.xml index 676ffa9a212..001821bfc2a 100644 --- a/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/inspectionData/expected.xml +++ b/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/inspectionData/expected.xml @@ -127,4 +127,36 @@ Final Kotlin class or function with Spring annotation @Transactional function should be declared open + + test.kt + 106 + light_idea_test_case + + Final Kotlin class or function with Spring annotation + @Configuration should not be applied to object declaration + + + test.kt + 109 + light_idea_test_case + + Final Kotlin class or function with Spring annotation + @Configuration should not be applied to object declaration + + + test.kt + 112 + light_idea_test_case + + Final Kotlin class or function with Spring annotation + @Component should not be applied to object declaration + + + test.kt + 115 + light_idea_test_case + + Final Kotlin class or function with Spring annotation + @Transactional should not be applied to object declaration + diff --git a/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/test.kt b/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/test.kt index 6f9c5ef5420..26d42ace7d0 100644 --- a/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/test.kt +++ b/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/test.kt @@ -98,4 +98,18 @@ open class Trans2 { @MyTransactional open fun foo4() = Component4() -} \ No newline at end of file +} + +// Object declarations + +@Configuration +object Application5 + +@MyConfiguration +object Application6 + +@Component +object Component3 + +@Transactional +object Trans3 \ No newline at end of file