diff --git a/ChangeLog.md b/ChangeLog.md index 56a4db7deb0..ab5d4fe25c6 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -115,6 +115,7 @@ These artifacts include extensions for the types available in the latter JDKs, s - [`KT-13874`](https://youtrack.jetbrains.com/issue/KT-13874) Move to Companion: Fix AssertionError on running refactoring from Conflicts View - [`KT-13883`](https://youtrack.jetbrains.com/issue/KT-13883) Move to Companion Object: Fix exception when applied to class - [`KT-13876`](https://youtrack.jetbrains.com/issue/KT-13876) Move to Companion Object: Forbid for functions/properties referencing type parameters of the containing class +- [`KT-13877`](https://youtrack.jetbrains.com/issue/KT-13877) Move to Companion Object: Warn if companion object already contains function with the same signature ##### New features diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/MoveMemberToCompanionObjectIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/MoveMemberToCompanionObjectIntention.kt index 767bac886ec..0276f40ddd6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/MoveMemberToCompanionObjectIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/MoveMemberToCompanionObjectIntention.kt @@ -34,11 +34,13 @@ import com.intellij.usageView.UsageInfo import com.intellij.util.SmartList import com.intellij.util.containers.MultiMap import org.jetbrains.kotlin.asJava.toLightClass +import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptorWithResolutionScopes import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor +import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.idea.core.* import org.jetbrains.kotlin.idea.refactoring.checkConflictsInteractively import org.jetbrains.kotlin.idea.refactoring.move.OuterInstanceReferenceUsageInfo @@ -64,6 +66,7 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver +import org.jetbrains.kotlin.util.findCallableMemberBySignature class MoveMemberToCompanionObjectIntention : SelfTargetingRangeIntention(KtNamedDeclaration::class.java, "Move to companion object") { @@ -248,6 +251,8 @@ class MoveMemberToCompanionObjectIntention : SelfTargetingRangeIntention() val conflicts = MultiMap() + containingClass.getCompanionObjects().firstOrNull()?.let { companion -> + val companionDescriptor = companion.resolveToDescriptor() as ClassDescriptor + val callableDescriptor = element.resolveToDescriptor() as CallableMemberDescriptor + companionDescriptor.findCallableMemberBySignature(callableDescriptor)?.let { + DescriptorToSourceUtilsIde.getAnyDeclaration(project, it) + }?.let { + conflicts.putValue(it, "Companion object already contains ${RefactoringUIUtil.getDescription(it, false)}") + } + } + val outerInstanceReferences = collectOuterInstanceReferences(element) if (outerInstanceReferences.isNotEmpty()) { if (element is KtProperty) { diff --git a/idea/testData/intentions/moveToCompanion/redeclarationConflict.kt b/idea/testData/intentions/moveToCompanion/redeclarationConflict.kt new file mode 100644 index 00000000000..e230fc08467 --- /dev/null +++ b/idea/testData/intentions/moveToCompanion/redeclarationConflict.kt @@ -0,0 +1,7 @@ +// SHOULD_FAIL_WITH: Companion object already contains function f1(Int) +class Test9{ + fun f1(n: Int){} + companion object{ + fun f1(n: Int){} + } +} \ 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 20d30a0543f..ecf85cb9e7b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -9133,6 +9133,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("redeclarationConflict.kt") + public void testRedeclarationConflict() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/moveToCompanion/redeclarationConflict.kt"); + doTest(fileName); + } + @TestMetadata("topLevelFunction.kt") public void testTopLevelFunction() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/moveToCompanion/topLevelFunction.kt");