diff --git a/ChangeLog.md b/ChangeLog.md index cee74e35d68..d2705dc1fa0 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -892,6 +892,7 @@ These artifacts include extensions for the types available in the latter JDKs, s - [`KT-15635`](https://youtrack.jetbrains.com/issue/KT-15635) Extract Superclass/Interface: Fix bogus visibility warning inside a member when it's being moved as abstract - [`KT-15598`](https://youtrack.jetbrains.com/issue/KT-15598) Extract Interface: Red-highlight members inherited from a super-interface when that interface reference itself is not extracted - [`KT-15674`](https://youtrack.jetbrains.com/issue/KT-15674) Extract Superclass: Drop inapplicable modifiers when converting property-parameter to ordinary parameter +- [`KT-15444`](https://youtrack.jetbrains.com/issue/KT-15444) Spring Support: Consider declaration open if it's supplemented with a preconfigured annotation in corresponding compiler plugin #### Intention actions, inspections and quickfixes 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 440d152e3a3..d830be262d6 100644 --- a/ultimate/src/org/jetbrains/kotlin/idea/spring/inspections/KotlinFinalClassOrFunSpringInspection.kt +++ b/ultimate/src/org/jetbrains/kotlin/idea/spring/inspections/KotlinFinalClassOrFunSpringInspection.kt @@ -30,6 +30,9 @@ 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.descriptors.MemberDescriptor +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.inspections.AbstractKotlinInspection import org.jetbrains.kotlin.idea.spring.isAnnotatedWith import org.jetbrains.kotlin.lexer.KtTokens @@ -37,6 +40,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.isInheritable import org.jetbrains.kotlin.psi.psiUtil.isOverridable +import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode class KotlinFinalClassOrFunSpringInspection : AbstractKotlinInspection() { class QuickFix(private val element: T) : LocalQuickFix { @@ -78,14 +82,20 @@ class KotlinFinalClassOrFunSpringInspection : AbstractKotlinInspection() { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor { return object: KtVisitorVoid() { - override fun visitNamedDeclaration(declaration: KtNamedDeclaration) { - when (declaration) { - is KtClass -> if (declaration.isInheritable()) return - is KtObjectDeclaration -> {} - is KtNamedFunction -> if (declaration.isOverridable()) return - else -> return + private fun KtNamedDeclaration.isOpen(): Boolean { + when (this) { + is KtClass -> if (isInheritable()) return true + is KtObjectDeclaration -> return false + is KtNamedFunction -> if (isOverridable()) return true } + val descriptor = resolveToDescriptor(BodyResolveMode.PARTIAL) as? MemberDescriptor + return descriptor?.modality != Modality.FINAL + } + + override fun visitNamedDeclaration(declaration: KtNamedDeclaration) { + if (declaration.isOpen()) return + val message = getMessage(declaration) ?: return val fixes = if (declaration !is KtObjectDeclaration) arrayOf(QuickFix(declaration)) else LocalQuickFix.EMPTY_ARRAY diff --git a/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/inspectionData/expected.xml b/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/inspectionData/expected.xml index 001821bfc2a..c525c7ca7aa 100644 --- a/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/inspectionData/expected.xml +++ b/ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/inspectionData/expected.xml @@ -39,22 +39,6 @@ Final Kotlin class or function with Spring annotation @Bean function should be declared open - - test.kt - 51 - light_idea_test_case - - Final Kotlin class or function with Spring annotation - @Bean function should be declared open - - - test.kt - 54 - light_idea_test_case - - Final Kotlin class or function with Spring annotation - @Bean function should be declared open - test.kt 59 @@ -95,22 +79,6 @@ 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