Spring Support: Consider declaration open if it's supplemented with a preconfigured annotation in corresponding compiler plugin

#KT-15444 Fixed
This commit is contained in:
Alexey Sedunov
2017-01-12 20:41:15 +03:00
parent f73d32afeb
commit 60edc46d8c
3 changed files with 17 additions and 38 deletions
+1
View File
@@ -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-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-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-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 #### Intention actions, inspections and quickfixes
@@ -30,6 +30,9 @@ import com.intellij.spring.model.jam.stereotype.SpringConfiguration
import com.intellij.spring.model.jam.transaction.SpringTransactionalComponent import com.intellij.spring.model.jam.transaction.SpringTransactionalComponent
import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.asJava.toLightMethods 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.inspections.AbstractKotlinInspection
import org.jetbrains.kotlin.idea.spring.isAnnotatedWith import org.jetbrains.kotlin.idea.spring.isAnnotatedWith
import org.jetbrains.kotlin.lexer.KtTokens 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.containingClassOrObject
import org.jetbrains.kotlin.psi.psiUtil.isInheritable import org.jetbrains.kotlin.psi.psiUtil.isInheritable
import org.jetbrains.kotlin.psi.psiUtil.isOverridable import org.jetbrains.kotlin.psi.psiUtil.isOverridable
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
class KotlinFinalClassOrFunSpringInspection : AbstractKotlinInspection() { class KotlinFinalClassOrFunSpringInspection : AbstractKotlinInspection() {
class QuickFix<T: KtModifierListOwner>(private val element: T) : LocalQuickFix { class QuickFix<T: KtModifierListOwner>(private val element: T) : LocalQuickFix {
@@ -78,14 +82,20 @@ class KotlinFinalClassOrFunSpringInspection : AbstractKotlinInspection() {
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
return object: KtVisitorVoid() { return object: KtVisitorVoid() {
override fun visitNamedDeclaration(declaration: KtNamedDeclaration) { private fun KtNamedDeclaration.isOpen(): Boolean {
when (declaration) { when (this) {
is KtClass -> if (declaration.isInheritable()) return is KtClass -> if (isInheritable()) return true
is KtObjectDeclaration -> {} is KtObjectDeclaration -> return false
is KtNamedFunction -> if (declaration.isOverridable()) return is KtNamedFunction -> if (isOverridable()) return true
else -> return
} }
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 message = getMessage(declaration) ?: return
val fixes = if (declaration !is KtObjectDeclaration) arrayOf(QuickFix(declaration)) else LocalQuickFix.EMPTY_ARRAY val fixes = if (declaration !is KtObjectDeclaration) arrayOf(QuickFix(declaration)) else LocalQuickFix.EMPTY_ARRAY
@@ -39,22 +39,6 @@
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Final Kotlin class or function with Spring annotation</problem_class> <problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Final Kotlin class or function with Spring annotation</problem_class>
<description>@Bean function should be declared open</description> <description>@Bean function should be declared open</description>
</problem> </problem>
<problem>
<file>test.kt</file>
<line>51</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/test.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Final Kotlin class or function with Spring annotation</problem_class>
<description>@Bean function should be declared open</description>
</problem>
<problem>
<file>test.kt</file>
<line>54</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/test.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Final Kotlin class or function with Spring annotation</problem_class>
<description>@Bean function should be declared open</description>
</problem>
<problem> <problem>
<file>test.kt</file> <file>test.kt</file>
<line>59</line> <line>59</line>
@@ -95,22 +79,6 @@
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Final Kotlin class or function with Spring annotation</problem_class> <problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Final Kotlin class or function with Spring annotation</problem_class>
<description>@Transactional function should be declared open</description> <description>@Transactional function should be declared open</description>
</problem> </problem>
<problem>
<file>test.kt</file>
<line>82</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/test.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Final Kotlin class or function with Spring annotation</problem_class>
<description>@Transactional function should be declared open</description>
</problem>
<problem>
<file>test.kt</file>
<line>85</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/test.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Final Kotlin class or function with Spring annotation</problem_class>
<description>@Transactional function should be declared open</description>
</problem>
<problem> <problem>
<file>test.kt</file> <file>test.kt</file>
<line>91</line> <line>91</line>