Spring Support: Support "Autowired members defined in invalid Spring bean" inspection on Kotlin declarations

#KT-12079 Fixed
This commit is contained in:
Alexey Sedunov
2016-04-27 12:59:05 +03:00
parent d4aa179336
commit 44f565e600
11 changed files with 105 additions and 1 deletions
+1
View File
@@ -21,6 +21,7 @@ New features:
- Apply injection for the literals in property initializer through property usages
- Enable injection from Java or Kotlin function declaration by annotating parameter with @Language annotation
- [KT-11807](https://youtrack.jetbrains.com/issue/KT-11807) Use function body template when generating overriding functions with default body
- [KT-12079](https://youtrack.jetbrains.com/issue/KT-12079) Support "Autowired members defined in invalid Spring bean" inspection on Kotlin declarations
Issues fixed:
@@ -92,6 +92,8 @@ class KtLightAnnotation(
}
}
override fun isPhysical() = true
override fun getName() = null
override fun setName(newName: String) = throw IncorrectOperationException()
@@ -0,0 +1 @@
Checks that autowired members are defined in valid Spring bean (@Component|@Service|...).
+8
View File
@@ -22,6 +22,14 @@
enabledByDefault="true"
level="WARNING"
implementationClass="org.jetbrains.kotlin.idea.spring.inspections.KotlinSpringFacetCodeInspection"/>
<localInspection language="kotlin"
displayName="Autowired members defined in invalid Spring bean (Kotlin)"
groupBundle="resources.messages.SpringBundle"
groupKey="inspection.group.code"
groupPath="Spring,Spring Core"
enabledByDefault="true"
level="WARNING"
implementationClass="org.jetbrains.kotlin.idea.spring.inspections.SpringKotlinAutowiredMembersInspection"/>
</extensions>
<actions>
@@ -0,0 +1,54 @@
/*
* Copyright 2010-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.idea.spring.inspections
import com.intellij.codeInspection.LocalQuickFix
import com.intellij.codeInspection.ProblemsHolder
import com.intellij.psi.PsiElementVisitor
import com.intellij.spring.model.highlighting.SpringJavaAutowiredMembersInspection
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.asJava.unwrapped
import org.jetbrains.kotlin.idea.inspections.AbstractKotlinInspection
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtVisitorVoid
class SpringKotlinAutowiredMembersInspection : AbstractKotlinInspection() {
private val javaInspection by lazy { SpringJavaAutowiredMembersInspection() }
override fun getDisplayName() = "Autowired members defined in invalid Spring bean (Kotlin)"
override fun getGroupDisplayName() = "Code"
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
return object: KtVisitorVoid() {
override fun visitClassOrObject(classOrObject: KtClassOrObject) {
val lightClass = classOrObject.toLightClass() ?: return
javaInspection.checkClass(lightClass, holder.manager, isOnTheFly)?.forEach {
@Suppress("UNCHECKED_CAST")
val descriptor = holder.manager.createProblemDescriptor(
it.psiElement.unwrapped ?: it.psiElement,
it.descriptionTemplate,
isOnTheFly,
it.fixes as? Array<LocalQuickFix> ?: LocalQuickFix.EMPTY_ARRAY,
it.highlightType
)
holder.registerProblem(descriptor)
}
}
}
}
}
@@ -0,0 +1,10 @@
<problems>
<problem>
<file>test.kt</file>
<line>9</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/test.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Autowired members defined in invalid Spring bean (Kotlin)</problem_class>
<description>Autowired members must be defined in valid Spring bean (@Component|@Service|...)</description>
</problem>
</problems>
@@ -0,0 +1,2 @@
// INSPECTION_CLASS: org.jetbrains.kotlin.idea.spring.inspections.SpringKotlinAutowiredMembersInspection
// FIXTURE_CLASS: org.jetbrains.kotlin.idea.spring.tests.SpringTestFixtureExtension
@@ -0,0 +1,19 @@
// WITH_RUNTIME
import org.springframework.stereotype.Component
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.context.support.SpringBeanAutowiringSupport
open class KtBean1 {
@Autowired var foo: Int = 1
}
@Component
open class KtBean2 {
@Autowired var foo: Int = 1
}
open class KtBean3 : SpringBeanAutowiringSupport() {
@Autowired var foo: Int = 1
}
@@ -35,6 +35,12 @@ public class UltimateInspectionTestGenerated extends AbstractInspectionTest {
KotlinTestUtils.assertAllTestsPresentInSingleGeneratedClass(this.getClass(), new File("ultimate/testData/inspections"), Pattern.compile("^(inspections\\.test)$"));
}
@TestMetadata("spring/autowiredMembersInInvalidClass/inspectionData/inspections.test")
public void testSpring_autowiredMembersInInvalidClass_inspectionData_Inspections_test() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("ultimate/testData/inspections/spring/autowiredMembersInInvalidClass/inspectionData/inspections.test");
doTest(fileName);
}
@TestMetadata("spring/finalSpringAnnotatedDeclaration/inspectionData/inspections.test")
public void testSpring_finalSpringAnnotatedDeclaration_inspectionData_Inspections_test() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("ultimate/testData/inspections/spring/finalSpringAnnotatedDeclaration/inspectionData/inspections.test");
@@ -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", "tx"
"core", "beans", "context", "tx", "web"
)
}
+1
View File
@@ -32,6 +32,7 @@
<get-spring-library lib="spring-beans" version="4.2.0.RELEASE"/>
<get-spring-library lib="spring-context" version="4.2.0.RELEASE"/>
<get-spring-library lib="spring-tx" version="4.2.0.RELEASE"/>
<get-spring-library lib="spring-web" version="4.2.0.RELEASE"/>
</target>
<!-- Override fetch-third-party from the main buildfile -->