From 2692a7d35cf564f3d9d51e10f854619e9486012d Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Sat, 20 Feb 2016 23:50:06 +0300 Subject: [PATCH] Spring Support: Inspection for Spring configuration --- .../kotlin/asJava/KtLightIdentifier.kt | 1 + .../KotlinSpringFacetCode.html | 1 + .../src/META-INF/kotlin-spring.xml | 8 +++ .../KotlinSpringFacetCodeInspection.kt | 53 +++++++++++++++++++ .../UltimateInspectionTestGenerated.java | 6 +++ .../inspectionData/expected.xml | 18 +++++++ .../inspectionData/inspections.test | 2 + .../spring/unconfiguredFacet/test.kt | 15 ++++++ 8 files changed, 104 insertions(+) create mode 100644 idea/idea-ultimate/resources/inspectionDescriptions/KotlinSpringFacetCode.html create mode 100644 idea/idea-ultimate/src/org/jetbrains/kotlin/idea/spring/inspections/KotlinSpringFacetCodeInspection.kt create mode 100644 idea/testData/ultimateInspections/spring/unconfiguredFacet/inspectionData/expected.xml create mode 100644 idea/testData/ultimateInspections/spring/unconfiguredFacet/inspectionData/inspections.test create mode 100644 idea/testData/ultimateInspections/spring/unconfiguredFacet/test.kt diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightIdentifier.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightIdentifier.kt index 057f258b4e1..b3b76d59ae7 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightIdentifier.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightIdentifier.kt @@ -25,6 +25,7 @@ class KtLightIdentifier( private val lightOwner: PsiNameIdentifierOwner, private val ktDeclaration: KtNamedDeclaration? ) : LightIdentifier(lightOwner.manager, ktDeclaration?.name ?: "") { + override fun isPhysical() = true override fun getParent() = lightOwner override fun getTextRange() = ktDeclaration?.nameIdentifier?.textRange ?: TextRange.EMPTY_RANGE } \ No newline at end of file diff --git a/idea/idea-ultimate/resources/inspectionDescriptions/KotlinSpringFacetCode.html b/idea/idea-ultimate/resources/inspectionDescriptions/KotlinSpringFacetCode.html new file mode 100644 index 00000000000..dff42401299 --- /dev/null +++ b/idea/idea-ultimate/resources/inspectionDescriptions/KotlinSpringFacetCode.html @@ -0,0 +1 @@ +Ensures that Kotlin files using Spring belong to a module with a configured Spring facet. \ No newline at end of file diff --git a/idea/idea-ultimate/src/META-INF/kotlin-spring.xml b/idea/idea-ultimate/src/META-INF/kotlin-spring.xml index 12b5f6831cf..19d611f2172 100644 --- a/idea/idea-ultimate/src/META-INF/kotlin-spring.xml +++ b/idea/idea-ultimate/src/META-INF/kotlin-spring.xml @@ -13,5 +13,13 @@ groupPath="Spring,Spring Core" enabledByDefault="true" level="WARNING"/> + \ No newline at end of file diff --git a/idea/idea-ultimate/src/org/jetbrains/kotlin/idea/spring/inspections/KotlinSpringFacetCodeInspection.kt b/idea/idea-ultimate/src/org/jetbrains/kotlin/idea/spring/inspections/KotlinSpringFacetCodeInspection.kt new file mode 100644 index 00000000000..79471696e0f --- /dev/null +++ b/idea/idea-ultimate/src/org/jetbrains/kotlin/idea/spring/inspections/KotlinSpringFacetCodeInspection.kt @@ -0,0 +1,53 @@ +/* + * 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.config.SpringFacetCodeInspection +import org.jetbrains.kotlin.asJava.toLightClass +import org.jetbrains.kotlin.idea.inspections.AbstractKotlinInspection +import org.jetbrains.kotlin.psi.KtClassOrObject +import org.jetbrains.kotlin.psi.KtVisitorVoid + +class KotlinSpringFacetCodeInspection : AbstractKotlinInspection() { + private val javaInspection by lazy { SpringFacetCodeInspection() } + + override fun getDisplayName() = "Spring Facet Code Configuration (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( + classOrObject.nameIdentifier ?: classOrObject, + it.descriptionTemplate, + isOnTheFly, + it.fixes as Array, + it.highlightType + ) + holder.registerProblem(descriptor) + } + } + } + } +} diff --git a/idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/codeInsight/UltimateInspectionTestGenerated.java b/idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/codeInsight/UltimateInspectionTestGenerated.java index 0f3f21ecd0b..db0de661cb5 100644 --- a/idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/codeInsight/UltimateInspectionTestGenerated.java +++ b/idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/codeInsight/UltimateInspectionTestGenerated.java @@ -40,4 +40,10 @@ public class UltimateInspectionTestGenerated extends AbstractInspectionTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/ultimateInspections/spring/finalSpringAnnotatedDeclaration/inspectionData/inspections.test"); doTest(fileName); } + + @TestMetadata("spring/unconfiguredFacet/inspectionData/inspections.test") + public void testSpring_unconfiguredFacet_inspectionData_Inspections_test() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/ultimateInspections/spring/unconfiguredFacet/inspectionData/inspections.test"); + doTest(fileName); + } } diff --git a/idea/testData/ultimateInspections/spring/unconfiguredFacet/inspectionData/expected.xml b/idea/testData/ultimateInspections/spring/unconfiguredFacet/inspectionData/expected.xml new file mode 100644 index 00000000000..8a6bda4697b --- /dev/null +++ b/idea/testData/ultimateInspections/spring/unconfiguredFacet/inspectionData/expected.xml @@ -0,0 +1,18 @@ + + + test.kt + 12 + light_idea_test_case + + Spring Facet Code Configuration (Kotlin) + Application context not configured for this file + + + test.kt + 15 + light_idea_test_case + + Spring Facet Code Configuration (Kotlin) + Application context not configured for this file + + diff --git a/idea/testData/ultimateInspections/spring/unconfiguredFacet/inspectionData/inspections.test b/idea/testData/ultimateInspections/spring/unconfiguredFacet/inspectionData/inspections.test new file mode 100644 index 00000000000..5b39763229b --- /dev/null +++ b/idea/testData/ultimateInspections/spring/unconfiguredFacet/inspectionData/inspections.test @@ -0,0 +1,2 @@ +// INSPECTION_CLASS: org.jetbrains.kotlin.idea.spring.inspections.KotlinSpringFacetCodeInspection +// FIXTURE_CLASS: org.jetbrains.kotlin.idea.spring.tests.SpringTestFixtureExtension \ No newline at end of file diff --git a/idea/testData/ultimateInspections/spring/unconfiguredFacet/test.kt b/idea/testData/ultimateInspections/spring/unconfiguredFacet/test.kt new file mode 100644 index 00000000000..1c78223ef09 --- /dev/null +++ b/idea/testData/ultimateInspections/spring/unconfiguredFacet/test.kt @@ -0,0 +1,15 @@ + +// WITH_RUNTIME + +import org.springframework.context.annotation.ComponentScan +import org.springframework.context.annotation.Configuration + +@Configuration +@ComponentScan +annotation class MyConfiguration + +@Configuration +class Application1 + +@MyConfiguration +class Application2 \ No newline at end of file