diff --git a/plugins/kotlin/base/resources/resources-en/messages/KotlinBundle.properties b/plugins/kotlin/base/resources/resources-en/messages/KotlinBundle.properties index fad79c21838a..46309271ed26 100644 --- a/plugins/kotlin/base/resources/resources-en/messages/KotlinBundle.properties +++ b/plugins/kotlin/base/resources/resources-en/messages/KotlinBundle.properties @@ -2515,9 +2515,10 @@ hints.codevision.settings=Settings\u2026 convert.string.template.to.build.string=Convert to 'buildString' call convert.concatenation.to.build.string=Convert concatenation to 'buildString' call convert.to.indexed.function.call=Convert to indexed function call -convert.to.regular.parameter=Convert context parameter to value parameter -convert.to.receiver.parameter=Convert context parameter to receiver -convert.to.context.parameter=Convert value parameter to context parameter +convert.context.parameter.to.regular.parameter=Convert context parameter to value parameter +convert.context.parameter.to.receiver.parameter=Convert context parameter to receiver +convert.value.parameter.to.context.parameter=Convert value parameter to context parameter +convert.receiver.parameter.to.context.parameter=Convert receiver to context parameter inspection.kotlin.invalid.bundle.or.property.display.name=Invalid property key inspection.gradle.kotlinx.coroutines.deprecation.display.name=Incompatible kotlinx.coroutines dependency is used with Kotlin 1.3+ in Gradle inspection.deprecated.gradle.dependency.display.name=Deprecated library is used in Gradle diff --git a/plugins/kotlin/code-insight/descriptions/resources-en/intentionDescriptions/ConvertReceiverParameterToContextParameterIntention/after.kt.template b/plugins/kotlin/code-insight/descriptions/resources-en/intentionDescriptions/ConvertReceiverParameterToContextParameterIntention/after.kt.template new file mode 100644 index 000000000000..21b7fd7250ea --- /dev/null +++ b/plugins/kotlin/code-insight/descriptions/resources-en/intentionDescriptions/ConvertReceiverParameterToContextParameterIntention/after.kt.template @@ -0,0 +1,3 @@ +context(string: String) +fun foo() { +} diff --git a/plugins/kotlin/code-insight/descriptions/resources-en/intentionDescriptions/ConvertReceiverParameterToContextParameterIntention/before.kt.template b/plugins/kotlin/code-insight/descriptions/resources-en/intentionDescriptions/ConvertReceiverParameterToContextParameterIntention/before.kt.template new file mode 100644 index 000000000000..5aeef0b7b47f --- /dev/null +++ b/plugins/kotlin/code-insight/descriptions/resources-en/intentionDescriptions/ConvertReceiverParameterToContextParameterIntention/before.kt.template @@ -0,0 +1,2 @@ +fun String.foo() { +} diff --git a/plugins/kotlin/code-insight/descriptions/resources-en/intentionDescriptions/ConvertReceiverParameterToContextParameterIntention/description.html b/plugins/kotlin/code-insight/descriptions/resources-en/intentionDescriptions/ConvertReceiverParameterToContextParameterIntention/description.html new file mode 100644 index 000000000000..dd750b2f1130 --- /dev/null +++ b/plugins/kotlin/code-insight/descriptions/resources-en/intentionDescriptions/ConvertReceiverParameterToContextParameterIntention/description.html @@ -0,0 +1,5 @@ + + +Converts a function receiver to a context parameter and updates usages. + + \ No newline at end of file diff --git a/plugins/kotlin/code-insight/intentions-k2/resources/kotlin.code-insight.intentions.k2.xml b/plugins/kotlin/code-insight/intentions-k2/resources/kotlin.code-insight.intentions.k2.xml index e6e02519bb56..0d4d69d2b581 100644 --- a/plugins/kotlin/code-insight/intentions-k2/resources/kotlin.code-insight.intentions.k2.xml +++ b/plugins/kotlin/code-insight/intentions-k2/resources/kotlin.code-insight.intentions.k2.xml @@ -634,5 +634,12 @@ group.names.kotlin + + kotlin + org.jetbrains.kotlin.idea.k2.codeinsight.intentions.ConvertReceiverParameterToContextParameterIntention + messages.KotlinBundle + group.names.kotlin + + diff --git a/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertContextParameterToReceiverIntention.kt b/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertContextParameterToReceiverIntention.kt index f7947da26be5..853df971c1e9 100644 --- a/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertContextParameterToReceiverIntention.kt +++ b/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertContextParameterToReceiverIntention.kt @@ -14,7 +14,7 @@ import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType class ConvertContextParameterToReceiverIntention : SelfTargetingIntention( - KtParameter::class.java, KotlinBundle.lazyMessage("convert.to.receiver.parameter") + KtParameter::class.java, KotlinBundle.lazyMessage("convert.context.parameter.to.receiver.parameter") ) { override fun startInWriteAction(): Boolean = false diff --git a/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertContextParameterToRegularParameterIntention.kt b/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertContextParameterToRegularParameterIntention.kt index 2a20d5de0293..22d82880f461 100644 --- a/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertContextParameterToRegularParameterIntention.kt +++ b/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertContextParameterToRegularParameterIntention.kt @@ -12,7 +12,7 @@ import org.jetbrains.kotlin.idea.k2.refactoring.changeSignature.KotlinChangeInfo import org.jetbrains.kotlin.psi.KtParameter class ConvertContextParameterToRegularParameterIntention : SelfTargetingIntention( - KtParameter::class.java, KotlinBundle.lazyMessage("convert.to.regular.parameter") + KtParameter::class.java, KotlinBundle.lazyMessage("convert.context.parameter.to.regular.parameter") ) { override fun startInWriteAction(): Boolean = false diff --git a/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertReceiverParameterToContextParameterIntention.kt b/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertReceiverParameterToContextParameterIntention.kt new file mode 100644 index 000000000000..92cf0ab9d4c2 --- /dev/null +++ b/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertReceiverParameterToContextParameterIntention.kt @@ -0,0 +1,64 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. + +package org.jetbrains.kotlin.idea.k2.codeinsight.intentions + +import com.intellij.codeInsight.intention.LowPriorityAction +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.DumbService +import com.intellij.psi.PsiDocumentManager +import com.intellij.usageView.UsageInfo +import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.idea.base.projectStructure.languageVersionSettings +import org.jetbrains.kotlin.idea.base.resources.KotlinBundle +import org.jetbrains.kotlin.idea.codeinsight.api.classic.intentions.SelfTargetingIntention +import org.jetbrains.kotlin.idea.k2.refactoring.changeSignature.KotlinChangeInfo +import org.jetbrains.kotlin.idea.k2.refactoring.changeSignature.KotlinChangeSignatureProcessor +import org.jetbrains.kotlin.idea.k2.refactoring.changeSignature.KotlinMethodDescriptor +import org.jetbrains.kotlin.idea.refactoring.rename.KotlinMemberInplaceRenameHandler +import org.jetbrains.kotlin.psi.KtNamedFunction +import org.jetbrains.kotlin.psi.KtTypeReference +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType +import org.jetbrains.kotlin.psi.psiUtil.startOffset + +class ConvertReceiverParameterToContextParameterIntention : SelfTargetingIntention( + KtTypeReference::class.java, + KotlinBundle.lazyMessage("convert.receiver.parameter.to.context.parameter"), +), LowPriorityAction { + override fun startInWriteAction(): Boolean = false + + override fun isApplicableTo(element: KtTypeReference, caretOffset: Int): Boolean { + return element.languageVersionSettings.supportsFeature(LanguageFeature.ContextParameters) + } + + override fun applyTo(element: KtTypeReference, editor: Editor?) { + val ktFunction = element.getStrictParentOfType() ?: return + val methodDescriptor = KotlinMethodDescriptor(ktFunction) + val changeInfo = KotlinChangeInfo(methodDescriptor) + if (!configureChangeInfo(changeInfo)) return + object : KotlinChangeSignatureProcessor(element.project, changeInfo) { + override fun performRefactoring(usages: Array) { + super.performRefactoring(usages) + DumbService.getInstance(element.project).smartInvokeLater { + renameLastContextParameter(ktFunction, editor) + } + } + }.also { + it.prepareSuccessfulSwingThreadCallback = Runnable { } + }.run() + } + + private fun configureChangeInfo(changeInfo: KotlinChangeInfo): Boolean { + val oldReceiverInfo = changeInfo.oldReceiverInfo ?: return false + changeInfo.receiverParameterInfo = null + oldReceiverInfo.isContextParameter = true + return true + } + + private fun renameLastContextParameter(ktFunction: KtNamedFunction, editor: Editor?) { + if (!ktFunction.isValid || editor == null || editor.isDisposed) return + val lastContextParameter = ktFunction.contextReceiverList?.contextParameters()?.lastOrNull() ?: return + editor.caretModel.moveToOffset(lastContextParameter.startOffset) + PsiDocumentManager.getInstance(ktFunction.project).doPostponedOperationsAndUnblockDocument(editor.document) + KotlinMemberInplaceRenameHandler().doRename(lastContextParameter, editor, null) + } +} diff --git a/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertRegularParameterToContextParameterIntention.kt b/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertRegularParameterToContextParameterIntention.kt index be26c5ca0529..01db8a06d362 100644 --- a/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertRegularParameterToContextParameterIntention.kt +++ b/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertRegularParameterToContextParameterIntention.kt @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.psi.KtParameter class ConvertRegularParameterToContextParameterIntention : SelfTargetingIntention( KtParameter::class.java, - KotlinBundle.lazyMessage("convert.to.context.parameter"), + KotlinBundle.lazyMessage("convert.value.parameter.to.context.parameter"), ) { override fun startInWriteAction(): Boolean = false diff --git a/plugins/kotlin/code-insight/intentions-k2/tests/test/org/jetbrains/kotlin/idea/k2/intentions/tests/K2IntentionTestGenerated.java b/plugins/kotlin/code-insight/intentions-k2/tests/test/org/jetbrains/kotlin/idea/k2/intentions/tests/K2IntentionTestGenerated.java index dd6aa775f1b2..7ac9350c6259 100644 --- a/plugins/kotlin/code-insight/intentions-k2/tests/test/org/jetbrains/kotlin/idea/k2/intentions/tests/K2IntentionTestGenerated.java +++ b/plugins/kotlin/code-insight/intentions-k2/tests/test/org/jetbrains/kotlin/idea/k2/intentions/tests/K2IntentionTestGenerated.java @@ -14358,6 +14358,80 @@ public abstract class K2IntentionTestGenerated extends AbstractK2IntentionTest { } } + @RunWith(JUnit3RunnerWithInners.class) + @TestMetadata("../../../idea/tests/testData/intentions/contextParameters/receiverToContextParameter") + public static class ReceiverToContextParameter extends AbstractK2IntentionTest { + @java.lang.Override + @org.jetbrains.annotations.NotNull + public final KotlinPluginMode getPluginMode() { + return KotlinPluginMode.K2; + } + + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + @TestMetadata("classScopeExtensionArgument.kt") + public void testClassScopeExtensionArgument() throws Exception { + runTest("../../../idea/tests/testData/intentions/contextParameters/receiverToContextParameter/classScopeExtensionArgument.kt"); + } + + @TestMetadata("contextFunCallInBody.kt") + public void testContextFunCallInBody() throws Exception { + runTest("../../../idea/tests/testData/intentions/contextParameters/receiverToContextParameter/contextFunCallInBody.kt"); + } + + @TestMetadata("contextMemberExtensionFunCallInBody.kt") + public void testContextMemberExtensionFunCallInBody() throws Exception { + runTest("../../../idea/tests/testData/intentions/contextParameters/receiverToContextParameter/contextMemberExtensionFunCallInBody.kt"); + } + + @TestMetadata("explicitExtensionArgument.kt") + public void testExplicitExtensionArgument() throws Exception { + runTest("../../../idea/tests/testData/intentions/contextParameters/receiverToContextParameter/explicitExtensionArgument.kt"); + } + + @TestMetadata("explicitThisInBody.kt") + public void testExplicitThisInBody() throws Exception { + runTest("../../../idea/tests/testData/intentions/contextParameters/receiverToContextParameter/explicitThisInBody.kt"); + } + + @TestMetadata("extensionFunCallInBody.kt") + public void testExtensionFunCallInBody() throws Exception { + runTest("../../../idea/tests/testData/intentions/contextParameters/receiverToContextParameter/extensionFunCallInBody.kt"); + } + + @TestMetadata("implicitExtensionArgument.kt") + public void testImplicitExtensionArgument() throws Exception { + runTest("../../../idea/tests/testData/intentions/contextParameters/receiverToContextParameter/implicitExtensionArgument.kt"); + } + + @TestMetadata("implicitThisInBody.kt") + public void testImplicitThisInBody() throws Exception { + runTest("../../../idea/tests/testData/intentions/contextParameters/receiverToContextParameter/implicitThisInBody.kt"); + } + + @TestMetadata("inapplicableDisabledFeature.kt") + public void testInapplicableDisabledFeature() throws Exception { + runTest("../../../idea/tests/testData/intentions/contextParameters/receiverToContextParameter/inapplicableDisabledFeature.kt"); + } + + @TestMetadata("memberExtensionFunCallInBody.kt") + public void testMemberExtensionFunCallInBody() throws Exception { + runTest("../../../idea/tests/testData/intentions/contextParameters/receiverToContextParameter/memberExtensionFunCallInBody.kt"); + } + + @TestMetadata("memberFunCallInBody.kt") + public void testMemberFunCallInBody() throws Exception { + runTest("../../../idea/tests/testData/intentions/contextParameters/receiverToContextParameter/memberFunCallInBody.kt"); + } + + @TestMetadata("withAnotherContextBefore.kt") + public void testWithAnotherContextBefore() throws Exception { + runTest("../../../idea/tests/testData/intentions/contextParameters/receiverToContextParameter/withAnotherContextBefore.kt"); + } + } + @RunWith(JUnit3RunnerWithInners.class) @TestMetadata("../../../idea/tests/testData/intentions/contextParameters/regularParameterToContextParameter") public static class RegularParameterToContextParameter extends AbstractK2IntentionTest { diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/.k2Intention b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/.k2Intention new file mode 100644 index 000000000000..5656b5c7d9d0 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/.k2Intention @@ -0,0 +1 @@ +org.jetbrains.kotlin.idea.k2.codeinsight.intentions.ConvertReceiverParameterToContextParameterIntention \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/classScopeExtensionArgument.kt b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/classScopeExtensionArgument.kt new file mode 100644 index 000000000000..5c09ef798e3c --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/classScopeExtensionArgument.kt @@ -0,0 +1,14 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters + +interface Foo + +context(c: Int) +fun Foo.foo(param: String) { +} + +class Bar : Foo { + context(c1: Int) + fun baz() { + foo("boo") + } +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/classScopeExtensionArgument.kt.after b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/classScopeExtensionArgument.kt.after new file mode 100644 index 000000000000..f78e8f30de16 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/classScopeExtensionArgument.kt.after @@ -0,0 +1,14 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters + +interface Foo + +context(c: Int, foo: Foo) +fun foo(param: String) { +} + +class Bar : Foo { + context(c1: Int) + fun baz() { + foo("boo") + } +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/contextFunCallInBody.kt b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/contextFunCallInBody.kt new file mode 100644 index 000000000000..f82a5c746579 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/contextFunCallInBody.kt @@ -0,0 +1,9 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters + +fun String.foo() { + bar() +} + +context(c: String) +fun bar() { +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/contextFunCallInBody.kt.after b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/contextFunCallInBody.kt.after new file mode 100644 index 000000000000..1179ac9f49bb --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/contextFunCallInBody.kt.after @@ -0,0 +1,9 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters + +context(string: String) fun foo() { + bar() +} + +context(c: String) +fun bar() { +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/contextMemberExtensionFunCallInBody.kt b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/contextMemberExtensionFunCallInBody.kt new file mode 100644 index 000000000000..ace4a50bbbde --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/contextMemberExtensionFunCallInBody.kt @@ -0,0 +1,13 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters +// K2_AFTER_ERROR: Unresolved reference 'bar'. +/* KTIJ-34522 */ + +context(c1: Int) +fun Bar.foo() { + "foo".bar() +} + +class Bar { + context(c: Int) + fun String.bar() {} +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/contextMemberExtensionFunCallInBody.kt.after b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/contextMemberExtensionFunCallInBody.kt.after new file mode 100644 index 000000000000..ab35ba4baa85 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/contextMemberExtensionFunCallInBody.kt.after @@ -0,0 +1,13 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters +// K2_AFTER_ERROR: Unresolved reference 'bar'. +/* KTIJ-34522 */ + +context(c1: Int, bar: Bar) +fun foo() { + "foo".bar() +} + +class Bar { + context(c: Int) + fun String.bar() {} +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/explicitExtensionArgument.kt b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/explicitExtensionArgument.kt new file mode 100644 index 000000000000..56126dfc28b0 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/explicitExtensionArgument.kt @@ -0,0 +1,10 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters + +context(c: Int) +fun String.foo(param: String) { +} + +context(c1: Int) +fun bar() { + "baz".foo("boo") +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/explicitExtensionArgument.kt.after b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/explicitExtensionArgument.kt.after new file mode 100644 index 000000000000..d0ae749ed098 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/explicitExtensionArgument.kt.after @@ -0,0 +1,12 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters + +context(c: Int, string: String) +fun foo(param: String) { +} + +context(c1: Int) +fun bar() { + with("baz") { + foo("boo") + } +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/explicitThisInBody.kt b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/explicitThisInBody.kt new file mode 100644 index 000000000000..5c7d7549a8f4 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/explicitThisInBody.kt @@ -0,0 +1,5 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters + +fun String.foo() { + println(this) +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/explicitThisInBody.kt.after b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/explicitThisInBody.kt.after new file mode 100644 index 000000000000..1799208314ba --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/explicitThisInBody.kt.after @@ -0,0 +1,5 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters + +context(string: String) fun foo() { + println(string) +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/extensionFunCallInBody.kt b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/extensionFunCallInBody.kt new file mode 100644 index 000000000000..7369ab1a3325 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/extensionFunCallInBody.kt @@ -0,0 +1,8 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters + +fun String.foo() { + bar() +} + +fun String.bar() { +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/extensionFunCallInBody.kt.after b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/extensionFunCallInBody.kt.after new file mode 100644 index 000000000000..17d7f4bc12be --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/extensionFunCallInBody.kt.after @@ -0,0 +1,8 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters + +context(string: String) fun foo() { + string.bar() +} + +fun String.bar() { +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/implicitExtensionArgument.kt b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/implicitExtensionArgument.kt new file mode 100644 index 000000000000..53624182d3ed --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/implicitExtensionArgument.kt @@ -0,0 +1,10 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters + +context(c: Int) +fun String.foo(param: String) { +} + +context(c1: Int) +fun String.bar() { + foo("boo") +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/implicitExtensionArgument.kt.after b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/implicitExtensionArgument.kt.after new file mode 100644 index 000000000000..3d87b54f33d6 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/implicitExtensionArgument.kt.after @@ -0,0 +1,10 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters + +context(c: Int, string: String) +fun foo(param: String) { +} + +context(c1: Int) +fun String.bar() { + foo("boo") +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/implicitThisInBody.kt b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/implicitThisInBody.kt new file mode 100644 index 000000000000..5dad32923ef8 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/implicitThisInBody.kt @@ -0,0 +1,5 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters + +fun String.foo() { + println(isEmpty()) +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/implicitThisInBody.kt.after b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/implicitThisInBody.kt.after new file mode 100644 index 000000000000..2ab932ad5750 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/implicitThisInBody.kt.after @@ -0,0 +1,5 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters + +context(string: String) fun foo() { + println(string.isEmpty()) +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/inapplicableDisabledFeature.kt b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/inapplicableDisabledFeature.kt new file mode 100644 index 000000000000..0e512ea09476 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/inapplicableDisabledFeature.kt @@ -0,0 +1,5 @@ +// LANGUAGE_VERSION: 2.1 +// IS_APPLICABLE: false + +fun String.foo() { +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/memberExtensionFunCallInBody.kt b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/memberExtensionFunCallInBody.kt new file mode 100644 index 000000000000..cbe63ed8a2d8 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/memberExtensionFunCallInBody.kt @@ -0,0 +1,11 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters +// K2_AFTER_ERROR: Unresolved reference 'bar'. +/* KTIJ-34522 */ + +fun Bar.foo() { + "foo".bar() +} + +class Bar { + fun String.bar() {} +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/memberExtensionFunCallInBody.kt.after b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/memberExtensionFunCallInBody.kt.after new file mode 100644 index 000000000000..df3513737da3 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/memberExtensionFunCallInBody.kt.after @@ -0,0 +1,11 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters +// K2_AFTER_ERROR: Unresolved reference 'bar'. +/* KTIJ-34522 */ + +context(bar: Bar) fun foo() { + "foo".bar() +} + +class Bar { + fun String.bar() {} +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/memberFunCallInBody.kt b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/memberFunCallInBody.kt new file mode 100644 index 000000000000..b7c67a78a3bb --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/memberFunCallInBody.kt @@ -0,0 +1,9 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters + +fun Bar.foo() { + bar() +} + +class Bar { + fun bar() {} +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/memberFunCallInBody.kt.after b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/memberFunCallInBody.kt.after new file mode 100644 index 000000000000..8c7b155d89ac --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/memberFunCallInBody.kt.after @@ -0,0 +1,9 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters + +context(bar: Bar) fun foo() { + bar.bar() +} + +class Bar { + fun bar() {} +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/withAnotherContextBefore.kt b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/withAnotherContextBefore.kt new file mode 100644 index 000000000000..0354e7621568 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/withAnotherContextBefore.kt @@ -0,0 +1,5 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters + +context(c1: Int) +fun String.foo() { +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/withAnotherContextBefore.kt.after b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/withAnotherContextBefore.kt.after new file mode 100644 index 000000000000..d8477f53cd55 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/contextParameters/receiverToContextParameter/withAnotherContextBefore.kt.after @@ -0,0 +1,5 @@ +// COMPILER_ARGUMENTS: -Xcontext-parameters + +context(c1: Int, string: String) +fun foo() { +}