diff --git a/idea/src/org/jetbrains/kotlin/idea/findUsages/JetElementDescriptionProvider.kt b/idea/src/org/jetbrains/kotlin/idea/findUsages/JetElementDescriptionProvider.kt index 7543cd4d99b..d82cdc0231d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/findUsages/JetElementDescriptionProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/findUsages/JetElementDescriptionProvider.kt @@ -20,13 +20,14 @@ import com.intellij.psi.ElementDescriptionLocation import com.intellij.psi.ElementDescriptionProvider import com.intellij.psi.PsiElement import com.intellij.psi.PsiNamedElement +import com.intellij.refactoring.util.CommonRefactoringUtil import com.intellij.refactoring.util.RefactoringDescriptionLocation import com.intellij.usageView.UsageViewLongNameLocation -import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.asJava.unwrapped +import org.jetbrains.kotlin.descriptors.ConstructorDescriptor import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.DescriptorUtils -import com.intellij.refactoring.util.CommonRefactoringUtil public class JetElementDescriptionProvider : ElementDescriptionProvider { public override fun getElementDescription(element: PsiElement, location: ElementDescriptionLocation): String? { @@ -45,26 +46,26 @@ public class JetElementDescriptionProvider : ElementDescriptionProvider { if (targetElement !is PsiNamedElement || targetElement !is JetElement) return null - val name = (targetElement as PsiNamedElement).getName() + val name = (targetElement : PsiNamedElement).getName() return when(location) { is UsageViewLongNameLocation -> name is RefactoringDescriptionLocation -> { - val kind = elementKind() - if (kind != null) { - val descriptor = (targetElement as JetDeclaration).descriptor - if (descriptor != null) { - val desc = if (location.includeParent() && targetElement !is JetTypeParameter && targetElement !is JetParameter) { + val kind = elementKind() ?: return null + var descriptor = (targetElement as JetDeclaration).descriptor ?: return null + if (descriptor is ConstructorDescriptor) { + descriptor = (descriptor as ConstructorDescriptor).getContainingDeclaration() + } + val desc = + if (location.includeParent() && targetElement !is JetTypeParameter && targetElement !is JetParameter) { DescriptorUtils.getFqName(descriptor).asString() } - else descriptor.getName().asString() + else { + descriptor.getName().asString() + } - "$kind ${CommonRefactoringUtil.htmlEmphasize(desc)}" - } - else null - } - else null + "$kind ${CommonRefactoringUtil.htmlEmphasize(desc)}" } else -> null } 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 454b820c807..05c0441bd07 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/KotlinSafeDeleteProcessor.kt @@ -24,11 +24,16 @@ import com.intellij.openapi.util.Conditions import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod import com.intellij.psi.PsiParameter +import com.intellij.psi.PsiReference +import com.intellij.psi.impl.search.ConstructorReferencesSearchHelper +import com.intellij.psi.search.SearchRequestCollector +import com.intellij.psi.search.SearchSession import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.refactoring.safeDelete.JavaSafeDeleteProcessor import com.intellij.refactoring.safeDelete.NonCodeUsageSearchInfo import com.intellij.refactoring.safeDelete.usageInfo.* import com.intellij.usageView.UsageInfo +import com.intellij.util.Processor import org.jetbrains.kotlin.asJava.* import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.Modality @@ -173,6 +178,13 @@ public class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() { } } + is JetSecondaryConstructor -> { + element.getRepresentativeLightMethod()?.let { method -> + findDelegationCallUsages(method) + findUsagesByJavaProcessor(method, false) + } + } + is JetNamedFunction -> { if (element.isLocal()) { findKotlinDeclarationUsages(element) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/utils.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/utils.kt index 88c0c7831c1..a78d181c8db 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/utils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/safeDelete/utils.kt @@ -33,6 +33,7 @@ public fun PsiElement.canDeleteElement(): Boolean { } return this is JetClassOrObject + || this is JetSecondaryConstructor || this is JetNamedFunction || this is PsiMethod || this is JetProperty diff --git a/idea/testData/safeDelete/deleteFunction/kotlinFunctionWithJava/secondaryConstructor.java b/idea/testData/safeDelete/deleteFunction/kotlinFunctionWithJava/secondaryConstructor.java new file mode 100644 index 00000000000..ad9ee90554f --- /dev/null +++ b/idea/testData/safeDelete/deleteFunction/kotlinFunctionWithJava/secondaryConstructor.java @@ -0,0 +1,7 @@ +class J extends B { + B b = new B(1); + + public J() { + super(1); + } +} \ No newline at end of file diff --git a/idea/testData/safeDelete/deleteFunction/kotlinFunctionWithJava/secondaryConstructor.kt b/idea/testData/safeDelete/deleteFunction/kotlinFunctionWithJava/secondaryConstructor.kt new file mode 100644 index 00000000000..8a9a44c1894 --- /dev/null +++ b/idea/testData/safeDelete/deleteFunction/kotlinFunctionWithJava/secondaryConstructor.kt @@ -0,0 +1,23 @@ +open class B { + constructor(a: Int) { + + } + + constructor(): this(1) { + + } +} + +open class A: B { + constructor(a: Int): super(a) { + + } +} + +open class C: B(1) { + +} + + fun test() { + B(1) + } \ No newline at end of file diff --git a/idea/testData/safeDelete/deleteFunction/kotlinFunctionWithJava/secondaryConstructor.kt.messages b/idea/testData/safeDelete/deleteFunction/kotlinFunctionWithJava/secondaryConstructor.kt.messages new file mode 100644 index 00000000000..962630650b4 --- /dev/null +++ b/idea/testData/safeDelete/deleteFunction/kotlinFunctionWithJava/secondaryConstructor.kt.messages @@ -0,0 +1 @@ +constructor B has 5 usages that are not safe to delete. \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/safeDelete/AbstractJetSafeDeleteTest.java b/idea/tests/org/jetbrains/kotlin/safeDelete/AbstractJetSafeDeleteTest.java index eeff2d61f03..fc5fa599bea 100644 --- a/idea/tests/org/jetbrains/kotlin/safeDelete/AbstractJetSafeDeleteTest.java +++ b/idea/tests/org/jetbrains/kotlin/safeDelete/AbstractJetSafeDeleteTest.java @@ -63,11 +63,11 @@ public abstract class AbstractJetSafeDeleteTest extends JetLightCodeInsightFixtu } public void doFunctionTest(@NotNull String path) throws Exception { - doTest(path, JetNamedFunction.class, false); + doTest(path, JetFunction.class, false); } public void doFunctionTestWithJava(@NotNull String path) throws Exception { - doTest(path, JetNamedFunction.class, true); + doTest(path, JetFunction.class, true); } public void doJavaMethodTest(@NotNull String path) throws Exception { diff --git a/idea/tests/org/jetbrains/kotlin/safeDelete/JetSafeDeleteTestGenerated.java b/idea/tests/org/jetbrains/kotlin/safeDelete/JetSafeDeleteTestGenerated.java index 3337a2cdd07..18719a9a02a 100644 --- a/idea/tests/org/jetbrains/kotlin/safeDelete/JetSafeDeleteTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/safeDelete/JetSafeDeleteTestGenerated.java @@ -376,6 +376,12 @@ public class JetSafeDeleteTestGenerated extends AbstractJetSafeDeleteTest { String fileName = JetTestUtils.navigationMetadata("idea/testData/safeDelete/deleteFunction/kotlinFunctionWithJava/overrideAndImplement2.kt"); doFunctionTestWithJava(fileName); } + + @TestMetadata("secondaryConstructor.kt") + public void testSecondaryConstructor() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/safeDelete/deleteFunction/kotlinFunctionWithJava/secondaryConstructor.kt"); + doFunctionTestWithJava(fileName); + } } @TestMetadata("idea/testData/safeDelete/deleteFunction/javaFunctionWithKotlin")