From 905ca21799d2d7c046d2aa2f796f089e356db918 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 6 Apr 2016 18:13:31 +0300 Subject: [PATCH] Spring Support: Support @Transactional annotation in "Make annotated declaration open" inspection --- .../KotlinFinalClassOrFunSpringInspection.kt | 7 +- .../inspectionData/expected.xml | 74 ++++++++++++++++--- .../finalSpringAnnotatedDeclaration/test.kt | 36 +++++++++ .../tests/SpringTestFixtureExtension.kt | 2 +- ultimate/update_dependencies.xml | 1 + 5 files changed, 109 insertions(+), 11 deletions(-) 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 @@ +