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 9dd6fe1f81c..e918cf9d016 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt @@ -46,6 +46,7 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.utils.SmartSet import org.jetbrains.kotlin.utils.ifEmpty import java.util.* @@ -55,11 +56,12 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() { override fun findUsages( element: PsiElement, allElementsToDelete: Array, usages: MutableList ): NonCodeUsageSearchInfo { - val deleteList = allElementsToDelete.toList() + val deleteSet = SmartSet.create() + deleteSet.addAll(allElementsToDelete) fun getIgnoranceCondition() = Condition { if (it is KtFile) return@Condition false - deleteList.any { element -> JavaSafeDeleteProcessor.isInside(it, element.unwrapped) } + deleteSet.any { element -> JavaSafeDeleteProcessor.isInside(it, element.unwrapped) } } fun getSearchInfo(element: PsiElement): NonCodeUsageSearchInfo { @@ -70,6 +72,10 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() { val javaUsages = ArrayList() val searchInfo = super.findUsages(element, allElementsToDelete, javaUsages) + javaUsages.filterIsInstance().mapNotNullTo(deleteSet) { it.element } + + val ignoranceCondition = getIgnoranceCondition() + javaUsages.mapNotNullTo(usages) { usageInfo -> when (usageInfo) { is SafeDeleteOverridingMethodUsageInfo -> @@ -87,13 +93,16 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() { is SafeDeleteReferenceJavaDeleteUsageInfo -> usageInfo.element?.let { usageElement -> - if (usageElement.getNonStrictParentOfType() != null) null - else { - usageElement.getNonStrictParentOfType()?.let { importDirective -> - SafeDeleteImportDirectiveUsageInfo(importDirective, element.unwrapped as KtDeclaration) - } ?: if (forceReferencedElementUnwrapping) { - SafeDeleteReferenceJavaDeleteUsageInfo(usageElement, element.unwrapped, usageInfo.isSafeDelete) - } else usageInfo + when { + usageElement.getNonStrictParentOfType() != null -> null + ignoranceCondition.value(usageElement) -> null + else -> { + usageElement.getNonStrictParentOfType()?.let { importDirective -> + SafeDeleteImportDirectiveUsageInfo(importDirective, element.unwrapped as KtDeclaration) + } ?: if (forceReferencedElementUnwrapping) { + SafeDeleteReferenceJavaDeleteUsageInfo(usageElement, element.unwrapped, usageInfo.isSafeDelete) + } else usageInfo + } } } diff --git a/idea/testData/refactoring/safeDelete/deleteFunction/kotlinFunctionWithJava/usageInOverrideToDelete.java b/idea/testData/refactoring/safeDelete/deleteFunction/kotlinFunctionWithJava/usageInOverrideToDelete.java new file mode 100644 index 00000000000..7c90d1867ba --- /dev/null +++ b/idea/testData/refactoring/safeDelete/deleteFunction/kotlinFunctionWithJava/usageInOverrideToDelete.java @@ -0,0 +1,8 @@ +class J implements T { + T u; + + @Override + public void foo() { + u.foo(); + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/safeDelete/deleteFunction/kotlinFunctionWithJava/usageInOverrideToDelete.java.after b/idea/testData/refactoring/safeDelete/deleteFunction/kotlinFunctionWithJava/usageInOverrideToDelete.java.after new file mode 100644 index 00000000000..d4c461777ab --- /dev/null +++ b/idea/testData/refactoring/safeDelete/deleteFunction/kotlinFunctionWithJava/usageInOverrideToDelete.java.after @@ -0,0 +1,4 @@ +class J implements T { + T u; + +} \ No newline at end of file diff --git a/idea/testData/refactoring/safeDelete/deleteFunction/kotlinFunctionWithJava/usageInOverrideToDelete.kt b/idea/testData/refactoring/safeDelete/deleteFunction/kotlinFunctionWithJava/usageInOverrideToDelete.kt new file mode 100644 index 00000000000..5200fc08550 --- /dev/null +++ b/idea/testData/refactoring/safeDelete/deleteFunction/kotlinFunctionWithJava/usageInOverrideToDelete.kt @@ -0,0 +1,9 @@ +interface T { + fun foo() +} + +class A(val t: T) : T { + override fun foo() { + t.foo() + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/safeDelete/deleteFunction/kotlinFunctionWithJava/usageInOverrideToDelete.kt.after b/idea/testData/refactoring/safeDelete/deleteFunction/kotlinFunctionWithJava/usageInOverrideToDelete.kt.after new file mode 100644 index 00000000000..7fb8d586f2a --- /dev/null +++ b/idea/testData/refactoring/safeDelete/deleteFunction/kotlinFunctionWithJava/usageInOverrideToDelete.kt.after @@ -0,0 +1,5 @@ +interface T { +} + +class A(val t: T) : T { +} \ No newline at end of file diff --git a/idea/testData/refactoring/safeDelete/deleteProperty/kotlinPropertyWithJava/usageInOverrideToDelete.java b/idea/testData/refactoring/safeDelete/deleteProperty/kotlinPropertyWithJava/usageInOverrideToDelete.java new file mode 100644 index 00000000000..d81408c7fd5 --- /dev/null +++ b/idea/testData/refactoring/safeDelete/deleteProperty/kotlinPropertyWithJava/usageInOverrideToDelete.java @@ -0,0 +1,22 @@ +abstract class I implements T { + T u; + + @Override + public int getFoo() { + return u.getFoo(); + } +} + +class J implements T { + T u; + + @Override + public int getFoo() { + return u.getFoo(); + } + + @Override + public void setFoo(int value) { + u.setFoo(value); + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/safeDelete/deleteProperty/kotlinPropertyWithJava/usageInOverrideToDelete.java.after b/idea/testData/refactoring/safeDelete/deleteProperty/kotlinPropertyWithJava/usageInOverrideToDelete.java.after new file mode 100644 index 00000000000..2ce3c5ac646 --- /dev/null +++ b/idea/testData/refactoring/safeDelete/deleteProperty/kotlinPropertyWithJava/usageInOverrideToDelete.java.after @@ -0,0 +1,9 @@ +abstract class I implements T { + T u; + +} + +class J implements T { + T u; + +} \ No newline at end of file diff --git a/idea/testData/refactoring/safeDelete/deleteProperty/kotlinPropertyWithJava/usageInOverrideToDelete.kt b/idea/testData/refactoring/safeDelete/deleteProperty/kotlinPropertyWithJava/usageInOverrideToDelete.kt new file mode 100644 index 00000000000..e6ae93cb1fd --- /dev/null +++ b/idea/testData/refactoring/safeDelete/deleteProperty/kotlinPropertyWithJava/usageInOverrideToDelete.kt @@ -0,0 +1,11 @@ +interface T { + var foo: Int +} + +class A(val t: T) : T { + override var foo: Int + get() = t.foo + set(value) { + t.foo = value + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/safeDelete/deleteProperty/kotlinPropertyWithJava/usageInOverrideToDelete.kt.after b/idea/testData/refactoring/safeDelete/deleteProperty/kotlinPropertyWithJava/usageInOverrideToDelete.kt.after new file mode 100644 index 00000000000..7fb8d586f2a --- /dev/null +++ b/idea/testData/refactoring/safeDelete/deleteProperty/kotlinPropertyWithJava/usageInOverrideToDelete.kt.after @@ -0,0 +1,5 @@ +interface T { +} + +class A(val t: T) : T { +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/safeDelete/SafeDeleteTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/safeDelete/SafeDeleteTestGenerated.java index 46224c632b8..d2ac4042cc4 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/safeDelete/SafeDeleteTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/safeDelete/SafeDeleteTestGenerated.java @@ -384,6 +384,12 @@ public class SafeDeleteTestGenerated extends AbstractSafeDeleteTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/safeDelete/deleteFunction/kotlinFunctionWithJava/secondaryConstructor.kt"); doFunctionTestWithJava(fileName); } + + @TestMetadata("usageInOverrideToDelete.kt") + public void testUsageInOverrideToDelete() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/safeDelete/deleteFunction/kotlinFunctionWithJava/usageInOverrideToDelete.kt"); + doFunctionTestWithJava(fileName); + } } @TestMetadata("idea/testData/refactoring/safeDelete/deleteFunction/javaFunctionWithKotlin") @@ -627,6 +633,12 @@ public class SafeDeleteTestGenerated extends AbstractSafeDeleteTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/safeDelete/deleteProperty/kotlinPropertyWithJava/propertyExt.kt"); doPropertyTestWithJava(fileName); } + + @TestMetadata("usageInOverrideToDelete.kt") + public void testUsageInOverrideToDelete() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/safeDelete/deleteProperty/kotlinPropertyWithJava/usageInOverrideToDelete.kt"); + doPropertyTestWithJava(fileName); + } } @TestMetadata("idea/testData/refactoring/safeDelete/deleteProperty/javaPropertyWithKotlin")