Safe Delete: Fix exception on deleting Java class used in Kotlin import directive(s)

#KT-14596 Fixed
This commit is contained in:
Alexey Sedunov
2016-11-22 19:52:12 +03:00
parent 465138cfa1
commit cedbac6b43
8 changed files with 40 additions and 5 deletions

View File

@@ -342,6 +342,7 @@ These artifacts include extensions for the types available in the latter JDKs, s
- [`KT-14854`](https://youtrack.jetbrains.com/issue/KT-14854) Extract Interface: Fix NPE on dialog opening
- [`KT-14814`](https://youtrack.jetbrains.com/issue/KT-14814) Rename: Fix renaming of .kts file to .kt and vice versa
- [`KT-14361`](https://youtrack.jetbrains.com/issue/KT-14361) Rename: Do not report redeclaration conflict for private top-level declarations located in different files
- [`KT-14596`](https://youtrack.jetbrains.com/issue/KT-14596) Safe Delete: Fix exception on deleting Java class used in Kotlin import directive(s)
## 1.0.5

View File

@@ -102,7 +102,7 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() {
ignoranceCondition.value(usageElement) -> null
else -> {
usageElement.getNonStrictParentOfType<KtImportDirective>()?.let { importDirective ->
SafeDeleteImportDirectiveUsageInfo(importDirective, element.unwrapped as KtDeclaration)
SafeDeleteImportDirectiveUsageInfo(importDirective, element)
} ?: usageElement.getParentOfTypeAndBranch<KtSuperTypeEntry> { typeReference }?.let {
if (element is PsiClass && element.isInterface) SafeDeleteSuperTypeUsageInfo(it, element) else usageInfo
} ?: if (forceReferencedElementUnwrapping) {
@@ -140,7 +140,7 @@ class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() {
.filterNot { reference -> getIgnoranceCondition().value(reference.element) }
.mapTo(usages) { reference ->
reference.element.getNonStrictParentOfType<KtImportDirective>()?.let { importDirective ->
SafeDeleteImportDirectiveUsageInfo(importDirective, element.unwrapped as KtDeclaration)
SafeDeleteImportDirectiveUsageInfo(importDirective, element)
} ?: SafeDeleteReferenceSimpleDeleteUsageInfo(element, declaration, false)
}

View File

@@ -16,17 +16,27 @@
package org.jetbrains.kotlin.idea.refactoring.safeDelete
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiMember
import com.intellij.refactoring.safeDelete.usageInfo.SafeDeleteReferenceSimpleDeleteUsageInfo
import org.jetbrains.kotlin.asJava.unwrapped
import org.jetbrains.kotlin.idea.caches.resolve.getJavaMemberDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
import org.jetbrains.kotlin.idea.core.targetDescriptors
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtImportDirective
class SafeDeleteImportDirectiveUsageInfo(
importDirective: KtImportDirective, declaration: KtDeclaration
importDirective: KtImportDirective, declaration: PsiElement
) : SafeDeleteReferenceSimpleDeleteUsageInfo(importDirective, declaration, importDirective.isSafeToDelete(declaration))
private fun KtImportDirective.isSafeToDelete(declaration: KtDeclaration): Boolean {
private fun KtImportDirective.isSafeToDelete(element: PsiElement): Boolean {
val referencedDescriptor = targetDescriptors().singleOrNull() ?: return false
return referencedDescriptor == declaration.resolveToDescriptor()
val unwrappedElement = element.unwrapped
val declarationDescriptor = when (unwrappedElement) {
is KtDeclaration -> unwrappedElement.resolveToDescriptor()
is PsiMember -> unwrappedElement.getJavaMemberDescriptor()
else -> return false
}
return referencedDescriptor == declarationDescriptor
}

View File

@@ -0,0 +1,7 @@
public class <caret>J {
}
class JJ {
}

View File

@@ -0,0 +1,5 @@
import J
class K {
}

View File

@@ -146,6 +146,12 @@ public class SafeDeleteTestGenerated extends AbstractSafeDeleteTest {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/refactoring/safeDelete/deleteClass/javaClassWithKotlin"), Pattern.compile("^(.+)\\.java$"), TargetBackend.ANY, true);
}
@TestMetadata("ImportJavaClassToKotlin.java")
public void testImportJavaClassToKotlin() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/safeDelete/deleteClass/javaClassWithKotlin/ImportJavaClassToKotlin.java");
doJavaClassTest(fileName);
}
@TestMetadata("javaInterfaceInSuperTypeList.java")
public void testJavaInterfaceInSuperTypeList() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/safeDelete/deleteClass/javaClassWithKotlin/javaInterfaceInSuperTypeList.java");