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