Rename: Support retargeting/shadowing conflict checking for functions
#KT-22564 Fixed
This commit is contained in:
@@ -58,9 +58,6 @@ class KotlinRefactoringSupportProvider : RefactoringSupportProvider() {
|
|||||||
if (element.isLocal) return true
|
if (element.isLocal) return true
|
||||||
}
|
}
|
||||||
is KtDestructuringDeclarationEntry -> return true
|
is KtDestructuringDeclarationEntry -> return true
|
||||||
is KtFunction -> {
|
|
||||||
if (element.isLocal && element.nameIdentifier != null) return true
|
|
||||||
}
|
|
||||||
is KtParameter -> {
|
is KtParameter -> {
|
||||||
val parent = element.parent
|
val parent = element.parent
|
||||||
if (parent is KtForExpression) {
|
if (parent is KtForExpression) {
|
||||||
|
|||||||
+7
-1
@@ -96,7 +96,11 @@ class RenameKotlinFunctionProcessor : RenameKotlinPsiProcessor() {
|
|||||||
val declaration = element.unwrapped as? KtNamedFunction ?: return
|
val declaration = element.unwrapped as? KtNamedFunction ?: return
|
||||||
val descriptor = declaration.unsafeResolveToDescriptor()
|
val descriptor = declaration.unsafeResolveToDescriptor()
|
||||||
checkConflictsAndReplaceUsageInfos(element, allRenames, result)
|
checkConflictsAndReplaceUsageInfos(element, allRenames, result)
|
||||||
checkRedeclarations(descriptor, newName, result)
|
result += SmartList<UsageInfo>().also { collisions ->
|
||||||
|
checkRedeclarations(descriptor, newName, collisions)
|
||||||
|
checkOriginalUsagesRetargeting(declaration, newName, result, collisions)
|
||||||
|
checkNewNameUsagesRetargeting(declaration, newName, collisions)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class FunctionWithSupersWrapper(
|
class FunctionWithSupersWrapper(
|
||||||
@@ -229,6 +233,8 @@ class RenameKotlinFunctionProcessor : RenameKotlinPsiProcessor() {
|
|||||||
|
|
||||||
RenameUtil.doRenameGenericNamedElement(element, newName, simpleUsages.toTypedArray(), listener)
|
RenameUtil.doRenameGenericNamedElement(element, newName, simpleUsages.toTypedArray(), listener)
|
||||||
|
|
||||||
|
usages.forEach { (it as? KtResolvableCollisionUsageInfo)?.apply() }
|
||||||
|
|
||||||
(element.unwrapped as? KtNamedDeclaration)?.let(::dropOverrideKeywordIfNecessary)
|
(element.unwrapped as? KtNamedDeclaration)?.let(::dropOverrideKeywordIfNecessary)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import org.jetbrains.kotlin.idea.references.mainReference
|
|||||||
import org.jetbrains.kotlin.idea.search.and
|
import org.jetbrains.kotlin.idea.search.and
|
||||||
import org.jetbrains.kotlin.idea.search.restrictToKotlinSources
|
import org.jetbrains.kotlin.idea.search.restrictToKotlinSources
|
||||||
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
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.getAllAccessibleVariables
|
||||||
import org.jetbrains.kotlin.idea.util.getResolutionScope
|
import org.jetbrains.kotlin.idea.util.getResolutionScope
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
@@ -166,6 +167,7 @@ private fun LexicalScope.getRelevantDescriptors(
|
|||||||
val nameAsName = Name.identifier(name)
|
val nameAsName = Name.identifier(name)
|
||||||
return when (declaration) {
|
return when (declaration) {
|
||||||
is KtProperty, is KtParameter, is PsiField -> getAllAccessibleVariables(nameAsName)
|
is KtProperty, is KtParameter, is PsiField -> getAllAccessibleVariables(nameAsName)
|
||||||
|
is KtNamedFunction -> getAllAccessibleFunctions(nameAsName)
|
||||||
is KtClassOrObject, is PsiClass -> listOfNotNull(findClassifier(nameAsName, NoLookupLocation.FROM_IDE))
|
is KtClassOrObject, is PsiClass -> listOfNotNull(findClassifier(nameAsName, NoLookupLocation.FROM_IDE))
|
||||||
else -> emptyList()
|
else -> emptyList()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
class A {
|
||||||
|
fun foo() {}
|
||||||
|
|
||||||
|
fun goo() {
|
||||||
|
fun <caret>innerGoo() {
|
||||||
|
foo()
|
||||||
|
}
|
||||||
|
innerGoo()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
class A {
|
||||||
|
fun foo() {}
|
||||||
|
|
||||||
|
fun goo() {
|
||||||
|
fun foo() {
|
||||||
|
this.foo()
|
||||||
|
}
|
||||||
|
foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
fun foo() {
|
||||||
|
fun <caret>innerGoo() {
|
||||||
|
foo()
|
||||||
|
}
|
||||||
|
innerGoo()
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
fun foo() {
|
||||||
|
fun foo() {
|
||||||
|
test.foo()
|
||||||
|
}
|
||||||
|
innerGoo()
|
||||||
|
}
|
||||||
@@ -55,7 +55,7 @@ class InplaceRenameTest : LightPlatformCodeInsightTestCase() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun testLocalFunction() {
|
fun testLocalFunction() {
|
||||||
doTestInplaceRename("bar")
|
doTestMemberInplaceRename("bar")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testFunctionParameterNotInplace() {
|
fun testFunctionParameterNotInplace() {
|
||||||
@@ -71,7 +71,7 @@ class InplaceRenameTest : LightPlatformCodeInsightTestCase() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun testLabelFromFunction() {
|
fun testLabelFromFunction() {
|
||||||
doTestInplaceRename("foo")
|
doTestMemberInplaceRename("foo")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testMultiDeclaration() {
|
fun testMultiDeclaration() {
|
||||||
@@ -130,6 +130,10 @@ class InplaceRenameTest : LightPlatformCodeInsightTestCase() {
|
|||||||
doTestMemberInplaceRename("is")
|
doTestMemberInplaceRename("is")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun testAddThis() {
|
||||||
|
doTestMemberInplaceRename("foo")
|
||||||
|
}
|
||||||
|
|
||||||
private fun doTestImplicitLambdaParameter(newName: String) {
|
private fun doTestImplicitLambdaParameter(newName: String) {
|
||||||
configureByFile(getTestName(false) + ".kt")
|
configureByFile(getTestName(false) + ".kt")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user