From a76f43b66c9b30ab74fd30bfebbafb2ae62962ee Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 8 Dec 2015 15:58:20 +0300 Subject: [PATCH] Safe Delete: Skip internal usages of class constructors when deleting class itself #KT-8857 Fixed --- .../safeDelete/KotlinSafeDeleteProcessor.kt | 15 +++++++++++++-- .../classWithExternalConstructructorUsage.kt | 5 +++++ ...ssWithExternalConstructructorUsage.kt.messages | 1 + .../classWithInternalConstructructorUsage.kt | 5 +++++ ...classWithInternalConstructructorUsage.kt.after | 1 + .../classWithDelegationCalls.kt.messages | 2 +- .../safeDelete/SafeDeleteTestGenerated.java | 12 ++++++++++++ 7 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 idea/testData/safeDelete/deleteClass/kotlinClass/classWithExternalConstructructorUsage.kt create mode 100644 idea/testData/safeDelete/deleteClass/kotlinClass/classWithExternalConstructructorUsage.kt.messages create mode 100644 idea/testData/safeDelete/deleteClass/kotlinClass/classWithInternalConstructructorUsage.kt create mode 100644 idea/testData/safeDelete/deleteClass/kotlinClass/classWithInternalConstructructorUsage.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt index 0a8275926ce..e5e6c79bba5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt @@ -21,6 +21,7 @@ import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import com.intellij.openapi.util.Condition import com.intellij.openapi.util.Conditions +import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod import com.intellij.psi.PsiParameter @@ -163,8 +164,18 @@ public class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() { } fun findDelegationCallUsages(element: PsiElement) { - element.processDelegationCallConstructorUsages(element.getUseScope()) { - usages.add(SafeDeleteReferenceSimpleDeleteUsageInfo(it, element, false)) + val constructors = when (element) { + is PsiClass -> element.constructors + is PsiMethod -> arrayOf(element) + else -> return + } + for (constructor in constructors) { + constructor.processDelegationCallConstructorUsages(constructor.useScope) { + if (!getIgnoranceCondition().value(it)) { + usages.add(SafeDeleteReferenceSimpleDeleteUsageInfo(it, element, false)) + } + true + } } } diff --git a/idea/testData/safeDelete/deleteClass/kotlinClass/classWithExternalConstructructorUsage.kt b/idea/testData/safeDelete/deleteClass/kotlinClass/classWithExternalConstructructorUsage.kt new file mode 100644 index 00000000000..d5a037dd16a --- /dev/null +++ b/idea/testData/safeDelete/deleteClass/kotlinClass/classWithExternalConstructructorUsage.kt @@ -0,0 +1,5 @@ +open class Foo() { + constructor(p: Int) : this() +} + +class Bar : Foo(1) \ No newline at end of file diff --git a/idea/testData/safeDelete/deleteClass/kotlinClass/classWithExternalConstructructorUsage.kt.messages b/idea/testData/safeDelete/deleteClass/kotlinClass/classWithExternalConstructructorUsage.kt.messages new file mode 100644 index 00000000000..fb8f9436683 --- /dev/null +++ b/idea/testData/safeDelete/deleteClass/kotlinClass/classWithExternalConstructructorUsage.kt.messages @@ -0,0 +1 @@ +class Foo has 1 usage that is not safe to delete. \ No newline at end of file diff --git a/idea/testData/safeDelete/deleteClass/kotlinClass/classWithInternalConstructructorUsage.kt b/idea/testData/safeDelete/deleteClass/kotlinClass/classWithInternalConstructructorUsage.kt new file mode 100644 index 00000000000..008e1b7bf56 --- /dev/null +++ b/idea/testData/safeDelete/deleteClass/kotlinClass/classWithInternalConstructructorUsage.kt @@ -0,0 +1,5 @@ +class Foo() { + constructor(p: Int) : this() +} + +class Bar \ No newline at end of file diff --git a/idea/testData/safeDelete/deleteClass/kotlinClass/classWithInternalConstructructorUsage.kt.after b/idea/testData/safeDelete/deleteClass/kotlinClass/classWithInternalConstructructorUsage.kt.after new file mode 100644 index 00000000000..4a643c4dde8 --- /dev/null +++ b/idea/testData/safeDelete/deleteClass/kotlinClass/classWithInternalConstructructorUsage.kt.after @@ -0,0 +1 @@ +class Bar \ No newline at end of file diff --git a/idea/testData/safeDelete/deleteClass/kotlinClassWithJava/classWithDelegationCalls.kt.messages b/idea/testData/safeDelete/deleteClass/kotlinClassWithJava/classWithDelegationCalls.kt.messages index 313224c1a85..998693a1225 100644 --- a/idea/testData/safeDelete/deleteClass/kotlinClassWithJava/classWithDelegationCalls.kt.messages +++ b/idea/testData/safeDelete/deleteClass/kotlinClassWithJava/classWithDelegationCalls.kt.messages @@ -1 +1 @@ -class B has 4 usages that are not safe to delete. \ No newline at end of file +class B has 3 usages that are not safe to delete. \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/safeDelete/SafeDeleteTestGenerated.java b/idea/tests/org/jetbrains/kotlin/safeDelete/SafeDeleteTestGenerated.java index 9d4ba405e67..0399fd49032 100644 --- a/idea/tests/org/jetbrains/kotlin/safeDelete/SafeDeleteTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/safeDelete/SafeDeleteTestGenerated.java @@ -55,6 +55,18 @@ public class SafeDeleteTestGenerated extends AbstractSafeDeleteTest { doClassTest(fileName); } + @TestMetadata("classWithExternalConstructructorUsage.kt") + public void testClassWithExternalConstructructorUsage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/safeDelete/deleteClass/kotlinClass/classWithExternalConstructructorUsage.kt"); + doClassTest(fileName); + } + + @TestMetadata("classWithInternalConstructructorUsage.kt") + public void testClassWithInternalConstructructorUsage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/safeDelete/deleteClass/kotlinClass/classWithInternalConstructructorUsage.kt"); + doClassTest(fileName); + } + @TestMetadata("localClass1.kt") public void testLocalClass1() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/safeDelete/deleteClass/kotlinClass/localClass1.kt");