diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index df9706e2fb7..fc36aa6cd17 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -1136,6 +1136,7 @@ fun main(args: Array) { model("quickfix/lateinit", pattern = pattern, filenameStartsLowerCase = true) model("quickfix/modifiers", pattern = pattern, filenameStartsLowerCase = true, recursive = false) model("quickfix/override/typeMismatchOnOverride", pattern = pattern, filenameStartsLowerCase = true, recursive = false) + model("quickfix/replaceWithDotCall", pattern = pattern, filenameStartsLowerCase = true) model("quickfix/replaceWithSafeCall", pattern = pattern, filenameStartsLowerCase = true) model("quickfix/variables/changeMutability", pattern = pattern, filenameStartsLowerCase = true) model("quickfix/addInitializer", pattern = pattern, filenameStartsLowerCase = true) diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt index da5216e169d..a3a03132f70 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt @@ -81,6 +81,7 @@ class MainKtQuickFixRegistrar : KtQuickFixRegistrar() { } private val expressions = KtQuickFixesListBuilder.registerPsiQuickFix { + registerPsiQuickFixes(KtFirDiagnostic.UnnecessarySafeCall::class, ReplaceWithDotCallFix) registerApplicator(ReplaceCallFixFactories.unsafeCallFactory) } diff --git a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java b/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java index 617e02f342d..9292515229d 100644 --- a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java +++ b/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java @@ -344,6 +344,11 @@ public class HighLevelQuickFixTestGenerated extends AbstractHighLevelQuickFixTes runTest("idea/testData/quickfix/expressions/unnecessarySafeCall1.kt"); } + @TestMetadata("unnecessarySafeCall2.kt") + public void testUnnecessarySafeCall2() throws Exception { + runTest("idea/testData/quickfix/expressions/unnecessarySafeCall2.kt"); + } + @TestMetadata("unsafeCall1.kt") public void testUnsafeCall1() throws Exception { runTest("idea/testData/quickfix/expressions/unsafeCall1.kt"); @@ -874,6 +879,39 @@ public class HighLevelQuickFixTestGenerated extends AbstractHighLevelQuickFixTes } } + @TestMetadata("idea/testData/quickfix/replaceWithDotCall") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ReplaceWithDotCall extends AbstractHighLevelQuickFixTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInReplaceWithDotCall() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/quickfix/replaceWithDotCall"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), null, true); + } + + @TestMetadata("comment.kt") + public void testComment() throws Exception { + runTest("idea/testData/quickfix/replaceWithDotCall/comment.kt"); + } + + @TestMetadata("functionCall.kt") + public void testFunctionCall() throws Exception { + runTest("idea/testData/quickfix/replaceWithDotCall/functionCall.kt"); + } + + @TestMetadata("lineBreak.kt") + public void testLineBreak() throws Exception { + runTest("idea/testData/quickfix/replaceWithDotCall/lineBreak.kt"); + } + + @TestMetadata("normal.kt") + public void testNormal() throws Exception { + runTest("idea/testData/quickfix/replaceWithDotCall/normal.kt"); + } + } + @TestMetadata("idea/testData/quickfix/replaceWithSafeCall") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/ReplaceCallFix.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/ReplaceCallFix.kt index 6d47295aaf4..932109fdfae 100644 --- a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/ReplaceCallFix.kt +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/ReplaceCallFix.kt @@ -11,7 +11,6 @@ import com.intellij.openapi.project.Project import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiElement import com.intellij.psi.util.PsiTreeUtil -import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* @@ -92,10 +91,10 @@ class ReplaceWithSafeCallForScopeFunctionFix( class ReplaceWithDotCallFix(expression: KtSafeQualifiedExpression) : ReplaceCallFix(expression, "."), CleanupFix { override fun getText() = KotlinBundle.message("replace.with.dot.call") - companion object : KotlinSingleIntentionActionFactory() { - override fun createAction(diagnostic: Diagnostic): IntentionAction? { - val qualifiedExpression = diagnostic.psiElement.getParentOfType(strict = false) ?: return null - return ReplaceWithDotCallFix(qualifiedExpression) + companion object : QuickFixesPsiBasedFactory(PsiElement::class, PsiElementSuitabilityCheckers.ALWAYS_SUITABLE) { + override fun doCreateQuickFix(psiElement: PsiElement): List { + val qualifiedExpression = psiElement.getParentOfType(strict = false) ?: return emptyList() + return listOfNotNull(ReplaceWithDotCallFix(qualifiedExpression)) } } } diff --git a/idea/testData/quickfix/expressions/unnecessarySafeCall1.kt b/idea/testData/quickfix/expressions/unnecessarySafeCall1.kt index 6962edcd53b..a80a65cd47d 100644 --- a/idea/testData/quickfix/expressions/unnecessarySafeCall1.kt +++ b/idea/testData/quickfix/expressions/unnecessarySafeCall1.kt @@ -1,6 +1,4 @@ // "Replace with dot call" "true" fun foo(a: Any) { a?.equals(0) -} - -/* IGNORE_FIR */ \ No newline at end of file +} \ No newline at end of file diff --git a/idea/testData/quickfix/expressions/unnecessarySafeCall1.kt.after b/idea/testData/quickfix/expressions/unnecessarySafeCall1.kt.after index 4cdd8f60099..d10697262b6 100644 --- a/idea/testData/quickfix/expressions/unnecessarySafeCall1.kt.after +++ b/idea/testData/quickfix/expressions/unnecessarySafeCall1.kt.after @@ -1,6 +1,4 @@ // "Replace with dot call" "true" fun foo(a: Any) { a.equals(0) -} - -/* IGNORE_FIR */ \ No newline at end of file +} \ No newline at end of file diff --git a/idea/testData/quickfix/expressions/unnecessarySafeCall2.kt b/idea/testData/quickfix/expressions/unnecessarySafeCall2.kt new file mode 100644 index 00000000000..da8ed45ad8b --- /dev/null +++ b/idea/testData/quickfix/expressions/unnecessarySafeCall2.kt @@ -0,0 +1,4 @@ +// "Replace with dot call" "true" +fun Any.foo() { + this?.equals(0) +} \ No newline at end of file diff --git a/idea/testData/quickfix/expressions/unnecessarySafeCall2.kt.after b/idea/testData/quickfix/expressions/unnecessarySafeCall2.kt.after index 1524b0526a4..46ed3f14650 100644 --- a/idea/testData/quickfix/expressions/unnecessarySafeCall2.kt.after +++ b/idea/testData/quickfix/expressions/unnecessarySafeCall2.kt.after @@ -1,7 +1,4 @@ // "Replace with dot call" "true" -fun foo(a: Any) { - when (a) { - .equals(0) => true - else => false - } +fun Any.foo() { + this.equals(0) } \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 387f2af94cb..3d727344974 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -7757,6 +7757,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/expressions/unnecessarySafeCall1.kt"); } + @TestMetadata("unnecessarySafeCall2.kt") + public void testUnnecessarySafeCall2() throws Exception { + runTest("idea/testData/quickfix/expressions/unnecessarySafeCall2.kt"); + } + @TestMetadata("unsafeCall1.kt") public void testUnsafeCall1() throws Exception { runTest("idea/testData/quickfix/expressions/unsafeCall1.kt");