From 695a2a409897f4eb10e173093dae8f22ee059b83 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 7 Feb 2018 16:23:36 +0300 Subject: [PATCH] Rename: Support retargeting/shadowing conflict checking for functions #KT-22564 Fixed --- .../refactoring/KotlinRefactoringSupportProvider.kt | 3 --- .../rename/RenameKotlinFunctionProcessor.kt | 8 +++++++- .../idea/refactoring/rename/renameConflictUtils.kt | 2 ++ idea/testData/refactoring/rename/inplace/AddThis.kt | 10 ++++++++++ .../refactoring/rename/inplace/AddThis.kt.after | 10 ++++++++++ idea/testData/refactoring/rename/inplace/QualifyFun.kt | 8 ++++++++ .../refactoring/rename/inplace/QualifyFun.kt.after | 8 ++++++++ .../kotlin/idea/refactoring/InplaceRenameTest.kt | 8 ++++++-- 8 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 idea/testData/refactoring/rename/inplace/AddThis.kt create mode 100644 idea/testData/refactoring/rename/inplace/AddThis.kt.after create mode 100644 idea/testData/refactoring/rename/inplace/QualifyFun.kt create mode 100644 idea/testData/refactoring/rename/inplace/QualifyFun.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/KotlinRefactoringSupportProvider.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/KotlinRefactoringSupportProvider.kt index d48ee26fd86..aeb6a499e9a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/KotlinRefactoringSupportProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/KotlinRefactoringSupportProvider.kt @@ -58,9 +58,6 @@ class KotlinRefactoringSupportProvider : RefactoringSupportProvider() { if (element.isLocal) return true } is KtDestructuringDeclarationEntry -> return true - is KtFunction -> { - if (element.isLocal && element.nameIdentifier != null) return true - } is KtParameter -> { val parent = element.parent if (parent is KtForExpression) { diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessor.kt index 48972627c91..9ae54d21f47 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessor.kt @@ -96,7 +96,11 @@ class RenameKotlinFunctionProcessor : RenameKotlinPsiProcessor() { val declaration = element.unwrapped as? KtNamedFunction ?: return val descriptor = declaration.unsafeResolveToDescriptor() checkConflictsAndReplaceUsageInfos(element, allRenames, result) - checkRedeclarations(descriptor, newName, result) + result += SmartList().also { collisions -> + checkRedeclarations(descriptor, newName, collisions) + checkOriginalUsagesRetargeting(declaration, newName, result, collisions) + checkNewNameUsagesRetargeting(declaration, newName, collisions) + } } class FunctionWithSupersWrapper( @@ -229,6 +233,8 @@ class RenameKotlinFunctionProcessor : RenameKotlinPsiProcessor() { RenameUtil.doRenameGenericNamedElement(element, newName, simpleUsages.toTypedArray(), listener) + usages.forEach { (it as? KtResolvableCollisionUsageInfo)?.apply() } + (element.unwrapped as? KtNamedDeclaration)?.let(::dropOverrideKeywordIfNecessary) } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameConflictUtils.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameConflictUtils.kt index 3bd235ff3fa..e857ddbda52 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameConflictUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameConflictUtils.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.search.and import org.jetbrains.kotlin.idea.search.restrictToKotlinSources import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers +import org.jetbrains.kotlin.idea.util.getAllAccessibleFunctions import org.jetbrains.kotlin.idea.util.getAllAccessibleVariables import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.incremental.components.NoLookupLocation @@ -166,6 +167,7 @@ private fun LexicalScope.getRelevantDescriptors( val nameAsName = Name.identifier(name) return when (declaration) { is KtProperty, is KtParameter, is PsiField -> getAllAccessibleVariables(nameAsName) + is KtNamedFunction -> getAllAccessibleFunctions(nameAsName) is KtClassOrObject, is PsiClass -> listOfNotNull(findClassifier(nameAsName, NoLookupLocation.FROM_IDE)) else -> emptyList() } diff --git a/idea/testData/refactoring/rename/inplace/AddThis.kt b/idea/testData/refactoring/rename/inplace/AddThis.kt new file mode 100644 index 00000000000..292a3b5c164 --- /dev/null +++ b/idea/testData/refactoring/rename/inplace/AddThis.kt @@ -0,0 +1,10 @@ +class A { + fun foo() {} + + fun goo() { + fun innerGoo() { + foo() + } + innerGoo() + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/inplace/AddThis.kt.after b/idea/testData/refactoring/rename/inplace/AddThis.kt.after new file mode 100644 index 00000000000..aa7ad295ed0 --- /dev/null +++ b/idea/testData/refactoring/rename/inplace/AddThis.kt.after @@ -0,0 +1,10 @@ +class A { + fun foo() {} + + fun goo() { + fun foo() { + this.foo() + } + foo() + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/inplace/QualifyFun.kt b/idea/testData/refactoring/rename/inplace/QualifyFun.kt new file mode 100644 index 00000000000..8a39cea35b9 --- /dev/null +++ b/idea/testData/refactoring/rename/inplace/QualifyFun.kt @@ -0,0 +1,8 @@ +package test + +fun foo() { + fun innerGoo() { + foo() + } + innerGoo() +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/inplace/QualifyFun.kt.after b/idea/testData/refactoring/rename/inplace/QualifyFun.kt.after new file mode 100644 index 00000000000..fa5f31958c9 --- /dev/null +++ b/idea/testData/refactoring/rename/inplace/QualifyFun.kt.after @@ -0,0 +1,8 @@ +package test + +fun foo() { + fun foo() { + test.foo() + } + innerGoo() +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/InplaceRenameTest.kt b/idea/tests/org/jetbrains/kotlin/idea/refactoring/InplaceRenameTest.kt index b4c57226586..ac37e68f90d 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/InplaceRenameTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/InplaceRenameTest.kt @@ -55,7 +55,7 @@ class InplaceRenameTest : LightPlatformCodeInsightTestCase() { } fun testLocalFunction() { - doTestInplaceRename("bar") + doTestMemberInplaceRename("bar") } fun testFunctionParameterNotInplace() { @@ -71,7 +71,7 @@ class InplaceRenameTest : LightPlatformCodeInsightTestCase() { } fun testLabelFromFunction() { - doTestInplaceRename("foo") + doTestMemberInplaceRename("foo") } fun testMultiDeclaration() { @@ -130,6 +130,10 @@ class InplaceRenameTest : LightPlatformCodeInsightTestCase() { doTestMemberInplaceRename("is") } + fun testAddThis() { + doTestMemberInplaceRename("foo") + } + private fun doTestImplicitLambdaParameter(newName: String) { configureByFile(getTestName(false) + ".kt")