diff --git a/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinTargetElementEvaluator.kt b/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinTargetElementEvaluator.kt index 98b67c80f74..913a14e01c5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinTargetElementEvaluator.kt +++ b/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinTargetElementEvaluator.kt @@ -16,17 +16,15 @@ package org.jetbrains.kotlin.idea.search.ideaExtensions +import com.intellij.codeInsight.JavaTargetElementEvaluator import com.intellij.codeInsight.TargetElementEvaluatorEx import com.intellij.codeInsight.TargetElementUtil -import com.intellij.codeInsight.TargetElementUtilExtender import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.psi.PsiReference import org.jetbrains.kotlin.idea.references.KtDestructuringDeclarationReference -import org.jetbrains.kotlin.psi.KtClass -import org.jetbrains.kotlin.psi.KtPrimaryConstructor -import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType -import org.jetbrains.kotlin.psi.psiUtil.isAbstract +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.* class KotlinTargetElementEvaluator : TargetElementEvaluatorEx { override fun includeSelfInGotoImplementation(element: PsiElement): Boolean = !(element is KtClass && element.isAbstract()) @@ -36,6 +34,15 @@ class KotlinTargetElementEvaluator : TargetElementEvaluatorEx { if (ref is KtDestructuringDeclarationReference && flags.and(TargetElementUtil.ELEMENT_NAME_ACCEPTED) != 0) { return ref.element } + + val refExpression = ref.element as? KtSimpleNameExpression + val calleeExpression = refExpression?.getParentOfTypeAndBranch { calleeExpression } + if (calleeExpression != null) { + (ref.resolve() as? KtConstructor<*>)?.let { + return if (flags and JavaTargetElementEvaluator.NEW_AS_CONSTRUCTOR != 0) it else it.containingClassOrObject + } + } + return null } diff --git a/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/annotationEntry.0.kt b/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/annotationEntry.0.kt new file mode 100644 index 00000000000..6239187c9a6 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/annotationEntry.0.kt @@ -0,0 +1,8 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtClass +// OPTIONS: usages, constructorUsages +annotation class MyAnnotation() + +@MyAnnotation +fun test() { + MyAnnotation::class.java +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/annotationEntry.results.txt b/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/annotationEntry.results.txt new file mode 100644 index 00000000000..119755a481f --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/annotationEntry.results.txt @@ -0,0 +1,2 @@ +Annotation 5 @MyAnnotation +Unclassified usage 7 MyAnnotation::class.java \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/constructorCall.0.kt b/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/constructorCall.0.kt new file mode 100644 index 00000000000..0357f0eecd5 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/constructorCall.0.kt @@ -0,0 +1,7 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtClass +// OPTIONS: usages, constructorUsages +fun test() { + val kk: KK = KK() +} + +class KK() \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/constructorCall.results.txt b/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/constructorCall.results.txt new file mode 100644 index 00000000000..9f5b7376392 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/constructorCall.results.txt @@ -0,0 +1,2 @@ +Local variable declaration 4 val kk: KK = KK() +New instance creation 4 val kk: KK = KK() \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/constructorCall.0.kt b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/constructorCall.0.kt new file mode 100644 index 00000000000..fb243dec480 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/constructorCall.0.kt @@ -0,0 +1,9 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtClass +// OPTIONS: usages, constructorUsages +fun test() { + val kk: KK = KK() +} + +class KK { + constructor() +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/constructorCall.results.txt b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/constructorCall.results.txt new file mode 100644 index 00000000000..9f5b7376392 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/constructorCall.results.txt @@ -0,0 +1,2 @@ +Local variable declaration 4 val kk: KK = KK() +New instance creation 4 val kk: KK = KK() \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java b/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java index 51cf5a2147f..2d05e7b5f37 100644 --- a/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java @@ -979,6 +979,18 @@ public class FindUsagesTestGenerated extends AbstractFindUsagesTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/findUsages/kotlin/findPrimaryConstructorUsages"), Pattern.compile("^(.+)\\.0\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("annotationEntry.0.kt") + public void testAnnotationEntry() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/annotationEntry.0.kt"); + doTest(fileName); + } + + @TestMetadata("constructorCall.0.kt") + public void testConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/constructorCall.0.kt"); + doTest(fileName); + } + @TestMetadata("jvmOverloaded.0.kt") public void testJvmOverloaded() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/jvmOverloaded.0.kt"); @@ -1195,6 +1207,12 @@ public class FindUsagesTestGenerated extends AbstractFindUsagesTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/findUsages/kotlin/findSecondaryConstructorUsages"), Pattern.compile("^(.+)\\.0\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("constructorCall.0.kt") + public void testConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/constructorCall.0.kt"); + doTest(fileName); + } + @TestMetadata("defaultSecondaryConstructor.0.kt") public void testDefaultSecondaryConstructor() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/defaultSecondaryConstructor.0.kt");