From f72e6fd9618c8713c6a99ee3f6c8b582227e2a24 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 26 Jun 2024 17:45:02 +0200 Subject: [PATCH] [kotlin] k2: port ConvertParameterToReceiver ^KTIJ-30159 fixed GitOrigin-RevId: e75de574e0e8393cf05f64cba1adbf8d9b70c572 --- .../kotlin.code-insight.intentions.k2.xml | 7 + .../ConvertParameterToReceiverIntention.kt | 80 ++++++++++++ .../tests/K2IntentionTestGenerated.java | 122 ++++++++++++++++++ .../convertParameterToReceiver/.k2Intention | 1 + .../functionExpressionWithThisConflict.kt | 1 + .../localObjectWithFunctionNameConflict.kt | 1 + .../parameterOfObjectFunction.kt | 1 + .../parameterOfObjectFunction.kt.after | 1 + .../changeSignature/actual/jvm/Some.kt | 1 - .../changeSignature/actual/jvm/Some.kt.after | 1 - .../changeSignature/expect/common/Some.kt | 1 - .../expect/common/Some.kt.after | 1 - .../changeSignature/override/jvm/Some.kt | 1 - .../override/jvm/Some.kt.after | 1 - .../changeSignature/override2/jvm/Some.kt | 1 - .../override2/jvm/Some.kt.after | 1 - .../changeSignature/override3/common/Some.kt | 1 - .../override3/common/Some.kt.after | 1 - .../changeSignature/override4/common/Some.kt | 1 - .../override4/common/Some.kt.after | 1 - .../changeSignature/override5/common/Some.kt | 1 - .../override5/common/Some.kt.after | 1 - .../changeSignature/override6/jvm/Some.kt | 1 - .../override6/jvm/Some.kt.after | 1 - .../header/header.kt | 1 - .../header/header.kt.after | 1 - .../js/js.kt | 1 - .../js/js.kt.after | 1 - ...ssToPropertyOfClassViaReceiver.kt.k2.after | 2 +- ...idingCompanionPropertyByEnumEntry.kt.after | 2 +- ...gCompanionPropertyByEnumEntry1.kt.k2.after | 8 ++ .../KotlinChangeSignatureUsageSearcher.kt | 5 +- .../usages/KotlinParameterUsage.kt | 8 +- .../copy/CopyKotlinDeclarationsHandler.kt | 8 +- .../codeInliner/InlinePreprocessorUtil.kt | 27 ++-- .../kotlin/idea/k2/refactoring/utils.kt | 23 ++++ .../refactoring/rename/renameConflictUtils.kt | 16 +-- .../codeinsight/GenerateK2IntentionTests.kt | 2 +- 38 files changed, 268 insertions(+), 67 deletions(-) create mode 100644 plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertParameterToReceiverIntention.kt create mode 100644 plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/.k2Intention create mode 100644 plugins/kotlin/idea/tests/testData/refactoring/rename/inplace/HidingCompanionPropertyByEnumEntry1.kt.k2.after 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 4e5c49c66718..24e97b2cf647 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 @@ -275,6 +275,13 @@ group.names.kotlin + + kotlin + org.jetbrains.kotlin.idea.k2.codeinsight.intentions.ConvertParameterToReceiverIntention + messages.KotlinBundle + group.names.kotlin + + kotlin org.jetbrains.kotlin.idea.k2.codeinsight.intentions.IfToWhenIntention diff --git a/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertParameterToReceiverIntention.kt b/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertParameterToReceiverIntention.kt new file mode 100644 index 000000000000..be4519edc064 --- /dev/null +++ b/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/intentions/ConvertParameterToReceiverIntention.kt @@ -0,0 +1,80 @@ +// Copyright 2000-2024 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.openapi.actionSystem.ActionPlaces +import com.intellij.openapi.actionSystem.impl.Utils.computeWithProgressIcon +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.application.ReadAction +import com.intellij.openapi.application.readAction +import com.intellij.openapi.editor.Editor +import com.intellij.psi.PsiMethod +import com.intellij.refactoring.RefactoringBundle +import com.intellij.ui.awt.RelativePoint +import org.jetbrains.kotlin.analysis.api.analyze +import org.jetbrains.kotlin.idea.base.resources.KotlinBundle +import org.jetbrains.kotlin.idea.codeinsight.api.classic.intentions.SelfTargetingIntention +import org.jetbrains.kotlin.idea.codeinsight.utils.findExistingEditor +import org.jetbrains.kotlin.idea.findUsages.KotlinFindUsagesSupport +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.k2.refactoring.checkSuperMethods +import org.jetbrains.kotlin.lexer.KtTokens.OVERRIDE_KEYWORD +import org.jetbrains.kotlin.psi.KtNamedFunction +import org.jetbrains.kotlin.psi.KtParameter +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType + +internal class ConvertParameterToReceiverIntention : SelfTargetingIntention( +KtParameter::class.java, +KotlinBundle.lazyMessage("convert.parameter.to.receiver") +) { + + override fun startInWriteAction(): Boolean = false + + override fun isApplicableTo(element: KtParameter, caretOffset: Int): Boolean { + val nameIdentifier = element.nameIdentifier ?: return false + if (!nameIdentifier.textRange.contains(caretOffset)) return false + + if (element.isVarArg) return false + + val namedFunction = element.ownerFunction as? KtNamedFunction ?: return false + if (namedFunction.receiverTypeReference != null) return false + if (namedFunction.hasModifier(OVERRIDE_KEYWORD)) { + val overridesJava = { + analyze(namedFunction) { + namedFunction.symbol.allOverriddenSymbols.any { it.psi is PsiMethod } + } + } + + val hasJavaOverride = if (ApplicationManager.getApplication().isDispatchThread()) { + val editor = element.findExistingEditor()!! + val aComponent = editor.contentComponent + val point = RelativePoint(aComponent, editor.logicalPositionToXY(editor.offsetToLogicalPosition(caretOffset))) + computeWithProgressIcon(point, aComponent, ActionPlaces.UNKNOWN) { + readAction { overridesJava() } + } + } + else { + overridesJava() + } + + if (hasJavaOverride) return false + } + return true + } + + override fun applyTo(element: KtParameter, editor: Editor?) { + val function = element.getStrictParentOfType() ?: return + val parameterIndex = function.valueParameters.indexOf(element) + + val superMethods = checkSuperMethods(function, emptyList(), RefactoringBundle.message("to.refactor")) + val superFunction = superMethods.firstOrNull() as? KtNamedFunction ?: return + + val methodDescriptor = KotlinMethodDescriptor(superFunction) + + val changeInfo = KotlinChangeInfo(methodDescriptor) + changeInfo.receiverParameterInfo = changeInfo.newParameters[parameterIndex] + + KotlinChangeSignatureProcessor(element.project, changeInfo).run() + } +} \ No newline at end of file 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 a72fc7d01654..6b6998e538bb 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 @@ -8052,7 +8052,129 @@ public abstract class K2IntentionTestGenerated extends AbstractK2IntentionTest { + @RunWith(JUnit3RunnerWithInners.class) + @TestMetadata("../../../idea/tests/testData/intentions/convertParameterToReceiver") + public static class ConvertParameterToReceiver 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("classParameter.kt") + public void testClassParameter() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/classParameter.kt"); + } + + @TestMetadata("companionAsReceiver.kt") + public void testCompanionAsReceiver() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/companionAsReceiver.kt"); + } + + @TestMetadata("definitelyNotNullType.kt") + public void testDefinitelyNotNullType() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/definitelyNotNullType.kt"); + } + + @TestMetadata("explicitThis.kt") + public void testExplicitThis() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/explicitThis.kt"); + } + + @TestMetadata("explicitThisForAnonymousObject.kt") + public void testExplicitThisForAnonymousObject() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/explicitThisForAnonymousObject.kt"); + } + + @TestMetadata("explicitThisForExtension.kt") + public void testExplicitThisForExtension() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/explicitThisForExtension.kt"); + } + + @TestMetadata("explicitThisForExtension2.kt") + public void testExplicitThisForExtension2() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/explicitThisForExtension2.kt"); + } + + @TestMetadata("functionExpression.kt") + public void testFunctionExpression() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/functionExpression.kt"); + } + + @TestMetadata("functionExpressionWithThisConflict.kt") + public void testFunctionExpressionWithThisConflict() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/functionExpressionWithThisConflict.kt"); + } + + @TestMetadata("hasVararg.kt") + public void testHasVararg() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/hasVararg.kt"); + } + + @TestMetadata("javaBaseMethod.kt") + public void testJavaBaseMethod() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/javaBaseMethod.kt"); + } + + @TestMetadata("kotlinBaseMethod.kt") + public void testKotlinBaseMethod() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/kotlinBaseMethod.kt"); + } + + @TestMetadata("lambdaParameter.kt") + public void testLambdaParameter() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/lambdaParameter.kt"); + } + + @TestMetadata("localFun.kt") + public void testLocalFun() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/localFun.kt"); + } + + @TestMetadata("localObject.kt") + public void testLocalObject() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/localObject.kt"); + } + + @TestMetadata("localObjectWithFunctionNameConflict.kt") + public void testLocalObjectWithFunctionNameConflict() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/localObjectWithFunctionNameConflict.kt"); + } + + @TestMetadata("memberFun.kt") + public void testMemberFun() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/memberFun.kt"); + } + + @TestMetadata("noParameterUnderCaret.kt") + public void testNoParameterUnderCaret() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/noParameterUnderCaret.kt"); + } + + @TestMetadata("parameterOfObjectFunction.kt") + public void testParameterOfObjectFunction() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/parameterOfObjectFunction.kt"); + } + + @TestMetadata("topLevelFun.kt") + public void testTopLevelFun() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/topLevelFun.kt"); + } + + @TestMetadata("vararg.kt") + public void testVararg() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/vararg.kt"); + } + + @TestMetadata("withExtensionReceiver.kt") + public void testWithExtensionReceiver() throws Exception { + runTest("../../../idea/tests/testData/intentions/convertParameterToReceiver/withExtensionReceiver.kt"); + } + } diff --git a/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/.k2Intention b/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/.k2Intention new file mode 100644 index 000000000000..3b2e9683417f --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/.k2Intention @@ -0,0 +1 @@ +org.jetbrains.kotlin.idea.k2.codeinsight.intentions.ConvertParameterToReceiverIntention diff --git a/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/functionExpressionWithThisConflict.kt b/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/functionExpressionWithThisConflict.kt index 64ab49984d21..a2e4fef1277c 100644 --- a/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/functionExpressionWithThisConflict.kt +++ b/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/functionExpressionWithThisConflict.kt @@ -1,4 +1,5 @@ // SHOULD_FAIL_WITH: Parameter reference can't be safely replaced with this since target function can't be referenced in this context +// IGNORE_K2 interface T { val foo: Int } diff --git a/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/localObjectWithFunctionNameConflict.kt b/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/localObjectWithFunctionNameConflict.kt index b9c613c361b9..9e97f936d4cc 100644 --- a/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/localObjectWithFunctionNameConflict.kt +++ b/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/localObjectWithFunctionNameConflict.kt @@ -1,4 +1,5 @@ // SHOULD_FAIL_WITH: Parameter reference can't be safely replaced with this@foo since @foo is ambiguous in this context +// IGNORE_K2 fun foo(bar: Int) { object { fun foo() { diff --git a/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/parameterOfObjectFunction.kt b/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/parameterOfObjectFunction.kt index 91ec423d10e8..5bae445ef08d 100644 --- a/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/parameterOfObjectFunction.kt +++ b/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/parameterOfObjectFunction.kt @@ -1,4 +1,5 @@ // WITH_STDLIB +// IGNORE_K2 object Foo { fun bar(p: String){} } diff --git a/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/parameterOfObjectFunction.kt.after b/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/parameterOfObjectFunction.kt.after index 73ec4d66406a..e69da70337f9 100644 --- a/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/parameterOfObjectFunction.kt.after +++ b/plugins/kotlin/idea/tests/testData/intentions/convertParameterToReceiver/parameterOfObjectFunction.kt.after @@ -1,6 +1,7 @@ import Foo.bar // WITH_STDLIB +// IGNORE_K2 object Foo { fun String.bar() {} } diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/actual/jvm/Some.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/actual/jvm/Some.kt index 5989b81f3692..edce719ed456 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/actual/jvm/Some.kt +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/actual/jvm/Some.kt @@ -1,3 +1,2 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 actual fun f1(i: Int, s: String) {} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/actual/jvm/Some.kt.after b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/actual/jvm/Some.kt.after index 58ad986ccc24..a0144c910f14 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/actual/jvm/Some.kt.after +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/actual/jvm/Some.kt.after @@ -1,3 +1,2 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 actual fun String.f1(i: Int) {} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/expect/common/Some.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/expect/common/Some.kt index 4939db48a917..c64a64ffc392 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/expect/common/Some.kt +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/expect/common/Some.kt @@ -1,3 +1,2 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 expect fun f1(i: Int, s: String) \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/expect/common/Some.kt.after b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/expect/common/Some.kt.after index d58905c661d2..de1f452584ae 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/expect/common/Some.kt.after +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/expect/common/Some.kt.after @@ -1,3 +1,2 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 expect fun String.f1(i: Int) \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override/jvm/Some.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override/jvm/Some.kt index b1c3c620d9a3..39a9908d8d33 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override/jvm/Some.kt +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override/jvm/Some.kt @@ -1,5 +1,4 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 actual open class A { actual open fun c(a: Int, b: String) {} } diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override/jvm/Some.kt.after b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override/jvm/Some.kt.after index 11be9bca9615..7ecfb5b1a32d 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override/jvm/Some.kt.after +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override/jvm/Some.kt.after @@ -1,5 +1,4 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 actual open class A { actual open fun String.c(a: Int) {} } diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override2/jvm/Some.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override2/jvm/Some.kt index ff5666df09b2..dd14cda9223e 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override2/jvm/Some.kt +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override2/jvm/Some.kt @@ -1,5 +1,4 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 actual open class A { actual open fun c(a: Int, b: String) {} } diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override2/jvm/Some.kt.after b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override2/jvm/Some.kt.after index 6f0242f9954a..7c15ed819cdc 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override2/jvm/Some.kt.after +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override2/jvm/Some.kt.after @@ -1,5 +1,4 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 actual open class A { actual open fun String.c(a: Int) {} } diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override3/common/Some.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override3/common/Some.kt index c5d7d1c198ca..1b18e61506a5 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override3/common/Some.kt +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override3/common/Some.kt @@ -1,5 +1,4 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 expect class A { fun c(a: Int, b: String) } \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override3/common/Some.kt.after b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override3/common/Some.kt.after index a113790082dc..fb1804a6cabf 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override3/common/Some.kt.after +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override3/common/Some.kt.after @@ -1,5 +1,4 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 expect class A { fun String.c(a: Int) } \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override4/common/Some.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override4/common/Some.kt index 78587b46f6ed..d46aa54a0182 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override4/common/Some.kt +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override4/common/Some.kt @@ -1,5 +1,4 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 expect open class A() { open fun c(a: Int, b: String) } diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override4/common/Some.kt.after b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override4/common/Some.kt.after index 05a22b0e2cb2..674179b81cfa 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override4/common/Some.kt.after +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override4/common/Some.kt.after @@ -1,5 +1,4 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 expect open class A() { open fun String.c(a: Int) } diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override5/common/Some.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override5/common/Some.kt index f1a7adeb9917..b71edc391703 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override5/common/Some.kt +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override5/common/Some.kt @@ -1,5 +1,4 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 expect open class A() { open fun c(a: Int, b: String) } diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override5/common/Some.kt.after b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override5/common/Some.kt.after index 9499ad8fd429..c683bb25548a 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override5/common/Some.kt.after +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override5/common/Some.kt.after @@ -1,5 +1,4 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 expect open class A() { open fun String.c(a: Int) } diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override6/jvm/Some.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override6/jvm/Some.kt index b7f717857ce4..dbef60e6f987 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override6/jvm/Some.kt +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override6/jvm/Some.kt @@ -1,5 +1,4 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 actual open class A { actual open fun c(a: Int, b: String) {} } diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override6/jvm/Some.kt.after b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override6/jvm/Some.kt.after index 2270f13de945..4db18395bdb2 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override6/jvm/Some.kt.after +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/changeSignature/override6/jvm/Some.kt.after @@ -1,5 +1,4 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 actual open class A { actual open fun String.c(a: Int) {} } diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/other/memberFunParameterToReceiverByHeader/header/header.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/other/memberFunParameterToReceiverByHeader/header/header.kt index eef4f9112986..f44767d5ebb6 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/other/memberFunParameterToReceiverByHeader/header/header.kt +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/other/memberFunParameterToReceiverByHeader/header/header.kt @@ -1,5 +1,4 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 expect class Foo { fun foo(n: Int, s: String) diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/other/memberFunParameterToReceiverByHeader/header/header.kt.after b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/other/memberFunParameterToReceiverByHeader/header/header.kt.after index 9cdcadc6969d..01e7e3534dc1 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/other/memberFunParameterToReceiverByHeader/header/header.kt.after +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/other/memberFunParameterToReceiverByHeader/header/header.kt.after @@ -1,5 +1,4 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 expect class Foo { fun String.foo(n: Int) diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/other/memberFunParameterToReceiverByImpl/js/js.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/other/memberFunParameterToReceiverByImpl/js/js.kt index a7b5ec4c7664..67f33a786e79 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/other/memberFunParameterToReceiverByImpl/js/js.kt +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/other/memberFunParameterToReceiverByImpl/js/js.kt @@ -1,5 +1,4 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 actual class Foo { actual fun foo(n: Int, s: String) { diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/other/memberFunParameterToReceiverByImpl/js/js.kt.after b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/other/memberFunParameterToReceiverByImpl/js/js.kt.after index ddfb921bea74..e92224ca30ca 100644 --- a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/other/memberFunParameterToReceiverByImpl/js/js.kt.after +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/other/memberFunParameterToReceiverByImpl/js/js.kt.after @@ -1,5 +1,4 @@ // "Convert parameter to receiver" "true" -// IGNORE_K2 actual class Foo { actual fun String.foo(n: Int) { diff --git a/plugins/kotlin/idea/tests/testData/refactoring/inline/inlineVariableOrProperty/accessToPropertyOfClassViaReceiver.kt.k2.after b/plugins/kotlin/idea/tests/testData/refactoring/inline/inlineVariableOrProperty/accessToPropertyOfClassViaReceiver.kt.k2.after index 79993148efe0..5f1070f7dce7 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/inline/inlineVariableOrProperty/accessToPropertyOfClassViaReceiver.kt.k2.after +++ b/plugins/kotlin/idea/tests/testData/refactoring/inline/inlineVariableOrProperty/accessToPropertyOfClassViaReceiver.kt.k2.after @@ -6,7 +6,7 @@ fun Foo.m() { object : Runnable { override fun run() { if ((1..2).find { - println(this@m.i) + println(this@Foo.i) true } != 0) { } diff --git a/plugins/kotlin/idea/tests/testData/refactoring/rename/inplace/HidingCompanionPropertyByEnumEntry.kt.after b/plugins/kotlin/idea/tests/testData/refactoring/rename/inplace/HidingCompanionPropertyByEnumEntry.kt.after index c01c32533324..a82387dc9dce 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/rename/inplace/HidingCompanionPropertyByEnumEntry.kt.after +++ b/plugins/kotlin/idea/tests/testData/refactoring/rename/inplace/HidingCompanionPropertyByEnumEntry.kt.after @@ -3,7 +3,7 @@ enum class MyEnum { m; companion object { val m = 1 } - fun context() = println(m.hashCode() + Companion.m) + fun context() = println(m.hashCode() + MyEnum.Companion.m) } fun external() = println(MyEnum.m.hashCode() + MyEnum.Companion.m) // IGNORE_K1 \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/rename/inplace/HidingCompanionPropertyByEnumEntry1.kt.k2.after b/plugins/kotlin/idea/tests/testData/refactoring/rename/inplace/HidingCompanionPropertyByEnumEntry1.kt.k2.after new file mode 100644 index 000000000000..51b24e30f4d4 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/rename/inplace/HidingCompanionPropertyByEnumEntry1.kt.k2.after @@ -0,0 +1,8 @@ +// NEW_NAME: e +// RENAME: member +enum class MyEnum { + e; + companion object { val e = 1 } + fun context() = println(e.hashCode() + MyEnum.Companion.e) +} +fun external() = println(MyEnum.e.hashCode() + MyEnum.Companion.e) \ No newline at end of file diff --git a/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/changeSignature/KotlinChangeSignatureUsageSearcher.kt b/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/changeSignature/KotlinChangeSignatureUsageSearcher.kt index 6234b9b87c73..fe6edf322b7a 100644 --- a/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/changeSignature/KotlinChangeSignatureUsageSearcher.kt +++ b/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/changeSignature/KotlinChangeSignatureUsageSearcher.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KaValueParameterSymbol import org.jetbrains.kotlin.idea.base.resources.KotlinBundle import org.jetbrains.kotlin.idea.base.util.useScope import org.jetbrains.kotlin.idea.k2.refactoring.changeSignature.usages.* +import org.jetbrains.kotlin.idea.k2.refactoring.getThisQualifier import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.kdoc.psi.impl.KDocName import org.jetbrains.kotlin.psi.* @@ -116,8 +117,8 @@ internal object KotlinChangeSignatureUsageSearcher { if (name != null) { if (receiverExpression is KtThisExpression) { result.add(KotlinNonQualifiedOuterThisUsage(receiverExpression, name)) - } else if (receiverValue is KaImplicitReceiverValue && partiallyAppliedSymbol.extensionReceiver == null) { - result.add(KotlinImplicitThisUsage(receiverExpression, name)) + } else if (receiverValue is KaImplicitReceiverValue && partiallyAppliedSymbol.extensionReceiver == null && receiverExpression is KtNameReferenceExpression) { + result.add(KotlinImplicitThisUsage(receiverExpression, getThisQualifier(receiverValue))) } } } diff --git a/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/changeSignature/usages/KotlinParameterUsage.kt b/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/changeSignature/usages/KotlinParameterUsage.kt index af8821b555fd..9b48d2296943 100644 --- a/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/changeSignature/usages/KotlinParameterUsage.kt +++ b/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/changeSignature/usages/KotlinParameterUsage.kt @@ -69,19 +69,15 @@ internal class KotlinImplicitThisToParameterUsage( internal class KotlinImplicitThisUsage( callElement: KtElement, - private val targetDescriptor: Name + private val newReceiver: String ) : UsageInfo(callElement), KotlinBaseChangeSignatureUsage { - private fun getNewReceiverText() = when { - targetDescriptor.isSpecial -> "this" - else -> "this@${targetDescriptor.asString()}" - } override fun processUsage( changeInfo: KotlinChangeInfoBase, element: KtElement, allUsages: Array ): KtElement { - val newQualifiedCall = KtPsiFactory(element.project).createExpression("${getNewReceiverText()}.${element.text}" + val newQualifiedCall = KtPsiFactory(element.project).createExpression("$newReceiver.${element.text}" ) as KtQualifiedExpression return element.replace(newQualifiedCall).parent as KtElement } diff --git a/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/copy/CopyKotlinDeclarationsHandler.kt b/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/copy/CopyKotlinDeclarationsHandler.kt index a871a5c23c64..1ae4970deea0 100644 --- a/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/copy/CopyKotlinDeclarationsHandler.kt +++ b/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/copy/CopyKotlinDeclarationsHandler.kt @@ -3,6 +3,8 @@ package org.jetbrains.kotlin.idea.k2.refactoring.copy import com.intellij.ide.util.EditorHelper +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.application.ex.ApplicationManagerEx import com.intellij.openapi.application.runWriteAction import com.intellij.openapi.project.Project import com.intellij.openapi.ui.Messages @@ -171,8 +173,10 @@ class CopyKotlinDeclarationsHandler : AbstractCopyKotlinDeclarationsHandler() { project.checkConflictsInteractively(conflicts) { try { - project.executeCommand(copyCommandName) { - doRefactor(sourceData, targetData) + ApplicationManagerEx.getApplicationEx().runWriteActionWithCancellableProgressInDispatchThread(copyCommandName, project, null) { + project.executeCommand(copyCommandName) { + doRefactor(sourceData, targetData) + } } } finally { elements.filterIsInstance().forEach(::unMarkAllUsages) diff --git a/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/inline/codeInliner/InlinePreprocessorUtil.kt b/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/inline/codeInliner/InlinePreprocessorUtil.kt index 891229e9484a..706886513cdb 100644 --- a/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/inline/codeInliner/InlinePreprocessorUtil.kt +++ b/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/inline/codeInliner/InlinePreprocessorUtil.kt @@ -3,22 +3,22 @@ package org.jetbrains.kotlin.idea.k2.refactoring.inline.codeInliner import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analysis.api.KaExperimentalApi -import org.jetbrains.kotlin.analysis.api.KaSession import org.jetbrains.kotlin.analysis.api.analyze -import org.jetbrains.kotlin.analysis.api.resolution.KaImplicitReceiverValue -import org.jetbrains.kotlin.analysis.api.resolution.singleFunctionCallOrNull -import org.jetbrains.kotlin.analysis.api.resolution.singleVariableAccessCall -import org.jetbrains.kotlin.analysis.api.resolution.symbol import org.jetbrains.kotlin.analysis.api.permissions.KaAllowAnalysisFromWriteAction import org.jetbrains.kotlin.analysis.api.permissions.KaAllowAnalysisOnEdt import org.jetbrains.kotlin.analysis.api.permissions.allowAnalysisFromWriteAction import org.jetbrains.kotlin.analysis.api.permissions.allowAnalysisOnEdt +import org.jetbrains.kotlin.analysis.api.resolution.KaImplicitReceiverValue +import org.jetbrains.kotlin.analysis.api.resolution.singleFunctionCallOrNull +import org.jetbrains.kotlin.analysis.api.resolution.singleVariableAccessCall +import org.jetbrains.kotlin.analysis.api.resolution.symbol import org.jetbrains.kotlin.analysis.api.symbols.* -import org.jetbrains.kotlin.analysis.api.symbols.markers.KaNamedSymbol +import org.jetbrains.kotlin.analysis.api.symbols.markers.KaDeclarationContainerSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KaSymbolWithMembers import org.jetbrains.kotlin.analysis.api.types.KaFunctionType import org.jetbrains.kotlin.idea.codeinsight.utils.addTypeArguments import org.jetbrains.kotlin.idea.codeinsight.utils.getRenderedTypeArguments +import org.jetbrains.kotlin.idea.k2.refactoring.getThisQualifier import org.jetbrains.kotlin.idea.k2.refactoring.util.ConvertReferenceToLambdaUtil import org.jetbrains.kotlin.idea.refactoring.inline.codeInliner.CodeToInline import org.jetbrains.kotlin.idea.refactoring.inline.codeInliner.MutableCodeToInline @@ -209,9 +209,9 @@ internal fun encodeInternalReferences(codeToInline: MutableCodeToInline, origina analyze(t) { val resolvedSymbol = t.symbol val containingSymbol = resolvedSymbol.containingSymbol ?: return true - if (containingSymbol is KaSymbolWithMembers) { + if (containingSymbol is KaDeclarationContainerSymbol) { val staticScope = containingSymbol.staticMemberScope - return resolvedSymbol in staticScope.getAllSymbols() + return resolvedSymbol in staticScope.declarations } return false } @@ -306,15 +306,4 @@ internal fun specifyNullTypeExplicitly(codeToInline: MutableCodeToInline, origin codeToInline.replaceExpression(it, KtPsiFactory.contextual(it).createExpression(nullCast)) } } -} - -context(KaSession) -internal fun getThisQualifier(receiverValue: KaImplicitReceiverValue): String { - val symbol = receiverValue.symbol - return if ((symbol as? KaClassSymbol)?.classKind == KaClassKind.COMPANION_OBJECT) { - (symbol.containingSymbol as KaClassifierSymbol).name!!.asString() + "." + symbol.name!!.asString() - } - else { - "this" + ((((symbol as? KaReceiverParameterSymbol)?.owningCallableSymbol ?: symbol) as? KaNamedSymbol)?.name?.let { "@$it" } ?: "") - } } \ No newline at end of file diff --git a/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/utils.kt b/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/utils.kt index f1eddee02fa6..cc1f2c255439 100644 --- a/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/utils.kt +++ b/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/utils.kt @@ -9,13 +9,21 @@ import com.intellij.psi.PsiElement import com.intellij.psi.util.parentOfType import com.intellij.refactoring.util.RefactoringDescriptionLocation import org.jetbrains.annotations.Nls +import org.jetbrains.kotlin.analysis.api.KaSession import org.jetbrains.kotlin.analysis.api.analyze import org.jetbrains.kotlin.analysis.api.resolution.KaErrorCallInfo +import org.jetbrains.kotlin.analysis.api.resolution.KaImplicitReceiverValue import org.jetbrains.kotlin.analysis.api.resolution.KaSimpleFunctionCall import org.jetbrains.kotlin.analysis.api.resolution.successfulFunctionCallOrNull import org.jetbrains.kotlin.analysis.api.resolution.successfulVariableAccessCall import org.jetbrains.kotlin.analysis.api.resolution.symbol +import org.jetbrains.kotlin.analysis.api.symbols.KaAnonymousObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.KaCallableSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KaClassKind +import org.jetbrains.kotlin.analysis.api.symbols.KaClassSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KaClassifierSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KaReceiverParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.markers.KaNamedSymbol import org.jetbrains.kotlin.analysis.api.types.KaType import org.jetbrains.kotlin.analysis.api.types.KaTypeParameterType import org.jetbrains.kotlin.idea.base.analysis.api.utils.analyzeInModalWindow @@ -177,4 +185,19 @@ fun KtLambdaExpression.moveFunctionLiteralOutsideParenthesesIfPossible() { if (call.canMoveLambdaOutsideParentheses()) { call.moveFunctionLiteralOutsideParentheses() } +} + +context(KaSession) +fun getThisQualifier(receiverValue: KaImplicitReceiverValue): String { + val symbol = receiverValue.symbol + return if ((symbol as? KaClassSymbol)?.classKind == KaClassKind.COMPANION_OBJECT) { + //specify companion name to avoid clashes with enum entries + (symbol.containingSymbol as KaClassifierSymbol).name!!.asString() + "." + symbol.name!!.asString() + } else if (symbol is KaClassifierSymbol && symbol !is KaAnonymousObjectSymbol) { + "this@" + symbol.name!!.asString() + } else if (symbol is KaReceiverParameterSymbol && symbol.owningCallableSymbol is KaNamedSymbol) { + receiverValue.type.expandedSymbol?.name?.let { "this@$it" } ?: "this" + } else { + "this" + } } \ No newline at end of file diff --git a/plugins/kotlin/refactorings/rename.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/rename/renameConflictUtils.kt b/plugins/kotlin/refactorings/rename.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/rename/renameConflictUtils.kt index 2f1e4c1ad2d6..595b555f7f78 100644 --- a/plugins/kotlin/refactorings/rename.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/rename/renameConflictUtils.kt +++ b/plugins/kotlin/refactorings/rename.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/rename/renameConflictUtils.kt @@ -10,9 +10,9 @@ import org.jetbrains.kotlin.analysis.api.KaSession import org.jetbrains.kotlin.analysis.api.analyze import org.jetbrains.kotlin.analysis.api.resolution.* import org.jetbrains.kotlin.analysis.api.symbols.* -import org.jetbrains.kotlin.analysis.api.symbols.markers.KaNamedSymbol import org.jetbrains.kotlin.analysis.api.types.KaErrorType import org.jetbrains.kotlin.idea.base.resources.KotlinBundle +import org.jetbrains.kotlin.idea.k2.refactoring.getThisQualifier import org.jetbrains.kotlin.idea.refactoring.conflicts.filterCandidates import org.jetbrains.kotlin.idea.refactoring.conflicts.registerRetargetJobOnPotentialCandidates import org.jetbrains.kotlin.idea.refactoring.conflicts.renderDescription @@ -260,20 +260,6 @@ private fun createQualifiedExpression(callExpression: KtExpression, newName: Str val appliedSymbol = callExpression.resolveToCall()?.successfulCallOrNull>()?.partiallyAppliedSymbol val receiver = appliedSymbol?.extensionReceiver ?: appliedSymbol?.dispatchReceiver - fun getThisQualifier(receiverValue: KaImplicitReceiverValue): String { - val symbol = receiverValue.symbol - return if ((symbol as? KaClassSymbol)?.classKind == KaClassKind.COMPANION_OBJECT) { - //specify companion name to avoid clashes with enum entries - symbol.name!!.asString() - } else if (symbol is KaClassifierSymbol && symbol !is KaAnonymousObjectSymbol) { - "this@" + symbol.name!!.asString() - } else if (symbol is KaReceiverParameterSymbol && symbol.owningCallableSymbol is KaNamedSymbol) { - receiverValue.type.expandedSymbol?.name?.let { "this@$it" } ?: "this" - } else { - "this" - } - } - fun getExplicitQualifier(receiverValue: KaExplicitReceiverValue): String? { val containingSymbol = appliedSymbol?.symbol?.containingSymbol val enumClassSymbol = containingSymbol?.containingSymbol diff --git a/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2IntentionTests.kt b/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2IntentionTests.kt index 8ff46132f384..bd9b4f972ac6 100644 --- a/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2IntentionTests.kt +++ b/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2IntentionTests.kt @@ -158,7 +158,7 @@ internal fun MutableTWorkspace.generateK2IntentionTests() { model("${idea}intentions/indentRawString", pattern = pattern, isIgnored = true) model("${idea}intentions/replaceAddWithPlusAssign", pattern = pattern, isIgnored = true) model("${idea}intentions/reconstructTypeInCastOrIs", pattern = pattern, isIgnored = true) - model("${idea}intentions/convertParameterToReceiver", pattern = pattern, isIgnored = true) + model("${idea}intentions/convertParameterToReceiver", pattern = pattern) model("${idea}intentions/convertCollectionConstructorToFunction", pattern = pattern, isIgnored = true) model("${idea}intentions/replaceMapGetOrDefault", pattern = pattern, isIgnored = true) model("${idea}intentions/addMissingDestructuring", pattern = pattern, isIgnored = true)