From 8ceeff021185ec1f167f9d880e899ee768af4e4a Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 1 Nov 2016 19:08:03 +0300 Subject: [PATCH] Change Signature: Use new signature when looking for redeclaration conflicts #KT-14583 Fixed --- ChangeLog.md | 4 ++++ .../changeSignature/KotlinChangeSignatureUsageProcessor.kt | 7 +++++-- .../intentions/convertReceiverToParameter/validOverload.kt | 3 +++ .../convertReceiverToParameter/validOverload.kt.after | 3 +++ .../kotlin/idea/intentions/IntentionTestGenerated.java | 6 ++++++ 5 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 idea/testData/intentions/convertReceiverToParameter/validOverload.kt create mode 100644 idea/testData/intentions/convertReceiverToParameter/validOverload.kt.after diff --git a/ChangeLog.md b/ChangeLog.md index 60fd4ec0b85..f717b9503d6 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -224,6 +224,10 @@ These artifacts include extensions for the types available in the latter JDKs, s - [`KT-14569`](https://youtrack.jetbrains.com/issue/KT-14569) Convert Property to Function Intention: Search occurrences using progress dialog +#### Refactorings + +- [`KT-14583`](https://youtrack.jetbrains.com/issue/KT-14583) Change Signature: Use new signature when looking for redeclaration conflicts + ## 1.0.5 ### IDE diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt index a3ecbc5d6d8..59547030eb9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt @@ -52,7 +52,6 @@ import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchOptions import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchParameters import org.jetbrains.kotlin.idea.search.restrictToKotlinSources -import org.jetbrains.kotlin.idea.search.usagesSearch.buildProcessDelegationCallConstructorUsagesTask import org.jetbrains.kotlin.idea.search.usagesSearch.processDelegationCallConstructorUsages import org.jetbrains.kotlin.idea.util.* import org.jetbrains.kotlin.incremental.components.NoLookupLocation @@ -72,6 +71,7 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull +import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptyList import java.util.* class KotlinChangeSignatureUsageProcessor : ChangeSignatureUsageProcessor { @@ -535,13 +535,16 @@ class KotlinChangeSignatureUsageProcessor : ChangeSignatureUsageProcessor { callableScope.getAllAccessibleFunctions(newName) else callableScope.getAllAccessibleVariables(newName) + val newTypes = info.newParameters.map { it.currentTypeInfo.type } for (conflict in conflicts) { if (conflict === oldDescriptor) continue val conflictElement = DescriptorToSourceUtils.descriptorToDeclaration(conflict) if (conflictElement === info.method) continue - if (conflict.valueParameters.map { it.type } == oldDescriptor.valueParameters.map { it.type }) { + val candidateTypes = conflict.extensionReceiverParameter?.type.singletonOrEmptyList() + conflict.valueParameters.map { it.type } + + if (candidateTypes == newTypes) { result.putValue(conflictElement, "Function already exists: '" + DescriptorRenderer.SHORT_NAMES_IN_TYPES.render(conflict) + "'") break } diff --git a/idea/testData/intentions/convertReceiverToParameter/validOverload.kt b/idea/testData/intentions/convertReceiverToParameter/validOverload.kt new file mode 100644 index 00000000000..9ecf8b4a8d9 --- /dev/null +++ b/idea/testData/intentions/convertReceiverToParameter/validOverload.kt @@ -0,0 +1,3 @@ +fun conflict() {} +class Convertable {} +fun Convertable.conflict() {} \ No newline at end of file diff --git a/idea/testData/intentions/convertReceiverToParameter/validOverload.kt.after b/idea/testData/intentions/convertReceiverToParameter/validOverload.kt.after new file mode 100644 index 00000000000..307274ade63 --- /dev/null +++ b/idea/testData/intentions/convertReceiverToParameter/validOverload.kt.after @@ -0,0 +1,3 @@ +fun conflict() {} +class Convertable {} +fun conflict(convertable: Convertable) {} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index ec5cf3a908b..8ccc3d91f03 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -4863,6 +4863,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertReceiverToParameter/topLevelFun.kt"); doTest(fileName); } + + @TestMetadata("validOverload.kt") + public void testValidOverload() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertReceiverToParameter/validOverload.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/intentions/convertSealedClassToEnum")