Extract function: Do not report conflicts for fake overrides/delegates of the same callable declaration
This commit is contained in:
@@ -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()
|
||||
}
|
||||
+12
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user