diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 9b8f50208c1..621aa87da82 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -132,6 +132,9 @@ class QuickFixRegistrar : QuickFixContributor { NON_PRIVATE_CONSTRUCTOR_IN_ENUM.registerFactory(removeModifierFactory) NON_PRIVATE_CONSTRUCTOR_IN_SEALED.registerFactory(removeModifierFactory) + DEPRECATED_BINARY_MOD.registerFactory(removeModifierFactory) + DEPRECATED_BINARY_MOD.registerFactory(RenameModToRemFix.Factory) + UNRESOLVED_REFERENCE.registerFactory(ImportMemberFix) UNRESOLVED_REFERENCE.registerFactory(ImportFix) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/RenameModToRemFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/RenameModToRemFix.kt new file mode 100644 index 00000000000..00d69eedce5 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/RenameModToRemFix.kt @@ -0,0 +1,51 @@ +/* + * 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.quickfix + +import com.intellij.codeInsight.intention.IntentionAction +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import com.intellij.refactoring.rename.RenameProcessor +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtNamedFunction +import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType +import org.jetbrains.kotlin.types.expressions.OperatorConventions.REM_TO_MOD_OPERATION_NAMES + +class RenameModToRemFix(element: KtNamedFunction, val newName: Name) : KotlinQuickFixAction(element) { + override fun getText(): String = "Rename to '$newName'" + + override fun getFamilyName(): String = text + + override fun startInWriteAction(): Boolean = false + + override fun invoke(project: Project, editor: Editor?, file: KtFile) { + RenameProcessor(project, element ?: return, newName.asString(), false, false).run() + } + + companion object Factory : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): IntentionAction? { + if (diagnostic.factory != Errors.DEPRECATED_BINARY_MOD) return null + + val operatorMod = diagnostic.psiElement.getNonStrictParentOfType() ?: return null + val newName = REM_TO_MOD_OPERATION_NAMES.inverse()[operatorMod.nameAsName] ?: return null + return RenameModToRemFix(operatorMod, newName) + } + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/modifiers/removeModifierFromOperatorMod.kt b/idea/testData/quickfix/modifiers/removeModifierFromOperatorMod.kt new file mode 100644 index 00000000000..3092ad75c47 --- /dev/null +++ b/idea/testData/quickfix/modifiers/removeModifierFromOperatorMod.kt @@ -0,0 +1,5 @@ +// Remove 'operator' modifier + +object A { + operator fun mod(x: Int) {} +} \ No newline at end of file diff --git a/idea/testData/quickfix/modifiers/removeModifierFromOperatorMod.kt.after b/idea/testData/quickfix/modifiers/removeModifierFromOperatorMod.kt.after new file mode 100644 index 00000000000..dfc72c0e47e --- /dev/null +++ b/idea/testData/quickfix/modifiers/removeModifierFromOperatorMod.kt.after @@ -0,0 +1,5 @@ +// Remove 'operator' modifier + +object A { + fun mod(x: Int) {} +} \ No newline at end of file diff --git a/idea/testData/quickfix/modifiers/removeModifierFromOperatorModAssign.kt b/idea/testData/quickfix/modifiers/removeModifierFromOperatorModAssign.kt new file mode 100644 index 00000000000..4c4ed033cc8 --- /dev/null +++ b/idea/testData/quickfix/modifiers/removeModifierFromOperatorModAssign.kt @@ -0,0 +1,5 @@ +// Remove 'operator' modifier + +object A { + operator fun modAssign(x: Int) {} +} \ No newline at end of file diff --git a/idea/testData/quickfix/modifiers/removeModifierFromOperatorModAssign.kt.after b/idea/testData/quickfix/modifiers/removeModifierFromOperatorModAssign.kt.after new file mode 100644 index 00000000000..34baa68afb0 --- /dev/null +++ b/idea/testData/quickfix/modifiers/removeModifierFromOperatorModAssign.kt.after @@ -0,0 +1,5 @@ +// Remove 'operator' modifier + +object A { + fun modAssign(x: Int) {} +} \ No newline at end of file diff --git a/idea/testData/quickfix/renameToRem/modAsExtension.kt b/idea/testData/quickfix/renameToRem/modAsExtension.kt new file mode 100644 index 00000000000..bb3f721de34 --- /dev/null +++ b/idea/testData/quickfix/renameToRem/modAsExtension.kt @@ -0,0 +1,9 @@ +// "Rename to 'rem'" "true" + +object A +operator fun A.mod(x: Int) {} + +fun test() { + A.mod(3) + A % 2 +} \ No newline at end of file diff --git a/idea/testData/quickfix/renameToRem/modAsExtension.kt.after b/idea/testData/quickfix/renameToRem/modAsExtension.kt.after new file mode 100644 index 00000000000..9382bce9288 --- /dev/null +++ b/idea/testData/quickfix/renameToRem/modAsExtension.kt.after @@ -0,0 +1,9 @@ +// "Rename to 'rem'" "true" + +object A +operator fun A.rem(x: Int) {} + +fun test() { + A.rem(3) + A % 2 +} \ No newline at end of file diff --git a/idea/testData/quickfix/renameToRem/modAsMember.kt b/idea/testData/quickfix/renameToRem/modAsMember.kt new file mode 100644 index 00000000000..d7cd42651e6 --- /dev/null +++ b/idea/testData/quickfix/renameToRem/modAsMember.kt @@ -0,0 +1,12 @@ +// "Rename to 'rem'" "true" + +object Rem { + operator fun mod(x: Int) {} + operator fun modAssign(x: Int) {} +} + +fun test() { + Rem % 1 + Rem.mod(1) + Rem.modAssign(1) +} \ No newline at end of file diff --git a/idea/testData/quickfix/renameToRem/modAsMember.kt.after b/idea/testData/quickfix/renameToRem/modAsMember.kt.after new file mode 100644 index 00000000000..b1a4d323d8d --- /dev/null +++ b/idea/testData/quickfix/renameToRem/modAsMember.kt.after @@ -0,0 +1,12 @@ +// "Rename to 'rem'" "true" + +object Rem { + operator fun rem(x: Int) {} + operator fun modAssign(x: Int) {} +} + +fun test() { + Rem % 1 + Rem.rem(1) + Rem.modAssign(1) +} \ No newline at end of file diff --git a/idea/testData/quickfix/renameToRem/modAssignAsMember.kt b/idea/testData/quickfix/renameToRem/modAssignAsMember.kt new file mode 100644 index 00000000000..ebb6c296e69 --- /dev/null +++ b/idea/testData/quickfix/renameToRem/modAssignAsMember.kt @@ -0,0 +1,14 @@ +// "Rename to 'remAssign'" "true" + +object Rem { + operator fun mod(x: Int) {} + operator fun modAssign(x: Int) {} +} + +fun test() { + Rem % 1 + Rem.mod(1) + Rem.modAssign(1) + val c = Rem + c %= 1 +} \ No newline at end of file diff --git a/idea/testData/quickfix/renameToRem/modAssignAsMember.kt.after b/idea/testData/quickfix/renameToRem/modAssignAsMember.kt.after new file mode 100644 index 00000000000..efbca9426ce --- /dev/null +++ b/idea/testData/quickfix/renameToRem/modAssignAsMember.kt.after @@ -0,0 +1,14 @@ +// "Rename to 'remAssign'" "true" + +object Rem { + operator fun mod(x: Int) {} + operator fun remAssign(x: Int) {} +} + +fun test() { + Rem % 1 + Rem.mod(1) + Rem.remAssign(1) + val c = Rem + c %= 1 +} \ 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 50e908922b3..27a7b83a134 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -6335,6 +6335,18 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("removeModifierFromOperatorMod.kt") + public void testRemoveModifierFromOperatorMod() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/removeModifierFromOperatorMod.kt"); + doTest(fileName); + } + + @TestMetadata("removeModifierFromOperatorModAssign.kt") + public void testRemoveModifierFromOperatorModAssign() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/removeModifierFromOperatorModAssign.kt"); + doTest(fileName); + } + @TestMetadata("removeProtectedModifier.kt") public void testRemoveProtectedModifier() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/removeProtectedModifier.kt"); @@ -7645,6 +7657,33 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { } } + @TestMetadata("idea/testData/quickfix/renameToRem") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class RenameToRem extends AbstractQuickFixTest { + public void testAllFilesPresentInRenameToRem() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/renameToRem"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("modAsExtension.kt") + public void testModAsExtension() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/renameToRem/modAsExtension.kt"); + doTest(fileName); + } + + @TestMetadata("modAsMember.kt") + public void testModAsMember() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/renameToRem/modAsMember.kt"); + doTest(fileName); + } + + @TestMetadata("modAssignAsMember.kt") + public void testModAssignAsMember() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/renameToRem/modAssignAsMember.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/quickfix/renameToUnderscore") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)