From 7e2ce2d4e053e459f93bf373df930664d8d8280c Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 3 Jun 2016 20:42:46 +0200 Subject: [PATCH] when finding usages of parameter of annotation class primary constructor, search also for light method generated from that parameter #KT-9399 Fixed --- .../src/org/jetbrains/kotlin/asJava/LightClassUtil.kt | 7 +++++++ .../src/org/jetbrains/kotlin/asJava/lightClassUtils.kt | 9 +++++++++ .../search/ideaExtensions/KotlinReferencesSearcher.kt | 1 + .../kotlinAnnotationConstructorParameterUsages.0.kt | 4 ++++ .../kotlinAnnotationConstructorParameterUsages.1.java | 1 + ...otlinAnnotationConstructorParameterUsages.results.txt | 1 + .../kotlin/findUsages/FindUsagesTestGenerated.java | 6 ++++++ 7 files changed, 29 insertions(+) create mode 100644 idea/testData/findUsages/kotlin/findParameterUsages/kotlinAnnotationConstructorParameterUsages.0.kt create mode 100644 idea/testData/findUsages/kotlin/findParameterUsages/kotlinAnnotationConstructorParameterUsages.1.java create mode 100644 idea/testData/findUsages/kotlin/findParameterUsages/kotlinAnnotationConstructorParameterUsages.results.txt diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.kt index 400f1008010..da83c805235 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.kt @@ -112,6 +112,13 @@ object LightClassUtil { return getPsiMethodWrapper(function) } + /** + * Returns the light method generated from the parameter of an annotation class. + */ + fun getLightClassMethod(parameter: KtParameter): PsiMethod? { + return getPsiMethodWrapper(parameter) + } + fun getLightClassMethods(function: KtFunction): List { return getPsiMethodWrappers(function, true) } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt index 4b816755631..2c2715b3b3d 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt @@ -49,6 +49,7 @@ fun KtDeclaration.toLightElements(): List = is KtParameter -> ArrayList().let { elements -> toPsiParameters().toCollection(elements) LightClassUtil.getLightClassPropertyMethods(this).toCollection(elements) + toAnnotationLightMethod()?.let { elements.add(it) } elements } @@ -96,6 +97,14 @@ fun KtParameter.toPsiParameters(): Collection { } } +private fun KtParameter.toAnnotationLightMethod(): PsiMethod? { + val parent = ownerFunction as? KtPrimaryConstructor ?: return null + val containingClass = parent.getContainingClassOrObject() + if (!containingClass.isAnnotation()) return null + + return LightClassUtil.getLightClassMethod(this) +} + fun KtTypeParameter.toPsiTypeParameters(): List { val paramList = getNonStrictParentOfType() if (paramList == null) return listOf() diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.kt index c1789057105..2f77107ad78 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.kt @@ -273,6 +273,7 @@ class KotlinReferencesSearcher : QueryExecutorBase { searchPropertyMethods(queryParameters, element) runReadAction { + val componentFunctionDescriptor = element.dataClassComponentFunction() if (componentFunctionDescriptor != null) { val containingClass = element.getStrictParentOfType()?.toLightClass() diff --git a/idea/testData/findUsages/kotlin/findParameterUsages/kotlinAnnotationConstructorParameterUsages.0.kt b/idea/testData/findUsages/kotlin/findParameterUsages/kotlinAnnotationConstructorParameterUsages.0.kt new file mode 100644 index 00000000000..3bfb088d994 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findParameterUsages/kotlinAnnotationConstructorParameterUsages.0.kt @@ -0,0 +1,4 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtParameter +// OPTIONS: usages + +annotation class KotlinAnnForJava(val p: String) diff --git a/idea/testData/findUsages/kotlin/findParameterUsages/kotlinAnnotationConstructorParameterUsages.1.java b/idea/testData/findUsages/kotlin/findParameterUsages/kotlinAnnotationConstructorParameterUsages.1.java new file mode 100644 index 00000000000..e1184dacc0e --- /dev/null +++ b/idea/testData/findUsages/kotlin/findParameterUsages/kotlinAnnotationConstructorParameterUsages.1.java @@ -0,0 +1 @@ +@KotlinAnnForJava(p = "a") public class JavaClassForKotlin {} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findParameterUsages/kotlinAnnotationConstructorParameterUsages.results.txt b/idea/testData/findUsages/kotlin/findParameterUsages/kotlinAnnotationConstructorParameterUsages.results.txt new file mode 100644 index 00000000000..3f16b247f43 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findParameterUsages/kotlinAnnotationConstructorParameterUsages.results.txt @@ -0,0 +1 @@ +Unclassified usage 1 @KotlinAnnForJava(p = "a") public class JavaClassForKotlin {} diff --git a/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java b/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java index 54e3ebf4477..abf846656de 100644 --- a/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java @@ -804,6 +804,12 @@ public class FindUsagesTestGenerated extends AbstractFindUsagesTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/findUsages/kotlin/findParameterUsages"), Pattern.compile("^(.+)\\.0\\.kt$"), true); } + @TestMetadata("kotlinAnnotationConstructorParameterUsages.0.kt") + public void testKotlinAnnotationConstructorParameterUsages() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findParameterUsages/kotlinAnnotationConstructorParameterUsages.0.kt"); + doTest(fileName); + } + @TestMetadata("kotlinComponentFunctionParameterUsages.0.kt") public void testKotlinComponentFunctionParameterUsages() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findParameterUsages/kotlinComponentFunctionParameterUsages.0.kt");