diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index acb1731cf6e..25e45dfb573 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -642,5 +642,7 @@ class QuickFixRegistrar : QuickFixContributor { MUST_BE_INITIALIZED.registerFactory(ChangeVariableMutabilityFix.MUST_BE_INITIALIZED_FACTORY) TOO_MANY_ARGUMENTS.registerFactory(RemoveArgumentFix) + + FUN_INTERFACE_WRONG_COUNT_OF_ABSTRACT_MEMBERS.registerFactory(RemoveModifierFix.createRemoveFunFromInterfaceFactory()) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveModifierFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveModifierFix.kt index 485e9860bcc..926e6989d59 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveModifierFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveModifierFix.kt @@ -120,5 +120,18 @@ class RemoveModifierFix( } } } + + fun createRemoveFunFromInterfaceFactory(): KotlinSingleIntentionActionFactory { + return object : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): RemoveModifierFix? { + val keyword = diagnostic.psiElement + val modifierList = keyword.parent as? KtDeclarationModifierList ?: return null + val funInterface = (modifierList.parent as? KtClass)?.takeIf { + it.isInterface() && it.hasModifier(KtTokens.FUN_KEYWORD) + } ?: return null + return RemoveModifierFix(funInterface, KtTokens.FUN_KEYWORD, isRedundant = false) + } + } + } } } diff --git a/idea/testData/quickfix/redundantFun/simple.kt b/idea/testData/quickfix/redundantFun/simple.kt new file mode 100644 index 00000000000..e92ba557325 --- /dev/null +++ b/idea/testData/quickfix/redundantFun/simple.kt @@ -0,0 +1,2 @@ +// "Remove 'fun' modifier" "true" +fun interface WrongFunFace \ No newline at end of file diff --git a/idea/testData/quickfix/redundantFun/simple.kt.after b/idea/testData/quickfix/redundantFun/simple.kt.after new file mode 100644 index 00000000000..649348ce375 --- /dev/null +++ b/idea/testData/quickfix/redundantFun/simple.kt.after @@ -0,0 +1,2 @@ +// "Remove 'fun' modifier" "true" +interface WrongFunFace \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java index ca5f545e735..32f4be549bc 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java @@ -3619,6 +3619,19 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes } } + @TestMetadata("idea/testData/quickfix/redundantFun") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class RedundantFun extends AbstractQuickFixMultiFileTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTestWithExtraFile, this, testDataFilePath); + } + + public void testAllFilesPresentInRedundantFun() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/quickfix/redundantFun"), Pattern.compile("^(\\w+)\\.((before\\.Main\\.\\w+)|(test))$"), null, true); + } + } + @TestMetadata("idea/testData/quickfix/redundantIf") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 183f89b8fd5..1c0c7bc810b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -10199,6 +10199,24 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { } } + @TestMetadata("idea/testData/quickfix/redundantFun") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class RedundantFun extends AbstractQuickFixTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInRedundantFun() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/quickfix/redundantFun"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), null, true); + } + + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + runTest("idea/testData/quickfix/redundantFun/simple.kt"); + } + } + @TestMetadata("idea/testData/quickfix/redundantIf") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)