Extract function: Do not report conflicts for fake overrides/delegates of the same callable declaration

This commit is contained in:
Alexey Sedunov
2015-02-10 15:15:58 +03:00
parent cef9996ba7
commit 9f3ba50dc5
6 changed files with 68 additions and 2 deletions
@@ -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 <T: Any> PsiElement.getAndRemoveCopyableUserData(key: Key<T>): 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
@@ -0,0 +1,10 @@
// PARAM_DESCRIPTOR: val t: <no name provided> defined in foo
// PARAM_TYPES: T
trait T {
fun test() {}
}
fun foo() {
val t = object: T {}
<selection>(object: T by t {}).test()</selection>
}
@@ -0,0 +1,14 @@
// PARAM_DESCRIPTOR: val t: <no name provided> 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()
}
@@ -0,0 +1,7 @@
trait T {
fun test() {}
}
fun foo() {
<selection>(object: T {}).test()</selection>
}
@@ -0,0 +1,11 @@
trait T {
fun test() {}
}
fun foo() {
__dummyTestFun__()
}
private fun __dummyTestFun__() {
(object : T {}).test()
}
@@ -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");