diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt index 41ae4016505..aba12402fad 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt @@ -50,7 +50,7 @@ public fun PsiReference.matchesTarget(candidateTarget: PsiElement): Boolean { if (this is JetReference) { return targets.any { - it is PsiMethod && it.isConstructor() && it.getContainingClass() == unwrappedCandidate + it.isConstructorOf(unwrappedCandidate) || it is JetObjectDeclaration && it.isCompanion() && it.getNonStrictParentOfType() == unwrappedCandidate } } @@ -68,6 +68,12 @@ public fun PsiReference.matchesTarget(candidateTarget: PsiElement): Boolean { return false } +private fun PsiElement.isConstructorOf(unwrappedCandidate: PsiElement) = + // call to Java constructor + (this is PsiMethod && isConstructor() && getContainingClass() == unwrappedCandidate) || + // call to Kotlin constructor + (this is JetSecondaryConstructor && getStrictParentOfType() == unwrappedCandidate) + fun AbstractJetReference.renameImplicitConventionalCall(newName: String?): JetExpression { if (newName == null) return expression diff --git a/idea/testData/findUsages/kotlin/findClassUsages/javaClassSecondaryCtrUsages.0.kt b/idea/testData/findUsages/kotlin/findClassUsages/javaClassSecondaryCtrUsages.0.kt new file mode 100644 index 00000000000..e7fc88cf08c --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/javaClassSecondaryCtrUsages.0.kt @@ -0,0 +1,5 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.JetClass +// OPTIONS: usages, constructorUsages +open class A { + constructor() {} +} diff --git a/idea/testData/findUsages/kotlin/findClassUsages/javaClassSecondaryCtrUsages.1.java b/idea/testData/findUsages/kotlin/findClassUsages/javaClassSecondaryCtrUsages.1.java new file mode 100644 index 00000000000..ca70689e7c8 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/javaClassSecondaryCtrUsages.1.java @@ -0,0 +1,5 @@ +class B { + public static void foo() { + new A() + } +} diff --git a/idea/testData/findUsages/kotlin/findClassUsages/javaClassSecondaryCtrUsages.results.txt b/idea/testData/findUsages/kotlin/findClassUsages/javaClassSecondaryCtrUsages.results.txt new file mode 100644 index 00000000000..44d53956994 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/javaClassSecondaryCtrUsages.results.txt @@ -0,0 +1 @@ +New instance creation (3: 13) new A() diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassSecondaryCtorUsages.0.kt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassSecondaryCtorUsages.0.kt new file mode 100644 index 00000000000..42595046a08 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassSecondaryCtorUsages.0.kt @@ -0,0 +1,5 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.JetClass +// OPTIONS: usages, constructorUsages +open class A { + constructor() {} +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassSecondaryCtorUsages.1.kt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassSecondaryCtorUsages.1.kt new file mode 100644 index 00000000000..47f13361197 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassSecondaryCtorUsages.1.kt @@ -0,0 +1,3 @@ +fun foo() { + A() +} diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassSecondaryCtorUsages.results.txt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassSecondaryCtorUsages.results.txt new file mode 100644 index 00000000000..b05ebb8ef45 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassSecondaryCtorUsages.results.txt @@ -0,0 +1 @@ +New instance creation (2: 5) A() diff --git a/idea/testData/inspections/unusedSymbol/class/constructorUsage.kt b/idea/testData/inspections/unusedSymbol/class/constructorUsage.kt new file mode 100644 index 00000000000..61f26f2f638 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/class/constructorUsage.kt @@ -0,0 +1,7 @@ +fun main(args: Array) { + A() +} + +class A { + constructor() {} +} diff --git a/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java b/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java index ea18465b3ed..f4602920680 100644 --- a/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java @@ -257,6 +257,12 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { doTest(fileName); } + @TestMetadata("javaClassSecondaryCtrUsages.0.kt") + public void testJavaClassSecondaryCtrUsages() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findClassUsages/javaClassSecondaryCtrUsages.0.kt"); + doTest(fileName); + } + @TestMetadata("javaDerivedClassUsages1.0.kt") public void testJavaDerivedClassUsages1() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findClassUsages/javaDerivedClassUsages1.0.kt"); @@ -395,6 +401,12 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { doTest(fileName); } + @TestMetadata("kotlinClassSecondaryCtorUsages.0.kt") + public void testKotlinClassSecondaryCtorUsages() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findClassUsages/kotlinClassSecondaryCtorUsages.0.kt"); + doTest(fileName); + } + @TestMetadata("kotlinDeeplyNestedClassAllUsages.0.kt") public void testKotlinDeeplyNestedClassAllUsages() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findClassUsages/kotlinDeeplyNestedClassAllUsages.0.kt");