diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 311bc2dd450..ae8396884e7 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -1204,8 +1204,7 @@ groupName="Kotlin" language="jet" enabledByDefault="true" - level="WARNING" - cleanupTool="true"/> + level="WARNING"/> )?.a as? FunctionDescriptor ?: return null + val target = (param.source as? PsiSourceElement)?.psi as? JetDeclaration ?: return null + return object : AddModifierFix(target, JetTokens.OPERATOR_KEYWORD), CleanupFix {} + } +} diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 726f45505f1..34d638e0f99 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticFactory import org.jetbrains.kotlin.diagnostics.Errors.* import org.jetbrains.kotlin.idea.core.overrideImplement.ImplementMembersHandler import org.jetbrains.kotlin.idea.inspections.AddReflectionQuickFix +import org.jetbrains.kotlin.idea.inspections.OperatorModifierFixFactory import org.jetbrains.kotlin.idea.intentions.IntroduceBackingPropertyFix import org.jetbrains.kotlin.idea.quickfix.createFromUsage.createCallable.* import org.jetbrains.kotlin.idea.quickfix.createFromUsage.createClass.CreateClassFromCallWithConstructorCalleeActionFactory @@ -326,5 +327,7 @@ public class QuickFixRegistrar : QuickFixContributor { BACKING_FIELD_SYNTAX_DEPRECATED.registerFactory(MigrateBackingFieldSyntaxFix) BACKING_FIELD_USAGE_DEPRECATED.registerFactory(MigrateBackingFieldUsageFix) BACKING_FIELD_USAGE_DEPRECATED.registerFactory(IntroduceBackingPropertyFix) + + OPERATOR_MODIFIER_REQUIRED.registerFactory(OperatorModifierFixFactory) } } diff --git a/idea/testData/inspections/cleanup/cleanup.kt b/idea/testData/inspections/cleanup/cleanup.kt index 7f41c6c0039..eec0e5308c3 100644 --- a/idea/testData/inspections/cleanup/cleanup.kt +++ b/idea/testData/inspections/cleanup/cleanup.kt @@ -47,3 +47,13 @@ class Foo { get = $x set(value) { $x = value } } + +class B { + fun plus(a: A): A = A() +} + +fun foo() { + B() + B() + B() + B() + B() + B() +} diff --git a/idea/testData/inspections/cleanup/cleanup.kt.after b/idea/testData/inspections/cleanup/cleanup.kt.after index 4639aefc233..5200c8fe76d 100644 --- a/idea/testData/inspections/cleanup/cleanup.kt.after +++ b/idea/testData/inspections/cleanup/cleanup.kt.after @@ -46,3 +46,13 @@ class Foo { get = field set(value) { field = value } } + +class B { + operator fun plus(a: A): A = A() +} + +fun foo() { + B() + B() + B() + B() + B() + B() +} diff --git a/idea/testData/quickfix/modifiers/operatorModifier.kt b/idea/testData/quickfix/modifiers/operatorModifier.kt new file mode 100644 index 00000000000..5a6e8a00b7c --- /dev/null +++ b/idea/testData/quickfix/modifiers/operatorModifier.kt @@ -0,0 +1,8 @@ +// "Add 'operator' modifier" "true" +class A { + fun plus(a: A): A = A() +} + +fun foo() { + A() + A() +} diff --git a/idea/testData/quickfix/modifiers/operatorModifier.kt.after b/idea/testData/quickfix/modifiers/operatorModifier.kt.after new file mode 100644 index 00000000000..6aa21f4329d --- /dev/null +++ b/idea/testData/quickfix/modifiers/operatorModifier.kt.after @@ -0,0 +1,8 @@ +// "Add 'operator' modifier" "true" +class A { + operator fun plus(a: A): A = A() +} + +fun foo() { + A() + A() +} diff --git a/idea/testData/quickfix/modifiers/operatorModifierCollection.kt b/idea/testData/quickfix/modifiers/operatorModifierCollection.kt new file mode 100644 index 00000000000..a822d10b7b2 --- /dev/null +++ b/idea/testData/quickfix/modifiers/operatorModifierCollection.kt @@ -0,0 +1,6 @@ +// "Add 'operator' modifier" "true" +class A { + fun contains(x: Any): Boolean = false +} + +fun foo() = 0 in A() diff --git a/idea/testData/quickfix/modifiers/operatorModifierCollection.kt.after b/idea/testData/quickfix/modifiers/operatorModifierCollection.kt.after new file mode 100644 index 00000000000..498bf2cd0f6 --- /dev/null +++ b/idea/testData/quickfix/modifiers/operatorModifierCollection.kt.after @@ -0,0 +1,6 @@ +// "Add 'operator' modifier" "true" +class A { + operator fun contains(x: Any): Boolean = false +} + +fun foo() = 0 in A() diff --git a/idea/testData/quickfix/modifiers/operatorModifierComponent.kt b/idea/testData/quickfix/modifiers/operatorModifierComponent.kt new file mode 100644 index 00000000000..bb8d4ccf362 --- /dev/null +++ b/idea/testData/quickfix/modifiers/operatorModifierComponent.kt @@ -0,0 +1,10 @@ +// "Add 'operator' modifier" "true" +class A { + fun component1(): Int = 0 + fun component2(): Int = 1 +} + +fun foo() { + val (zero, one) = A() +} + diff --git a/idea/testData/quickfix/modifiers/operatorModifierComponent.kt.after b/idea/testData/quickfix/modifiers/operatorModifierComponent.kt.after new file mode 100644 index 00000000000..5352a016eab --- /dev/null +++ b/idea/testData/quickfix/modifiers/operatorModifierComponent.kt.after @@ -0,0 +1,10 @@ +// "Add 'operator' modifier" "true" +class A { + operator fun component1(): Int = 0 + fun component2(): Int = 1 +} + +fun foo() { + val (zero, one) = A() +} + diff --git a/idea/testData/quickfix/modifiers/operatorModifierGet.kt b/idea/testData/quickfix/modifiers/operatorModifierGet.kt new file mode 100644 index 00000000000..8fab1ffa40c --- /dev/null +++ b/idea/testData/quickfix/modifiers/operatorModifierGet.kt @@ -0,0 +1,6 @@ +// "Add 'operator' modifier" "true" +class A { + fun get(i: Int): String = "" +} + +fun foo() = A()[0] diff --git a/idea/testData/quickfix/modifiers/operatorModifierGet.kt.after b/idea/testData/quickfix/modifiers/operatorModifierGet.kt.after new file mode 100644 index 00000000000..789c7859d87 --- /dev/null +++ b/idea/testData/quickfix/modifiers/operatorModifierGet.kt.after @@ -0,0 +1,6 @@ +// "Add 'operator' modifier" "true" +class A { + operator fun get(i: Int): String = "" +} + +fun foo() = A()[0] diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index b12b0760c08..96062450999 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -4316,6 +4316,30 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("operatorModifier.kt") + public void testOperatorModifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/operatorModifier.kt"); + doTest(fileName); + } + + @TestMetadata("operatorModifierCollection.kt") + public void testOperatorModifierCollection() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/operatorModifierCollection.kt"); + doTest(fileName); + } + + @TestMetadata("operatorModifierComponent.kt") + public void testOperatorModifierComponent() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/operatorModifierComponent.kt"); + doTest(fileName); + } + + @TestMetadata("operatorModifierGet.kt") + public void testOperatorModifierGet() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/operatorModifierGet.kt"); + doTest(fileName); + } + @TestMetadata("packageMemberCannotBeProtected.kt") public void testPackageMemberCannotBeProtected() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/packageMemberCannotBeProtected.kt");