From ba6fb2412747e4f5a5e7be40141f76ef2bd67dea Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 1 Nov 2023 11:03:43 +0100 Subject: [PATCH] [kotlin] k2: change signature: support imports required for default values GitOrigin-RevId: d852c4a0c9f9aa807f69efa97f65fab5525032b7 --- .../codeinsight/utils/AddQualifiersUtil.kt | 136 ++++++++++++++++++ ...ctionParameterWithDefaultValue2After.k2.kt | 5 + ...FunctionParameterWithDefaultValue2After.kt | 2 - ...unctionParameterWithDefaultValue2Before.kt | 2 - ...nctionParameterWithDefaultValueAfter.k2.kt | 5 + ...dFunctionParameterWithDefaultValueAfter.kt | 2 - ...FunctionParameterWithDefaultValueBefore.kt | 2 - ...unctionReceiverWithDefaultValueAfter.k2.kt | 5 + ...ddFunctionReceiverWithDefaultValueAfter.kt | 2 - ...dFunctionReceiverWithDefaultValueBefore.kt | 2 - ...ReceiverWithComplexDefaultValueAfter.k2.kt | 11 ++ ...rtyReceiverWithComplexDefaultValueAfter.kt | 2 - ...tyReceiverWithComplexDefaultValueBefore.kt | 4 +- ...opertyReceiverWithDefaultValue2After.k2.kt | 10 ++ ...dPropertyReceiverWithDefaultValue2After.kt | 2 - ...PropertyReceiverWithDefaultValue2Before.kt | 4 +- ...ropertyReceiverWithDefaultValueAfter.k2.kt | 10 ++ ...ddPropertyReceiverWithDefaultValueAfter.kt | 2 - ...dPropertyReceiverWithDefaultValueBefore.kt | 4 +- .../ui/KotlinChangeSignatureDialog.kt | 17 ++- .../kotlin.refactorings.tests.k2.iml | 1 + .../KotlinFirChangeSignatureTest.kt | 3 +- 22 files changed, 199 insertions(+), 34 deletions(-) create mode 100644 plugins/kotlin/code-insight/utils/src/org/jetbrains/kotlin/idea/codeinsight/utils/AddQualifiersUtil.kt create mode 100644 plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValue2After.k2.kt create mode 100644 plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValueAfter.k2.kt create mode 100644 plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionReceiverWithDefaultValueAfter.k2.kt create mode 100644 plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithComplexDefaultValueAfter.k2.kt create mode 100644 plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValue2After.k2.kt create mode 100644 plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValueAfter.k2.kt diff --git a/plugins/kotlin/code-insight/utils/src/org/jetbrains/kotlin/idea/codeinsight/utils/AddQualifiersUtil.kt b/plugins/kotlin/code-insight/utils/src/org/jetbrains/kotlin/idea/codeinsight/utils/AddQualifiersUtil.kt new file mode 100644 index 000000000000..4a02f6dbb0df --- /dev/null +++ b/plugins/kotlin/code-insight/utils/src/org/jetbrains/kotlin/idea/codeinsight/utils/AddQualifiersUtil.kt @@ -0,0 +1,136 @@ +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.kotlin.idea.codeinsight.utils + +import com.intellij.psi.util.PsiTreeUtil +import com.intellij.psi.util.descendantsOfType +import com.intellij.psi.util.elementType +import com.intellij.refactoring.suggested.createSmartPointer +import org.jetbrains.kotlin.analysis.api.KtAllowAnalysisFromWriteAction +import org.jetbrains.kotlin.analysis.api.KtAllowAnalysisOnEdt +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.analyze +import org.jetbrains.kotlin.analysis.api.lifetime.allowAnalysisFromWriteAction +import org.jetbrains.kotlin.analysis.api.lifetime.allowAnalysisOnEdt +import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtNamedSymbol +import org.jetbrains.kotlin.idea.base.resources.KotlinBundle +import org.jetbrains.kotlin.idea.base.util.quoteIfNeeded +import org.jetbrains.kotlin.idea.references.mainReference +import org.jetbrains.kotlin.idea.util.application.executeWriteCommand +import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.KtCallExpression +import org.jetbrains.kotlin.psi.KtCallableReferenceExpression +import org.jetbrains.kotlin.psi.KtDotQualifiedExpression +import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtInstanceExpressionWithLabel +import org.jetbrains.kotlin.psi.KtNameReferenceExpression +import org.jetbrains.kotlin.psi.KtNullableType +import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.KtUserType +import org.jetbrains.kotlin.psi.createExpressionByPattern +import org.jetbrains.kotlin.psi.psiUtil.getPrevSiblingIgnoringWhitespaceAndComments + +object AddQualifiersUtil { + fun addQualifiersRecursively(root: KtElement): KtElement { + if (root is KtNameReferenceExpression) return applyIfApplicable(root) ?: root + + root.descendantsOfType() + .map { it.createSmartPointer() } + .toList() + .asReversed() + .forEach { + it.element?.let(::applyIfApplicable) + } + + return root + } + + context(KtAnalysisSession) + fun isApplicableTo(referenceExpression: KtNameReferenceExpression, contextSymbol: KtNamedSymbol): Boolean { + if (referenceExpression.parent is KtInstanceExpressionWithLabel) return false + + val prevElement = PsiTreeUtil.skipWhitespacesAndCommentsBackward(referenceExpression) + if (prevElement.elementType == KtTokens.DOT) return false + val fqName = getFqName(contextSymbol) + if (contextSymbol is KtCallableSymbol && contextSymbol.isExtension || fqName?.parent()?.isRoot == true) return false + if (prevElement.elementType == KtTokens.COLONCOLON) { + if (contextSymbol is KtCallableSymbol && contextSymbol.getContainingSymbol() == null) return false + val prevSibling = prevElement?.getPrevSiblingIgnoringWhitespaceAndComments() + if (prevSibling is KtNameReferenceExpression || prevSibling is KtDotQualifiedExpression) return false + } + + val file = referenceExpression.containingKtFile + val identifier = referenceExpression.getIdentifier()?.text + return !file.hasImportAlias() || file.importDirectives.none { it.aliasName == identifier && it.importedFqName == fqName } + } + + fun applyTo(referenceExpression: KtNameReferenceExpression, fqName: FqName): KtElement { + val qualifier = fqName.parent().quoteIfNeeded().asString() + val project = referenceExpression.project + val psiFactory = KtPsiFactory(project) + return project.executeWriteCommand(KotlinBundle.message("add.full.qualifier"), groupId = null) { + when (val parent = referenceExpression.parent) { + is KtCallableReferenceExpression -> addOrReplaceQualifier(psiFactory, parent, qualifier) + is KtCallExpression -> replaceExpressionWithDotQualifier(psiFactory, parent, qualifier) + is KtUserType -> addQualifierToType(psiFactory, parent, qualifier) + else -> replaceExpressionWithQualifier(psiFactory, referenceExpression, fqName) + } + } + } + + private fun getFqName(symbol: KtNamedSymbol): FqName? { + return when (symbol) { + is KtClassLikeSymbol -> symbol.classIdIfNonLocal?.asSingleFqName() + is KtCallableSymbol -> symbol.callableIdIfNonLocal?.asSingleFqName() + else -> null + } + } + + @OptIn(KtAllowAnalysisFromWriteAction::class, KtAllowAnalysisOnEdt::class) + private fun applyIfApplicable(referenceExpression: KtNameReferenceExpression): KtElement? { + val fqName = allowAnalysisFromWriteAction { + allowAnalysisOnEdt { + analyze(referenceExpression) { + val symbol = referenceExpression.mainReference.resolveToSymbols().singleOrNull() as? KtNamedSymbol ?: return null + val fqName = getFqName(symbol) ?: return null + if (!isApplicableTo(referenceExpression, symbol)) return null + fqName + } + } + } + return applyTo(referenceExpression, fqName) + } + + private fun addOrReplaceQualifier(factory: KtPsiFactory, expression: KtCallableReferenceExpression, qualifier: String): KtElement { + val receiver = expression.receiverExpression + return if (receiver != null) { + replaceExpressionWithDotQualifier(factory, receiver, qualifier) + } else { + val qualifierExpression = factory.createExpression(qualifier) + expression.addBefore(qualifierExpression, expression.firstChild) as KtElement + } + } + + private fun replaceExpressionWithDotQualifier(psiFactory: KtPsiFactory, expression: KtExpression, qualifier: String): KtElement { + val expressionWithQualifier = psiFactory.createExpressionByPattern("$0.$1", qualifier, expression) + return expression.replace(expressionWithQualifier) as KtElement + } + + private fun addQualifierToType(psiFactory: KtPsiFactory, userType: KtUserType, qualifier: String): KtElement { + val type = userType.parent as? KtNullableType ?: userType + val typeWithQualifier = psiFactory.createType("$qualifier.${type.text}") + return type.parent.replace(typeWithQualifier) as KtElement + } + + private fun replaceExpressionWithQualifier( + psiFactory: KtPsiFactory, + referenceExpression: KtNameReferenceExpression, + fqName: FqName + ): KtElement { + val expressionWithQualifier = psiFactory.createExpression(fqName.asString()) + return referenceExpression.replace(expressionWithQualifier) as KtElement + } +} diff --git a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValue2After.k2.kt b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValue2After.k2.kt new file mode 100644 index 000000000000..7b7126f0dfbe --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValue2After.k2.kt @@ -0,0 +1,5 @@ +package usages + +fun foo(i: Int) {} + +fun callFoo() = foo(a.b.c.Dep.Companion.MY_CONSTANT_FROM_DEP) diff --git a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValue2After.kt b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValue2After.kt index 4af67614eeb9..aa4e9dda465f 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValue2After.kt +++ b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValue2After.kt @@ -5,5 +5,3 @@ import a.b.c.Dep fun foo(i: Int) {} fun callFoo() = foo(Dep.MY_CONSTANT_FROM_DEP) - -// IGNORE_K2 \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValue2Before.kt b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValue2Before.kt index f3c5211c45da..afd68b533c39 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValue2Before.kt +++ b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValue2Before.kt @@ -3,5 +3,3 @@ package usages fun foo() {} fun callFoo() = foo() - -// IGNORE_K2 \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValueAfter.k2.kt b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValueAfter.k2.kt new file mode 100644 index 000000000000..7b7126f0dfbe --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValueAfter.k2.kt @@ -0,0 +1,5 @@ +package usages + +fun foo(i: Int) {} + +fun callFoo() = foo(a.b.c.Dep.Companion.MY_CONSTANT_FROM_DEP) diff --git a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValueAfter.kt b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValueAfter.kt index 4af67614eeb9..aa4e9dda465f 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValueAfter.kt +++ b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValueAfter.kt @@ -5,5 +5,3 @@ import a.b.c.Dep fun foo(i: Int) {} fun callFoo() = foo(Dep.MY_CONSTANT_FROM_DEP) - -// IGNORE_K2 \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValueBefore.kt b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValueBefore.kt index f3c5211c45da..afd68b533c39 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValueBefore.kt +++ b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionParameterWithDefaultValueBefore.kt @@ -3,5 +3,3 @@ package usages fun foo() {} fun callFoo() = foo() - -// IGNORE_K2 \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionReceiverWithDefaultValueAfter.k2.kt b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionReceiverWithDefaultValueAfter.k2.kt new file mode 100644 index 000000000000..6a9a54c2161e --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionReceiverWithDefaultValueAfter.k2.kt @@ -0,0 +1,5 @@ +package usages + +fun Int.foo() {} + +fun callFoo() = a.b.c.Dep.Companion.MY_CONSTANT_FROM_DEP.foo() diff --git a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionReceiverWithDefaultValueAfter.kt b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionReceiverWithDefaultValueAfter.kt index 3119e2df756f..f5fcaf1a7d57 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionReceiverWithDefaultValueAfter.kt +++ b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionReceiverWithDefaultValueAfter.kt @@ -5,5 +5,3 @@ import a.b.c.Dep fun Int.foo() {} fun callFoo() = Dep.MY_CONSTANT_FROM_DEP.foo() - -// IGNORE_K2 \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionReceiverWithDefaultValueBefore.kt b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionReceiverWithDefaultValueBefore.kt index f3c5211c45da..afd68b533c39 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionReceiverWithDefaultValueBefore.kt +++ b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddFunctionReceiverWithDefaultValueBefore.kt @@ -3,5 +3,3 @@ package usages fun foo() {} fun callFoo() = foo() - -// IGNORE_K2 \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithComplexDefaultValueAfter.k2.kt b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithComplexDefaultValueAfter.k2.kt new file mode 100644 index 000000000000..f3e85c255d78 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithComplexDefaultValueAfter.k2.kt @@ -0,0 +1,11 @@ +package usages + +import a.b.Dep2.Companion.NUMBER +import a.b.c.Dep.Companion.MY_CONSTANT_FROM_DEP + +val Int.foo: String get() = "hello" + +fun callFoo() = Dep2().eval(MY_CONSTANT_FROM_DEP + NUMBER).foo +fun t() { + val s = Dep2().eval(MY_CONSTANT_FROM_DEP + NUMBER).foo + " world" +} diff --git a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithComplexDefaultValueAfter.kt b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithComplexDefaultValueAfter.kt index c72a5b21b9bf..7dd498170522 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithComplexDefaultValueAfter.kt +++ b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithComplexDefaultValueAfter.kt @@ -9,5 +9,3 @@ fun callFoo() = Dep2().eval(Dep.MY_CONSTANT_FROM_DEP + Dep2.NUMBER).foo fun t() { val s = Dep2().eval(Dep.MY_CONSTANT_FROM_DEP + Dep2.NUMBER).foo + " world" } - -// IGNORE_K2 \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithComplexDefaultValueBefore.kt b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithComplexDefaultValueBefore.kt index 825674737260..e34cff4349b6 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithComplexDefaultValueBefore.kt +++ b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithComplexDefaultValueBefore.kt @@ -5,6 +5,4 @@ val foo: String get() = "hello" fun callFoo() = foo fun t() { val s = foo + " world" -} - -// IGNORE_K2 \ No newline at end of file +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValue2After.k2.kt b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValue2After.k2.kt new file mode 100644 index 000000000000..26b122175cfd --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValue2After.k2.kt @@ -0,0 +1,10 @@ +package usages + +import a.b.c.Dep.Companion.MY_CONSTANT_FROM_DEP + +val Int.foo: String get() = "hello" + +fun callFoo() = MY_CONSTANT_FROM_DEP.foo +fun t() { + val s = MY_CONSTANT_FROM_DEP.foo + " world" +} diff --git a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValue2After.kt b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValue2After.kt index 53529e6c0ead..130a774c9c1c 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValue2After.kt +++ b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValue2After.kt @@ -8,5 +8,3 @@ fun callFoo() = Dep.MY_CONSTANT_FROM_DEP.foo fun t() { val s = Dep.MY_CONSTANT_FROM_DEP.foo + " world" } - -// IGNORE_K2 \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValue2Before.kt b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValue2Before.kt index 825674737260..e34cff4349b6 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValue2Before.kt +++ b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValue2Before.kt @@ -5,6 +5,4 @@ val foo: String get() = "hello" fun callFoo() = foo fun t() { val s = foo + " world" -} - -// IGNORE_K2 \ No newline at end of file +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValueAfter.k2.kt b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValueAfter.k2.kt new file mode 100644 index 000000000000..26b122175cfd --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValueAfter.k2.kt @@ -0,0 +1,10 @@ +package usages + +import a.b.c.Dep.Companion.MY_CONSTANT_FROM_DEP + +val Int.foo: String get() = "hello" + +fun callFoo() = MY_CONSTANT_FROM_DEP.foo +fun t() { + val s = MY_CONSTANT_FROM_DEP.foo + " world" +} diff --git a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValueAfter.kt b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValueAfter.kt index 53529e6c0ead..130a774c9c1c 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValueAfter.kt +++ b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValueAfter.kt @@ -8,5 +8,3 @@ fun callFoo() = Dep.MY_CONSTANT_FROM_DEP.foo fun t() { val s = Dep.MY_CONSTANT_FROM_DEP.foo + " world" } - -// IGNORE_K2 \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValueBefore.kt b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValueBefore.kt index 825674737260..e34cff4349b6 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValueBefore.kt +++ b/plugins/kotlin/idea/tests/testData/refactoring/changeSignature/AddPropertyReceiverWithDefaultValueBefore.kt @@ -5,6 +5,4 @@ val foo: String get() = "hello" fun callFoo() = foo fun t() { val s = foo + " world" -} - -// IGNORE_K2 \ No newline at end of file +} \ No newline at end of file diff --git a/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/changeSignature/ui/KotlinChangeSignatureDialog.kt b/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/changeSignature/ui/KotlinChangeSignatureDialog.kt index e554efabed0f..e28bcbf20361 100644 --- a/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/changeSignature/ui/KotlinChangeSignatureDialog.kt +++ b/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/changeSignature/ui/KotlinChangeSignatureDialog.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.analysis.api.lifetime.allowAnalysisOnEdt import org.jetbrains.kotlin.analysis.api.types.KtErrorType import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.idea.codeinsight.utils.AddQualifiersUtil import org.jetbrains.kotlin.idea.k2.refactoring.changeSignature.* import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinModifiableMethodDescriptor.Kind import org.jetbrains.kotlin.idea.refactoring.changeSignature.ui.* @@ -115,11 +116,11 @@ internal class KotlinChangeSignatureDialog( override fun createRefactoringProcessor(): BaseRefactoringProcessor { - val changeInfo = evaluateChangeSignatureInfo() + val changeInfo = evaluateChangeSignatureInfo(false) return KotlinChangeSignatureProcessor(project, changeInfo) } - private fun evaluateChangeSignatureInfo(): KotlinChangeInfo { + private fun evaluateChangeSignatureInfo(forPreview: Boolean): KotlinChangeInfo { val callable = myMethod.method var receiverInfo: KotlinParameterInfo? = null val parameters = parametersTableModel.items.map { parameter -> @@ -133,11 +134,15 @@ internal class KotlinChangeSignatureDialog( val codeFragment = parameter.defaultValueCodeFragment as KtExpressionCodeFragment - //todo if (!forPreview) AddFullQualifierIntention.Holder.addQualifiersRecursively(codeFragment) + if (!forPreview) AddQualifiersUtil.addQualifiersRecursively(codeFragment) val oldDefaultValue = parameterInfo.defaultValueForCall - if (codeFragment.text != (if (oldDefaultValue != null) oldDefaultValue.text else "") && parameter.parameter.defaultValueAsDefaultParameter) { - parameterInfo.defaultValue = codeFragment.getContentElement() + if (codeFragment.text != (if (oldDefaultValue != null) oldDefaultValue.text else "")) { + if (parameter.parameter.defaultValueAsDefaultParameter) { + parameterInfo.defaultValue = codeFragment.getContentElement() + } else { + parameterInfo.defaultValueForCall = codeFragment.getContentElement() + } } parameterInfo @@ -188,7 +193,7 @@ internal class KotlinChangeSignatureDialog( } override fun calculateSignature(): String { - val changeSignatureInfo = evaluateChangeSignatureInfo() + val changeSignatureInfo = evaluateChangeSignatureInfo(true) return changeSignatureInfo.getNewSignature() } diff --git a/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/kotlin.refactorings.tests.k2.iml b/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/kotlin.refactorings.tests.k2.iml index 75ea831c1cd6..15ac44389858 100644 --- a/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/kotlin.refactorings.tests.k2.iml +++ b/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/kotlin.refactorings.tests.k2.iml @@ -21,5 +21,6 @@ + \ No newline at end of file diff --git a/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/changeSignature/KotlinFirChangeSignatureTest.kt b/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/changeSignature/KotlinFirChangeSignatureTest.kt index f6d5673f6de2..6776d728c39a 100644 --- a/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/changeSignature/KotlinFirChangeSignatureTest.kt +++ b/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/changeSignature/KotlinFirChangeSignatureTest.kt @@ -4,6 +4,7 @@ package org.jetbrains.kotlin.idea.k2.refactoring.changeSignature import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.idea.codeinsight.utils.AddQualifiersUtil import org.jetbrains.kotlin.idea.refactoring.changeSignature.BaseKotlinChangeSignatureTest import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtExpression @@ -29,7 +30,7 @@ class KotlinFirChangeSignatureTest : } override fun addFullQualifier(fragment: KtExpressionCodeFragment) { - TODO("Not yet implemented") + AddQualifiersUtil.addQualifiersRecursively(fragment) } override fun KotlinChangeInfo.createKotlinParameter(