diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/SortModifiersInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/SortModifiersInspection.kt index ff032429b37..53158e7c3a6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/SortModifiersInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/SortModifiersInspection.kt @@ -9,6 +9,7 @@ import com.intellij.codeInspection.* import com.intellij.openapi.project.Project import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.lexer.KtModifierKeywordToken +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.addRemoveModifier.sortModifiers import org.jetbrains.kotlin.psi.psiUtil.allChildren @@ -34,6 +35,8 @@ class SortModifiersInspection : AbstractKotlinInspection(), CleanupLocalInspecti val modifiers = modifierElements.mapNotNull { it.node.elementType as? KtModifierKeywordToken }.toList() if (modifiers.isEmpty()) return + val startElement = modifierElements.firstOrNull { it.node.elementType is KtModifierKeywordToken } ?: return + val sortedModifiers = sortModifiers(modifiers) if (modifiers == sortedModifiers && !modifiersBeforeAnnotations) return @@ -41,12 +44,16 @@ class SortModifiersInspection : AbstractKotlinInspection(), CleanupLocalInspecti "Modifiers should follow annotations" else "Non-canonical modifiers order" - holder.registerProblem( + + val descriptor = holder.manager.createProblemDescriptor( + startElement, list, message, ProblemHighlightType.GENERIC_ERROR_OR_WARNING, + isOnTheFly, SortModifiersFix(sortedModifiers) ) + holder.registerProblem(descriptor) } } } @@ -62,7 +69,10 @@ private class SortModifiersFix(private val modifiers: List + + test.kt + 4 + light_idea_test_case + + Non-canonical modifier order + Non-canonical modifiers order + + \ No newline at end of file diff --git a/idea/testData/inspections/sortModifiers/inspectionData/inspections.test b/idea/testData/inspections/sortModifiers/inspectionData/inspections.test new file mode 100644 index 00000000000..f9699c967bd --- /dev/null +++ b/idea/testData/inspections/sortModifiers/inspectionData/inspections.test @@ -0,0 +1 @@ +// INSPECTION_CLASS: org.jetbrains.kotlin.idea.inspections.SortModifiersInspection \ No newline at end of file diff --git a/idea/testData/inspections/sortModifiers/test.kt b/idea/testData/inspections/sortModifiers/test.kt new file mode 100644 index 00000000000..9659a8a3425 --- /dev/null +++ b/idea/testData/inspections/sortModifiers/test.kt @@ -0,0 +1,4 @@ +annotation class Ann + +@Ann +abstract public class Test \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/sortModifiers/annotationOverrideFinal.kt b/idea/testData/inspectionsLocal/sortModifiers/annotationOverrideFinal.kt new file mode 100644 index 00000000000..39310a62f9b --- /dev/null +++ b/idea/testData/inspectionsLocal/sortModifiers/annotationOverrideFinal.kt @@ -0,0 +1,10 @@ +annotation class Ann + +open class Base { + open fun bar() {} +} + +open class Test : Base() { + @Ann + override final fun bar() {} +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/sortModifiers/annotationOverrideFinal.kt.after b/idea/testData/inspectionsLocal/sortModifiers/annotationOverrideFinal.kt.after new file mode 100644 index 00000000000..c3e59df989d --- /dev/null +++ b/idea/testData/inspectionsLocal/sortModifiers/annotationOverrideFinal.kt.after @@ -0,0 +1,10 @@ +annotation class Ann + +open class Base { + open fun bar() {} +} + +open class Test : Base() { + @Ann + final override fun bar() {} +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/sortModifiers/overrideFinal.kt b/idea/testData/inspectionsLocal/sortModifiers/overrideFinal.kt new file mode 100644 index 00000000000..508dc654769 --- /dev/null +++ b/idea/testData/inspectionsLocal/sortModifiers/overrideFinal.kt @@ -0,0 +1,7 @@ +open class Base { + open fun foo() {} +} + +open class Test : Base() { + override final public fun foo() {} +} diff --git a/idea/testData/inspectionsLocal/sortModifiers/overrideFinal.kt.after b/idea/testData/inspectionsLocal/sortModifiers/overrideFinal.kt.after new file mode 100644 index 00000000000..378464cc9bf --- /dev/null +++ b/idea/testData/inspectionsLocal/sortModifiers/overrideFinal.kt.after @@ -0,0 +1,7 @@ +open class Base { + open fun foo() {} +} + +open class Test : Base() { + public final override fun foo() {} +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java index 9179208e505..ee5879c2598 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java @@ -372,6 +372,12 @@ public class InspectionTestGenerated extends AbstractInspectionTest { doTest(fileName); } + @TestMetadata("sortModifiers/inspectionData/inspections.test") + public void testSortModifiers_inspectionData_Inspections_test() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspections/sortModifiers/inspectionData/inspections.test"); + doTest(fileName); + } + @TestMetadata("spelling/inspectionData/inspections.test") public void testSpelling_inspectionData_Inspections_test() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspections/spelling/inspectionData/inspections.test"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index b71d7eb13a5..dd7ebc8aa17 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -4152,6 +4152,18 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { doTest(fileName); } + @TestMetadata("annotationOverrideFinal.kt") + public void testAnnotationOverrideFinal() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/sortModifiers/annotationOverrideFinal.kt"); + doTest(fileName); + } + + @TestMetadata("overrideFinal.kt") + public void testOverrideFinal() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/sortModifiers/overrideFinal.kt"); + doTest(fileName); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/sortModifiers/simple.kt");