From cef9996ba70dd216588f4707df3e8a14777ba497 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 20 Jan 2015 13:42:53 +0300 Subject: [PATCH] Intentions: Convert extension receiver to parameter and vice versa --- .../kotlin/idea/JetBundle.properties | 4 + .../after.kt.template | 7 ++ .../before.kt.template | 7 ++ .../description.html | 5 + .../after.kt.template | 7 ++ .../before.kt.template | 7 ++ .../description.html | 5 + idea/src/META-INF/plugin.xml | 14 ++- .../ConvertParameterToReceiverIntention.kt | 53 +++++++++++ .../ConvertReceiverToParameterIntention.kt | 49 ++++++++++ .../convertParameterToReceiver/.intention | 1 + .../classParameter.kt | 8 ++ .../lambdaParameter.kt | 7 ++ .../convertParameterToReceiver/localFun.kt | 7 ++ .../localFun.kt.after | 7 ++ .../convertParameterToReceiver/memberFun.kt | 16 ++++ .../memberFun.kt.after | 16 ++++ .../noParameterUnderCaret.kt | 8 ++ .../convertParameterToReceiver/topLevelFun.kt | 7 ++ .../topLevelFun.kt.after | 7 ++ .../withExtensionReceiver.kt | 8 ++ .../convertReceiverToParameter/.intention | 1 + .../convertReceiverToParameter/localFun.kt | 7 ++ .../localFun.kt.after | 7 ++ .../convertReceiverToParameter/memberFun.kt | 16 ++++ .../memberFun.kt.after | 16 ++++ .../noReceiverUnderCaret.kt | 4 + .../notExtension.kt | 4 + .../convertReceiverToParameter/topLevelFun.kt | 7 ++ .../topLevelFun.kt.after | 7 ++ .../intentions/IntentionTestGenerated.java | 92 ++++++++++++++++++- 31 files changed, 408 insertions(+), 3 deletions(-) create mode 100644 idea/resources/intentionDescriptions/ConvertParameterToReceiverIntention/after.kt.template create mode 100644 idea/resources/intentionDescriptions/ConvertParameterToReceiverIntention/before.kt.template create mode 100644 idea/resources/intentionDescriptions/ConvertParameterToReceiverIntention/description.html create mode 100644 idea/resources/intentionDescriptions/ConvertReceiverToParameterIntention/after.kt.template create mode 100644 idea/resources/intentionDescriptions/ConvertReceiverToParameterIntention/before.kt.template create mode 100644 idea/resources/intentionDescriptions/ConvertReceiverToParameterIntention/description.html create mode 100644 idea/src/org/jetbrains/kotlin/idea/intentions/ConvertParameterToReceiverIntention.kt create mode 100644 idea/src/org/jetbrains/kotlin/idea/intentions/ConvertReceiverToParameterIntention.kt create mode 100644 idea/testData/intentions/convertParameterToReceiver/.intention create mode 100644 idea/testData/intentions/convertParameterToReceiver/classParameter.kt create mode 100644 idea/testData/intentions/convertParameterToReceiver/lambdaParameter.kt create mode 100644 idea/testData/intentions/convertParameterToReceiver/localFun.kt create mode 100644 idea/testData/intentions/convertParameterToReceiver/localFun.kt.after create mode 100644 idea/testData/intentions/convertParameterToReceiver/memberFun.kt create mode 100644 idea/testData/intentions/convertParameterToReceiver/memberFun.kt.after create mode 100644 idea/testData/intentions/convertParameterToReceiver/noParameterUnderCaret.kt create mode 100644 idea/testData/intentions/convertParameterToReceiver/topLevelFun.kt create mode 100644 idea/testData/intentions/convertParameterToReceiver/topLevelFun.kt.after create mode 100644 idea/testData/intentions/convertParameterToReceiver/withExtensionReceiver.kt create mode 100644 idea/testData/intentions/convertReceiverToParameter/.intention create mode 100644 idea/testData/intentions/convertReceiverToParameter/localFun.kt create mode 100644 idea/testData/intentions/convertReceiverToParameter/localFun.kt.after create mode 100644 idea/testData/intentions/convertReceiverToParameter/memberFun.kt create mode 100644 idea/testData/intentions/convertReceiverToParameter/memberFun.kt.after create mode 100644 idea/testData/intentions/convertReceiverToParameter/noReceiverUnderCaret.kt create mode 100644 idea/testData/intentions/convertReceiverToParameter/notExtension.kt create mode 100644 idea/testData/intentions/convertReceiverToParameter/topLevelFun.kt create mode 100644 idea/testData/intentions/convertReceiverToParameter/topLevelFun.kt.after diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties index e9a61a2311a..28085aed503 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties @@ -344,6 +344,10 @@ convert.function.to.property.intention=Convert function to property convert.function.to.property.intention.family=Convert Function to Property convert.property.to.function.intention=Convert property to function convert.property.to.function.intention.family=Convert Property to Function +convert.receiver.to.parameter.intention=Convert receiver to parameter +convert.receiver.to.parameter.intention.family=Convert Receiver to Parameter +convert.parameter.to.receiver.intention=Convert parameter to receiver +convert.parameter.to.receiver.intention.family=Convert Parameter to Receiver property.is.implemented.too.many=Has implementations property.is.overridden.too.many=Is overridden in subclasses diff --git a/idea/resources/intentionDescriptions/ConvertParameterToReceiverIntention/after.kt.template b/idea/resources/intentionDescriptions/ConvertParameterToReceiverIntention/after.kt.template new file mode 100644 index 00000000000..efb340ac830 --- /dev/null +++ b/idea/resources/intentionDescriptions/ConvertParameterToReceiverIntention/after.kt.template @@ -0,0 +1,7 @@ +fun String.foo(n: Int): Int { + return length() - n +} + +fun test() { + "1".foo(2) +} \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/ConvertParameterToReceiverIntention/before.kt.template b/idea/resources/intentionDescriptions/ConvertParameterToReceiverIntention/before.kt.template new file mode 100644 index 00000000000..649473588c3 --- /dev/null +++ b/idea/resources/intentionDescriptions/ConvertParameterToReceiverIntention/before.kt.template @@ -0,0 +1,7 @@ +fun foo(s: String, n: Int): Int { + return s.length() - n +} + +fun test() { + foo("1", 2) +} \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/ConvertParameterToReceiverIntention/description.html b/idea/resources/intentionDescriptions/ConvertParameterToReceiverIntention/description.html new file mode 100644 index 00000000000..c56a035e578 --- /dev/null +++ b/idea/resources/intentionDescriptions/ConvertParameterToReceiverIntention/description.html @@ -0,0 +1,5 @@ + + +This intention converts function parameter to extension receiver. + + \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/ConvertReceiverToParameterIntention/after.kt.template b/idea/resources/intentionDescriptions/ConvertReceiverToParameterIntention/after.kt.template new file mode 100644 index 00000000000..649473588c3 --- /dev/null +++ b/idea/resources/intentionDescriptions/ConvertReceiverToParameterIntention/after.kt.template @@ -0,0 +1,7 @@ +fun foo(s: String, n: Int): Int { + return s.length() - n +} + +fun test() { + foo("1", 2) +} \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/ConvertReceiverToParameterIntention/before.kt.template b/idea/resources/intentionDescriptions/ConvertReceiverToParameterIntention/before.kt.template new file mode 100644 index 00000000000..efb340ac830 --- /dev/null +++ b/idea/resources/intentionDescriptions/ConvertReceiverToParameterIntention/before.kt.template @@ -0,0 +1,7 @@ +fun String.foo(n: Int): Int { + return length() - n +} + +fun test() { + "1".foo(2) +} \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/ConvertReceiverToParameterIntention/description.html b/idea/resources/intentionDescriptions/ConvertReceiverToParameterIntention/description.html new file mode 100644 index 00000000000..85ab498b0b7 --- /dev/null +++ b/idea/resources/intentionDescriptions/ConvertReceiverToParameterIntention/description.html @@ -0,0 +1,5 @@ + + +This intention converts extension function receiver to its parameter. + + \ No newline at end of file diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 1c5ff96787d..a969b4d9b82 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -795,12 +795,22 @@ - org.jetbrains.kotlin.idea.intentions.ConvertFunctionToPropertyIntention + org.jetbrains.kotlin.idea.intentions.ConvertFunctionToPropertyIntention + Kotlin + + + + org.jetbrains.kotlin.idea.intentions.ConvertPropertyToFunctionIntention + Kotlin + + + + org.jetbrains.kotlin.idea.intentions.ConvertReceiverToParameterIntention Kotlin - org.jetbrains.kotlin.idea.intentions.ConvertPropertyToFunctionIntention + org.jetbrains.kotlin.idea.intentions.ConvertParameterToReceiverIntention Kotlin diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertParameterToReceiverIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertParameterToReceiverIntention.kt new file mode 100644 index 00000000000..cabe7bd591f --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertParameterToReceiverIntention.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2010-2015 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.intentions + +import org.jetbrains.kotlin.psi.JetNamedFunction +import com.intellij.openapi.editor.Editor +import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.refactoring.changeSignature.runChangeSignature +import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.idea.refactoring.changeSignature.JetChangeSignatureConfiguration +import org.jetbrains.kotlin.psi.JetParameter +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType +import org.jetbrains.kotlin.idea.refactoring.changeSignature.JetMethodDescriptor +import org.jetbrains.kotlin.idea.refactoring.changeSignature.modify +import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully + +public class ConvertParameterToReceiverIntention: JetSelfTargetingIntention("convert.parameter.to.receiver.intention", javaClass()) { + override fun isApplicableTo(element: JetParameter): Boolean { + val function = element.getStrictParentOfType() ?: return false + return function.getValueParameterList() == element.getParent() && function.getReceiverTypeReference() == null + } + + private fun configureChangeSignature(parameterIndex: Int): JetChangeSignatureConfiguration { + return object: JetChangeSignatureConfiguration { + override fun configure(originalDescriptor: JetMethodDescriptor, bindingContext: BindingContext): JetMethodDescriptor { + return originalDescriptor.modify { receiver = originalDescriptor.getParameters()[parameterIndex] } + } + } + } + + override fun applyTo(element: JetParameter, editor: Editor) { + val function = element.getStrictParentOfType() ?: return + val parameterIndex = function.getValueParameters().indexOf(element) + val context = function.analyze() + val descriptor = context[BindingContext.DECLARATION_TO_DESCRIPTOR, function] as? FunctionDescriptor ?: return + runChangeSignature(element.getProject(), descriptor, configureChangeSignature(parameterIndex), context, element, getText()) + } +} diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertReceiverToParameterIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertReceiverToParameterIntention.kt new file mode 100644 index 00000000000..7fe69b29adf --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertReceiverToParameterIntention.kt @@ -0,0 +1,49 @@ +/* + * Copyright 2010-2015 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.intentions + +import org.jetbrains.kotlin.psi.JetNamedFunction +import com.intellij.openapi.editor.Editor +import org.jetbrains.kotlin.psi.JetTypeReference +import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.refactoring.changeSignature.runChangeSignature +import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.idea.refactoring.changeSignature.JetChangeSignatureConfiguration +import org.jetbrains.kotlin.idea.refactoring.changeSignature.JetMethodDescriptor +import org.jetbrains.kotlin.idea.refactoring.changeSignature.modify + +public class ConvertReceiverToParameterIntention: JetSelfTargetingIntention("convert.receiver.to.parameter.intention", javaClass()) { + override fun isApplicableTo(element: JetTypeReference): Boolean { + return (element.getParent() as? JetNamedFunction)?.getReceiverTypeReference() == element + } + + private fun configureChangeSignature(): JetChangeSignatureConfiguration { + return object: JetChangeSignatureConfiguration { + override fun configure(originalDescriptor: JetMethodDescriptor, bindingContext: BindingContext): JetMethodDescriptor { + return originalDescriptor.modify { receiver = null } + } + } + } + + override fun applyTo(element: JetTypeReference, editor: Editor) { + val function = element.getParent() as? JetNamedFunction ?: return + val context = function.analyze() + val descriptor = context[BindingContext.DECLARATION_TO_DESCRIPTOR, function] as? FunctionDescriptor ?: return + runChangeSignature(element.getProject(), descriptor, configureChangeSignature(), context, element, getText()) + } +} diff --git a/idea/testData/intentions/convertParameterToReceiver/.intention b/idea/testData/intentions/convertParameterToReceiver/.intention new file mode 100644 index 00000000000..b235efdfa9c --- /dev/null +++ b/idea/testData/intentions/convertParameterToReceiver/.intention @@ -0,0 +1 @@ +org.jetbrains.kotlin.idea.intentions.ConvertParameterToReceiverIntention diff --git a/idea/testData/intentions/convertParameterToReceiver/classParameter.kt b/idea/testData/intentions/convertParameterToReceiver/classParameter.kt new file mode 100644 index 00000000000..80d2482351b --- /dev/null +++ b/idea/testData/intentions/convertParameterToReceiver/classParameter.kt @@ -0,0 +1,8 @@ +// IS_APPLICABLE: false +class Foo(s: String, n: Int) { + +} + +fun test() { + Foo("1", 2) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertParameterToReceiver/lambdaParameter.kt b/idea/testData/intentions/convertParameterToReceiver/lambdaParameter.kt new file mode 100644 index 00000000000..820d55976ee --- /dev/null +++ b/idea/testData/intentions/convertParameterToReceiver/lambdaParameter.kt @@ -0,0 +1,7 @@ +// IS_APPLICABLE: false + +val foo = {(s: String, n: Int) -> s.length() - n/2 > 1 } + +fun test() { + foo("1", 2) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertParameterToReceiver/localFun.kt b/idea/testData/intentions/convertParameterToReceiver/localFun.kt new file mode 100644 index 00000000000..ac59fbf3138 --- /dev/null +++ b/idea/testData/intentions/convertParameterToReceiver/localFun.kt @@ -0,0 +1,7 @@ +fun test() { + fun foo(s: String, n: Int): Boolean { + return s.length() - n/2 > 1 + } + + foo("1", 2) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertParameterToReceiver/localFun.kt.after b/idea/testData/intentions/convertParameterToReceiver/localFun.kt.after new file mode 100644 index 00000000000..3c912f74b77 --- /dev/null +++ b/idea/testData/intentions/convertParameterToReceiver/localFun.kt.after @@ -0,0 +1,7 @@ +fun test() { + fun String.foo(n: Int): Boolean { + return length() - n/2 > 1 + } + + "1".foo(2) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertParameterToReceiver/memberFun.kt b/idea/testData/intentions/convertParameterToReceiver/memberFun.kt new file mode 100644 index 00000000000..e88dfdf486c --- /dev/null +++ b/idea/testData/intentions/convertParameterToReceiver/memberFun.kt @@ -0,0 +1,16 @@ +// WITH_RUNTIME +class A { + fun foo(s: String, n: Int): Boolean { + return s.length() - n/2 > 1 + } + + fun test() { + foo("1", 2) + } +} + +fun test() { + with(A()) { + foo("1", 2) + } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertParameterToReceiver/memberFun.kt.after b/idea/testData/intentions/convertParameterToReceiver/memberFun.kt.after new file mode 100644 index 00000000000..c4834b73373 --- /dev/null +++ b/idea/testData/intentions/convertParameterToReceiver/memberFun.kt.after @@ -0,0 +1,16 @@ +// WITH_RUNTIME +class A { + fun String.foo(n: Int): Boolean { + return length() - n/2 > 1 + } + + fun test() { + "1".foo(2) + } +} + +fun test() { + with(A()) { + "1".foo(2) + } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertParameterToReceiver/noParameterUnderCaret.kt b/idea/testData/intentions/convertParameterToReceiver/noParameterUnderCaret.kt new file mode 100644 index 00000000000..b067c5c9de5 --- /dev/null +++ b/idea/testData/intentions/convertParameterToReceiver/noParameterUnderCaret.kt @@ -0,0 +1,8 @@ +// IS_APPLICABLE: false +fun foo(s: String, n: Int): Boolean { + return s.length() - n/2 > 1 +} + +fun test() { + foo("1", 2) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertParameterToReceiver/topLevelFun.kt b/idea/testData/intentions/convertParameterToReceiver/topLevelFun.kt new file mode 100644 index 00000000000..a8fe21ca2c3 --- /dev/null +++ b/idea/testData/intentions/convertParameterToReceiver/topLevelFun.kt @@ -0,0 +1,7 @@ +fun foo(s: String, n: Int): Boolean { + return s.length() - n/2 > 1 +} + +fun test() { + foo("1", 2) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertParameterToReceiver/topLevelFun.kt.after b/idea/testData/intentions/convertParameterToReceiver/topLevelFun.kt.after new file mode 100644 index 00000000000..76ee33f66b6 --- /dev/null +++ b/idea/testData/intentions/convertParameterToReceiver/topLevelFun.kt.after @@ -0,0 +1,7 @@ +fun String.foo(n: Int): Boolean { + return length() - n/2 > 1 +} + +fun test() { + "1".foo(2) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertParameterToReceiver/withExtensionReceiver.kt b/idea/testData/intentions/convertParameterToReceiver/withExtensionReceiver.kt new file mode 100644 index 00000000000..58e0cbfb09f --- /dev/null +++ b/idea/testData/intentions/convertParameterToReceiver/withExtensionReceiver.kt @@ -0,0 +1,8 @@ +// IS_APPLICABLE: false +fun Any.foo(s: String, n: Int): Boolean { + return s.length() - n/2 > 1 +} + +fun test() { + "0".foo("1", 2) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertReceiverToParameter/.intention b/idea/testData/intentions/convertReceiverToParameter/.intention new file mode 100644 index 00000000000..8610bd1747a --- /dev/null +++ b/idea/testData/intentions/convertReceiverToParameter/.intention @@ -0,0 +1 @@ +org.jetbrains.kotlin.idea.intentions.ConvertReceiverToParameterIntention diff --git a/idea/testData/intentions/convertReceiverToParameter/localFun.kt b/idea/testData/intentions/convertReceiverToParameter/localFun.kt new file mode 100644 index 00000000000..76455bc1dbe --- /dev/null +++ b/idea/testData/intentions/convertReceiverToParameter/localFun.kt @@ -0,0 +1,7 @@ +fun test() { + fun String.foo(n: Int): Boolean { + return length() - n/2 > 1 + } + + "1".foo(2) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertReceiverToParameter/localFun.kt.after b/idea/testData/intentions/convertReceiverToParameter/localFun.kt.after new file mode 100644 index 00000000000..a4a6689d831 --- /dev/null +++ b/idea/testData/intentions/convertReceiverToParameter/localFun.kt.after @@ -0,0 +1,7 @@ +fun test() { + fun foo(s: String, n: Int): Boolean { + return s.length() - n/2 > 1 + } + + foo("1", 2) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertReceiverToParameter/memberFun.kt b/idea/testData/intentions/convertReceiverToParameter/memberFun.kt new file mode 100644 index 00000000000..1878dfd71c4 --- /dev/null +++ b/idea/testData/intentions/convertReceiverToParameter/memberFun.kt @@ -0,0 +1,16 @@ +// WITH_RUNTIME +class A { + fun String.foo(n: Int): Boolean { + return length() - n/2 > 1 + } + + fun test() { + "1".foo(2) + } +} + +fun test() { + with(A()) { + "1".foo(2) + } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertReceiverToParameter/memberFun.kt.after b/idea/testData/intentions/convertReceiverToParameter/memberFun.kt.after new file mode 100644 index 00000000000..da4e19acea5 --- /dev/null +++ b/idea/testData/intentions/convertReceiverToParameter/memberFun.kt.after @@ -0,0 +1,16 @@ +// WITH_RUNTIME +class A { + fun foo(s: String, n: Int): Boolean { + return s.length() - n/2 > 1 + } + + fun test() { + foo("1", 2) + } +} + +fun test() { + with(A()) { + foo("1", 2) + } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertReceiverToParameter/noReceiverUnderCaret.kt b/idea/testData/intentions/convertReceiverToParameter/noReceiverUnderCaret.kt new file mode 100644 index 00000000000..6c4040d0ff8 --- /dev/null +++ b/idea/testData/intentions/convertReceiverToParameter/noReceiverUnderCaret.kt @@ -0,0 +1,4 @@ +// IS_APPLICABLE: false +fun String.foo(n: Int): Boolean { + return length() - n/2 > 1 +} \ No newline at end of file diff --git a/idea/testData/intentions/convertReceiverToParameter/notExtension.kt b/idea/testData/intentions/convertReceiverToParameter/notExtension.kt new file mode 100644 index 00000000000..1a51f8fdf44 --- /dev/null +++ b/idea/testData/intentions/convertReceiverToParameter/notExtension.kt @@ -0,0 +1,4 @@ +// IS_APPLICABLE: false +fun foo(s: String, n: Int): Boolean { + return s.length() - n/2 > 1 +} \ No newline at end of file diff --git a/idea/testData/intentions/convertReceiverToParameter/topLevelFun.kt b/idea/testData/intentions/convertReceiverToParameter/topLevelFun.kt new file mode 100644 index 00000000000..5ae8846e73c --- /dev/null +++ b/idea/testData/intentions/convertReceiverToParameter/topLevelFun.kt @@ -0,0 +1,7 @@ +fun String.foo(n: Int): Boolean { + return length() - n/2 > 1 +} + +fun test() { + "1".foo(2) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertReceiverToParameter/topLevelFun.kt.after b/idea/testData/intentions/convertReceiverToParameter/topLevelFun.kt.after new file mode 100644 index 00000000000..ad8a5f2bcf4 --- /dev/null +++ b/idea/testData/intentions/convertReceiverToParameter/topLevelFun.kt.after @@ -0,0 +1,7 @@ +fun foo(s: String, n: Int): Boolean { + return s.length() - n/2 > 1 +} + +fun test() { + foo("1", 2) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index 14f90fc40ea..82880440263 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -30,7 +30,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("idea/testData/intentions") @TestDataPath("$PROJECT_ROOT") -@InnerTestClasses({IntentionTestGenerated.AddBraces.class, IntentionTestGenerated.AttributeCallReplacements.class, IntentionTestGenerated.Branched.class, IntentionTestGenerated.ConvertAssertToIf.class, IntentionTestGenerated.ConvertFunctionToProperty.class, IntentionTestGenerated.ConvertIfToAssert.class, IntentionTestGenerated.ConvertNegatedBooleanSequence.class, IntentionTestGenerated.ConvertNegatedExpressionWithDemorgansLaw.class, IntentionTestGenerated.ConvertPropertyToFunction.class, IntentionTestGenerated.ConvertToBlockBody.class, IntentionTestGenerated.ConvertToConcatenatedStringIntention.class, IntentionTestGenerated.ConvertToExpressionBody.class, IntentionTestGenerated.ConvertToForEachFunctionCall.class, IntentionTestGenerated.ConvertToForEachLoop.class, IntentionTestGenerated.ConvertToStringTemplateIntention.class, IntentionTestGenerated.Declarations.class, IntentionTestGenerated.InsertCurlyBracesToTemplate.class, IntentionTestGenerated.InsertExplicitTypeArguments.class, IntentionTestGenerated.InvertIfCondition.class, IntentionTestGenerated.MakeTypeExplicitInLambda.class, IntentionTestGenerated.MakeTypeImplicitInLambda.class, IntentionTestGenerated.MoveLambdaInsideParentheses.class, IntentionTestGenerated.MoveLambdaOutsideParentheses.class, IntentionTestGenerated.OperatorToFunction.class, IntentionTestGenerated.ReconstructedType.class, IntentionTestGenerated.RemoveBraces.class, IntentionTestGenerated.RemoveCurlyBracesFromTemplate.class, IntentionTestGenerated.RemoveExplicitTypeArguments.class, IntentionTestGenerated.RemoveUnnecessaryParentheses.class, IntentionTestGenerated.ReplaceExplicitFunctionLiteralParamWithIt.class, IntentionTestGenerated.ReplaceItWithExplicitFunctionLiteralParam.class, IntentionTestGenerated.ReplaceWithDotQualifiedMethodCall.class, IntentionTestGenerated.ReplaceWithInfixFunctionCall.class, IntentionTestGenerated.ReplaceWithOperatorAssign.class, IntentionTestGenerated.ReplaceWithTraditionalAssignment.class, IntentionTestGenerated.SimplifyBooleanWithConstants.class, IntentionTestGenerated.SimplifyNegatedBinaryExpressionIntention.class, IntentionTestGenerated.SpecifyType.class, IntentionTestGenerated.SplitIf.class, IntentionTestGenerated.SwapBinaryExpression.class}) +@InnerTestClasses({IntentionTestGenerated.AddBraces.class, IntentionTestGenerated.AttributeCallReplacements.class, IntentionTestGenerated.Branched.class, IntentionTestGenerated.ConvertAssertToIf.class, IntentionTestGenerated.ConvertFunctionToProperty.class, IntentionTestGenerated.ConvertIfToAssert.class, IntentionTestGenerated.ConvertNegatedBooleanSequence.class, IntentionTestGenerated.ConvertNegatedExpressionWithDemorgansLaw.class, IntentionTestGenerated.ConvertParameterToReceiver.class, IntentionTestGenerated.ConvertPropertyToFunction.class, IntentionTestGenerated.ConvertReceiverToParameter.class, IntentionTestGenerated.ConvertToBlockBody.class, IntentionTestGenerated.ConvertToConcatenatedStringIntention.class, IntentionTestGenerated.ConvertToExpressionBody.class, IntentionTestGenerated.ConvertToForEachFunctionCall.class, IntentionTestGenerated.ConvertToForEachLoop.class, IntentionTestGenerated.ConvertToStringTemplateIntention.class, IntentionTestGenerated.Declarations.class, IntentionTestGenerated.InsertCurlyBracesToTemplate.class, IntentionTestGenerated.InsertExplicitTypeArguments.class, IntentionTestGenerated.InvertIfCondition.class, IntentionTestGenerated.MakeTypeExplicitInLambda.class, IntentionTestGenerated.MakeTypeImplicitInLambda.class, IntentionTestGenerated.MoveLambdaInsideParentheses.class, IntentionTestGenerated.MoveLambdaOutsideParentheses.class, IntentionTestGenerated.OperatorToFunction.class, IntentionTestGenerated.ReconstructedType.class, IntentionTestGenerated.RemoveBraces.class, IntentionTestGenerated.RemoveCurlyBracesFromTemplate.class, IntentionTestGenerated.RemoveExplicitTypeArguments.class, IntentionTestGenerated.RemoveUnnecessaryParentheses.class, IntentionTestGenerated.ReplaceExplicitFunctionLiteralParamWithIt.class, IntentionTestGenerated.ReplaceItWithExplicitFunctionLiteralParam.class, IntentionTestGenerated.ReplaceWithDotQualifiedMethodCall.class, IntentionTestGenerated.ReplaceWithInfixFunctionCall.class, IntentionTestGenerated.ReplaceWithOperatorAssign.class, IntentionTestGenerated.ReplaceWithTraditionalAssignment.class, IntentionTestGenerated.SimplifyBooleanWithConstants.class, IntentionTestGenerated.SimplifyNegatedBinaryExpressionIntention.class, IntentionTestGenerated.SpecifyType.class, IntentionTestGenerated.SplitIf.class, IntentionTestGenerated.SwapBinaryExpression.class}) @RunWith(JUnit3RunnerWithInners.class) public class IntentionTestGenerated extends AbstractIntentionTest { public void testAllFilesPresentInIntentions() throws Exception { @@ -2929,6 +2929,57 @@ public class IntentionTestGenerated extends AbstractIntentionTest { } } + @TestMetadata("idea/testData/intentions/convertParameterToReceiver") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ConvertParameterToReceiver extends AbstractIntentionTest { + public void testAllFilesPresentInConvertParameterToReceiver() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/convertParameterToReceiver"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("classParameter.kt") + public void testClassParameter() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertParameterToReceiver/classParameter.kt"); + doTest(fileName); + } + + @TestMetadata("lambdaParameter.kt") + public void testLambdaParameter() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertParameterToReceiver/lambdaParameter.kt"); + doTest(fileName); + } + + @TestMetadata("localFun.kt") + public void testLocalFun() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertParameterToReceiver/localFun.kt"); + doTest(fileName); + } + + @TestMetadata("memberFun.kt") + public void testMemberFun() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertParameterToReceiver/memberFun.kt"); + doTest(fileName); + } + + @TestMetadata("noParameterUnderCaret.kt") + public void testNoParameterUnderCaret() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertParameterToReceiver/noParameterUnderCaret.kt"); + doTest(fileName); + } + + @TestMetadata("topLevelFun.kt") + public void testTopLevelFun() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertParameterToReceiver/topLevelFun.kt"); + doTest(fileName); + } + + @TestMetadata("withExtensionReceiver.kt") + public void testWithExtensionReceiver() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertParameterToReceiver/withExtensionReceiver.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/intentions/convertPropertyToFunction") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) @@ -3022,6 +3073,45 @@ public class IntentionTestGenerated extends AbstractIntentionTest { } } + @TestMetadata("idea/testData/intentions/convertReceiverToParameter") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ConvertReceiverToParameter extends AbstractIntentionTest { + public void testAllFilesPresentInConvertReceiverToParameter() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/convertReceiverToParameter"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("localFun.kt") + public void testLocalFun() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertReceiverToParameter/localFun.kt"); + doTest(fileName); + } + + @TestMetadata("memberFun.kt") + public void testMemberFun() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertReceiverToParameter/memberFun.kt"); + doTest(fileName); + } + + @TestMetadata("noReceiverUnderCaret.kt") + public void testNoReceiverUnderCaret() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertReceiverToParameter/noReceiverUnderCaret.kt"); + doTest(fileName); + } + + @TestMetadata("notExtension.kt") + public void testNotExtension() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertReceiverToParameter/notExtension.kt"); + doTest(fileName); + } + + @TestMetadata("topLevelFun.kt") + public void testTopLevelFun() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertReceiverToParameter/topLevelFun.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/intentions/convertToBlockBody") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)