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 e2778817373..d1c38ea3cfe 100644
--- a/ultimate/src/org/jetbrains/kotlin/idea/spring/inspections/KotlinFinalClassOrFunSpringInspection.kt
+++ b/ultimate/src/org/jetbrains/kotlin/idea/spring/inspections/KotlinFinalClassOrFunSpringInspection.kt
@@ -27,6 +27,7 @@ import com.intellij.psi.PsiElementVisitor
import com.intellij.spring.constants.SpringAnnotationsConstants
import com.intellij.spring.model.jam.stereotype.SpringComponent
import com.intellij.spring.model.jam.stereotype.SpringConfiguration
+import com.intellij.spring.model.jam.transaction.SpringTransactionalComponent
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.asJava.toLightMethods
import org.jetbrains.kotlin.idea.inspections.AbstractKotlinInspection
@@ -58,12 +59,16 @@ class KotlinFinalClassOrFunSpringInspection : AbstractKotlinInspection() {
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"
}
}
is KtNamedFunction -> {
val lightMethod = declaration.toLightMethods().firstOrNull() ?: return null
- if (lightMethod.isAnnotatedWith(SpringAnnotationsConstants.JAVA_SPRING_BEAN)) return "@Bean function should be declared open"
+ when {
+ lightMethod.isAnnotatedWith(SpringAnnotationsConstants.JAVA_SPRING_BEAN) -> return "@Bean function should be declared open"
+ lightMethod.isAnnotatedWith(SpringAnnotationsConstants.TRANSACTIONAL) -> return "@Transactional function should be declared open"
+ }
}
}
return null
diff --git a/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/inspectionData/expected.xml b/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/inspectionData/expected.xml
index b8aa7b0bd5b..676ffa9a212 100644
--- a/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/inspectionData/expected.xml
+++ b/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/inspectionData/expected.xml
@@ -1,7 +1,7 @@
test.kt
- 18
+ 22
light_idea_test_case
Final Kotlin class or function with Spring annotation
@@ -9,7 +9,7 @@
test.kt
- 21
+ 25
light_idea_test_case
Final Kotlin class or function with Spring annotation
@@ -17,7 +17,7 @@
test.kt
- 32
+ 36
light_idea_test_case
Final Kotlin class or function with Spring annotation
@@ -25,7 +25,7 @@
test.kt
- 41
+ 45
light_idea_test_case
Final Kotlin class or function with Spring annotation
@@ -33,7 +33,7 @@
test.kt
- 44
+ 48
light_idea_test_case
Final Kotlin class or function with Spring annotation
@@ -41,7 +41,7 @@
test.kt
- 47
+ 51
light_idea_test_case
Final Kotlin class or function with Spring annotation
@@ -49,7 +49,7 @@
test.kt
- 50
+ 54
light_idea_test_case
Final Kotlin class or function with Spring annotation
@@ -57,7 +57,7 @@
test.kt
- 55
+ 59
light_idea_test_case
Final Kotlin class or function with Spring annotation
@@ -65,10 +65,66 @@
test.kt
- 58
+ 62
light_idea_test_case
Final Kotlin class or function with Spring annotation
@Bean function should be declared open
+
+ test.kt
+ 74
+ light_idea_test_case
+
+ Final Kotlin class or function with Spring annotation
+ @Transactional class should be declared open
+
+
+ test.kt
+ 76
+ light_idea_test_case
+
+ Final Kotlin class or function with Spring annotation
+ @Transactional function should be declared open
+
+
+ test.kt
+ 79
+ light_idea_test_case
+
+ Final Kotlin class or function with Spring annotation
+ @Transactional function should be declared open
+
+
+ test.kt
+ 82
+ light_idea_test_case
+
+ Final Kotlin class or function with Spring annotation
+ @Transactional function should be declared open
+
+
+ test.kt
+ 85
+ light_idea_test_case
+
+ Final Kotlin class or function with Spring annotation
+ @Transactional function should be declared open
+
+
+ test.kt
+ 91
+ light_idea_test_case
+
+ Final Kotlin class or function with Spring annotation
+ @Transactional function should be declared open
+
+
+ test.kt
+ 94
+ light_idea_test_case
+
+ Final Kotlin class or function with Spring annotation
+ @Transactional function should be declared open
+
diff --git a/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/test.kt b/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/test.kt
index c2d12b07e27..6f9c5ef5420 100644
--- a/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/test.kt
+++ b/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/test.kt
@@ -5,6 +5,7 @@ import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration
import org.springframework.stereotype.Component
+import org.springframework.transaction.annotation.Transactional
@Configuration
annotation class MyConfiguration
@@ -12,6 +13,9 @@ annotation class MyConfiguration
@Bean
annotation class MyBean
+@Transactional
+annotation class MyTransactional
+
// @Configuration
@Configuration
@@ -62,4 +66,36 @@ open class Utils2 {
@MyBean
open fun foo4() = Component4()
+}
+
+// @Transactional
+
+@Transactional
+class Trans1 {
+ @Transactional
+ fun foo1() = Component1()
+
+ @MyTransactional
+ fun foo2() = Component2()
+
+ @Transactional
+ open fun foo3() = Component3()
+
+ @MyTransactional
+ open fun foo4() = Component4()
+}
+
+@Transactional
+open class Trans2 {
+ @Transactional
+ fun foo1() = Component1()
+
+ @MyTransactional
+ fun foo2() = Component2()
+
+ @Transactional
+ open fun foo3() = Component3()
+
+ @MyTransactional
+ open fun foo4() = Component4()
}
\ No newline at end of file
diff --git a/ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/SpringTestFixtureExtension.kt b/ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/SpringTestFixtureExtension.kt
index aa2f5ec7321..7d6af619bf9 100644
--- a/ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/SpringTestFixtureExtension.kt
+++ b/ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/SpringTestFixtureExtension.kt
@@ -36,7 +36,7 @@ class SpringTestFixtureExtension() : TestFixtureExtension {
enum class SpringFramework(val version: String, vararg val artifactIds: String) {
FRAMEWORK_4_2_0(
"4.2.0.RELEASE",
- "core", "beans", "context"
+ "core", "beans", "context", "tx"
)
}
diff --git a/ultimate/update_dependencies.xml b/ultimate/update_dependencies.xml
index 530e3d6b429..a159e4e2ed3 100644
--- a/ultimate/update_dependencies.xml
+++ b/ultimate/update_dependencies.xml
@@ -31,6 +31,7 @@
+