From 9f3ba50dc5b477ad843aed1d57e4b40eb8b21fd6 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 10 Feb 2015 15:15:58 +0300 Subject: [PATCH] Extract function: Do not report conflicts for fake overrides/delegates of the same callable declaration --- .../idea/refactoring/jetRefactoringUtil.kt | 16 ++++++++++++++-- .../extractFunction/basic/delegatingFunction.kt | 10 ++++++++++ .../basic/delegatingFunction.kt.after | 14 ++++++++++++++ .../extractFunction/basic/fakeOverride.kt | 7 +++++++ .../extractFunction/basic/fakeOverride.kt.after | 11 +++++++++++ .../JetExtractionTestGenerated.java | 12 ++++++++++++ 6 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 idea/testData/refactoring/extractFunction/basic/delegatingFunction.kt create mode 100644 idea/testData/refactoring/extractFunction/basic/delegatingFunction.kt.after create mode 100644 idea/testData/refactoring/extractFunction/basic/fakeOverride.kt create mode 100644 idea/testData/refactoring/extractFunction/basic/fakeOverride.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt index ab693909d4f..62d5d13cc34 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt @@ -68,13 +68,14 @@ import com.intellij.psi.PsiMethod import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.CallableDescriptor -import org.jetbrains.kotlin.resolve.OverridingUtil -import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import com.intellij.psi.PsiPackage import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.psi.psiUtil.parents import com.intellij.refactoring.util.RefactoringUIUtil +import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor +import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind +import org.jetbrains.kotlin.resolve.OverridingUtil fun PsiElement.getAndRemoveCopyableUserData(key: Key): T? { val data = getCopyableUserData(key) @@ -389,6 +390,17 @@ public fun comparePossiblyOverridingDescriptors(currentDescriptor: DeclarationDe if (compareDescriptors(currentDescriptor, originalDescriptor)) return true if (originalDescriptor is CallableDescriptor) { if (!OverridingUtil.traverseOverridenDescriptors(originalDescriptor) { !compareDescriptors(currentDescriptor, it) }) return true + if (originalDescriptor !is CallableMemberDescriptor || currentDescriptor !is CallableMemberDescriptor) return false + val kind = originalDescriptor.getKind() + if (kind != Kind.FAKE_OVERRIDE && kind != Kind.DELEGATION) return false + if (currentDescriptor.getKind() != kind) return false + + val originalOverriddenDescriptors = originalDescriptor.getOverriddenDescriptors() + val currentOverriddenDescriptors = currentDescriptor.getOverriddenDescriptors() + if (originalOverriddenDescriptors.size() != currentOverriddenDescriptors.size()) return false + return (currentOverriddenDescriptors zip originalOverriddenDescriptors ).all { + comparePossiblyOverridingDescriptors(it.first, it.second) + } } return false diff --git a/idea/testData/refactoring/extractFunction/basic/delegatingFunction.kt b/idea/testData/refactoring/extractFunction/basic/delegatingFunction.kt new file mode 100644 index 00000000000..d2a65edeec4 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/basic/delegatingFunction.kt @@ -0,0 +1,10 @@ +// PARAM_DESCRIPTOR: val t: defined in foo +// PARAM_TYPES: T +trait T { + fun test() {} +} + +fun foo() { + val t = object: T {} + (object: T by t {}).test() +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/basic/delegatingFunction.kt.after b/idea/testData/refactoring/extractFunction/basic/delegatingFunction.kt.after new file mode 100644 index 00000000000..b960e6c47e9 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/basic/delegatingFunction.kt.after @@ -0,0 +1,14 @@ +// PARAM_DESCRIPTOR: val t: defined in foo +// PARAM_TYPES: T +trait T { + fun test() {} +} + +fun foo() { + val t = object: T {} + __dummyTestFun__(t) +} + +private fun __dummyTestFun__(t: T) { + (object : T by t {}).test() +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/basic/fakeOverride.kt b/idea/testData/refactoring/extractFunction/basic/fakeOverride.kt new file mode 100644 index 00000000000..45d31e59355 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/basic/fakeOverride.kt @@ -0,0 +1,7 @@ +trait T { + fun test() {} +} + +fun foo() { + (object: T {}).test() +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/basic/fakeOverride.kt.after b/idea/testData/refactoring/extractFunction/basic/fakeOverride.kt.after new file mode 100644 index 00000000000..90e2ce1cedf --- /dev/null +++ b/idea/testData/refactoring/extractFunction/basic/fakeOverride.kt.after @@ -0,0 +1,11 @@ +trait T { + fun test() {} +} + +fun foo() { + __dummyTestFun__() +} + +private fun __dummyTestFun__() { + (object : T {}).test() +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java index 6ce8edd3c54..ce99ed868e1 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java @@ -366,12 +366,24 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/refactoring/extractFunction/basic"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("delegatingFunction.kt") + public void testDelegatingFunction() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/basic/delegatingFunction.kt"); + doExtractFunctionTest(fileName); + } + @TestMetadata("extensionFunForArray.kt") public void testExtensionFunForArray() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/basic/extensionFunForArray.kt"); doExtractFunctionTest(fileName); } + @TestMetadata("fakeOverride.kt") + public void testFakeOverride() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/basic/fakeOverride.kt"); + doExtractFunctionTest(fileName); + } + @TestMetadata("fragmentWithComment.kt") public void testFragmentWithComment() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/basic/fragmentWithComment.kt");