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