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() {
+}