From 76bdfddfeae716146b8496bc0c1f7b7dd7e6c71c Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Wed, 13 Feb 2019 22:24:18 +0300 Subject: [PATCH] Making `KotlinAnnotatedElementsSearcher` able to search for parameters (KT-27794) --- .../asJava/elements/KtLightMethodImpl.kt | 9 ++++--- .../asJava/elements/KtLightParameter.kt | 17 +++++++++--- .../KotlinAnnotatedElementsSearcher.kt | 8 ++++++ ...estAnnotationsOnPropertiesAndParameters.kt | 26 +++++++++++++++++++ .../kotlin/search/AbstractSearcherTest.java | 8 +++--- .../search/AnnotatedMembersSearchTest.kt | 12 +++++++-- .../AnnotatedMembersSearchTestGenerated.java | 5 ++++ 7 files changed, 72 insertions(+), 13 deletions(-) create mode 100644 idea/testData/search/annotations/testAnnotationsOnPropertiesAndParameters.kt diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMethodImpl.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMethodImpl.kt index a6e79d01b19..f2d1001f576 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMethodImpl.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMethodImpl.kt @@ -57,14 +57,17 @@ open class KtLightMethodImpl protected constructor( } } - protected open fun buildParametersForList(): List = - clsDelegate.parameterList.parameters.mapIndexed { index, clsParameter -> + protected open fun buildParametersForList(): List { + val clsParameters by lazyPub { clsDelegate.parameterList.parameters } + return (dummyDelegate?.parameterList?.parameters ?: clsParameters).mapIndexed { index, dummyParameter -> KtLightParameter( - clsParameter, + dummyParameter, + { clsParameters.getOrNull(index) }, index, this@KtLightMethodImpl ) } + } private val typeParamsList: PsiTypeParameterList? by lazyPub { buildTypeParameterList() } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightParameter.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightParameter.kt index 73ed6df40e0..40a9eca4b82 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightParameter.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightParameter.kt @@ -23,12 +23,21 @@ import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration class KtLightParameter( - override val clsDelegate: PsiParameter, - private val index: Int, - method: KtLightMethod -) : LightParameter(clsDelegate.name ?: "p$index", clsDelegate.type, method, KotlinLanguage.INSTANCE), + private val dummyDelegate: PsiParameter, + private val clsDelegateProvider: () -> PsiParameter?, + private val index: Int, + method: KtLightMethod +) : LightParameter(dummyDelegate.name ?: "p$index", dummyDelegate.type, method, KotlinLanguage.INSTANCE), KtLightDeclaration { + private val lazyDelegate by lazyPub { clsDelegateProvider() ?: dummyDelegate } + + override val clsDelegate: PsiParameter get() = lazyDelegate + + override fun getType(): PsiType = lazyDelegate.type + + override fun getName(): String = dummyDelegate.name ?: lazyDelegate.name ?: super.getName() + private val lightModifierList by lazyPub { KtLightSimpleModifierList(this, emptySet()) } private var lightIdentifier: KtLightIdentifier? = null diff --git a/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinAnnotatedElementsSearcher.kt b/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinAnnotatedElementsSearcher.kt index 1fd5401ed7e..ead554c56d7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinAnnotatedElementsSearcher.kt +++ b/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinAnnotatedElementsSearcher.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.asJava.ImpreciseResolveResult.NO_MATCH import org.jetbrains.kotlin.asJava.ImpreciseResolveResult.UNSURE import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.toLightClass +import org.jetbrains.kotlin.asJava.toPsiParameters import org.jetbrains.kotlin.compatibility.ExecutorProcessor import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.search.PsiBasedClassResolver @@ -64,6 +65,13 @@ class KotlinAnnotatedElementsSearcher : QueryExecutor { + if (!declaration.toPsiParameters().all { consumer.process(it) }) return@processAnnotatedMembers false + LightClassUtil.getLightClassBackingField(declaration)?.let { + if (!consumer.process(it)) return@processAnnotatedMembers false + } + LightClassUtil.getLightClassPropertyMethods(declaration).all { consumer.process(it) } + } else -> true } } diff --git a/idea/testData/search/annotations/testAnnotationsOnPropertiesAndParameters.kt b/idea/testData/search/annotations/testAnnotationsOnPropertiesAndParameters.kt new file mode 100644 index 00000000000..766aa67284f --- /dev/null +++ b/idea/testData/search/annotations/testAnnotationsOnPropertiesAndParameters.kt @@ -0,0 +1,26 @@ +data class TestClass1(@java.lang.Deprecated val pctorfield: Int) { + constructor(@java.lang.Deprecated param: Int, param2: String) : this(param) +} + +class TestClass2( + @param:java.lang.Deprecated val deprecatedParamField: Int, + @field:java.lang.Deprecated val deprecatedField: Int, + @java.lang.Deprecated constructorParam: Int +) { + fun foo(@java.lang.Deprecated functionParam) {} +} + +// ANNOTATION: java.lang.Deprecated +// SEARCH: field:deprecatedField +// SEARCH: field:deprecatedParamField +// SEARCH: field:pctorfield +// SEARCH: method:component1 +// SEARCH: method:getDeprecatedField +// SEARCH: method:getDeprecatedParamField +// SEARCH: method:getPctorfield +// SEARCH: param:constructorParam +// SEARCH: param:deprecatedField +// SEARCH: param:deprecatedParamField +// SEARCH: param:pctorfield +// SEARCH: param:functionParam +// SEARCH: param:param diff --git a/idea/tests/org/jetbrains/kotlin/search/AbstractSearcherTest.java b/idea/tests/org/jetbrains/kotlin/search/AbstractSearcherTest.java index 3b712cb5b59..cc939c0f93b 100644 --- a/idea/tests/org/jetbrains/kotlin/search/AbstractSearcherTest.java +++ b/idea/tests/org/jetbrains/kotlin/search/AbstractSearcherTest.java @@ -6,10 +6,7 @@ package org.jetbrains.kotlin.search; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.psi.JavaPsiFacade; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiField; -import com.intellij.psi.PsiMethod; +import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.searches.ClassInheritorsSearch; import com.intellij.testFramework.LightProjectDescriptor; @@ -98,6 +95,9 @@ public abstract class AbstractSearcherTest extends LightCodeInsightFixtureTestCa if (member instanceof PsiField) { return "field:" + ((PsiField) member).getName(); } + if (member instanceof PsiParameter) { + return "param:" + ((PsiParameter) member).getName(); + } throw new IllegalStateException("Do not know how to render member of type: " + member.getClass().getName()); } diff --git a/idea/tests/org/jetbrains/kotlin/search/AnnotatedMembersSearchTest.kt b/idea/tests/org/jetbrains/kotlin/search/AnnotatedMembersSearchTest.kt index 0d6c4773897..3ab4accdb7c 100644 --- a/idea/tests/org/jetbrains/kotlin/search/AnnotatedMembersSearchTest.kt +++ b/idea/tests/org/jetbrains/kotlin/search/AnnotatedMembersSearchTest.kt @@ -6,8 +6,9 @@ package org.jetbrains.kotlin.search import com.intellij.openapi.util.io.FileUtil +import com.intellij.psi.PsiModifierListOwner import com.intellij.psi.impl.java.stubs.PsiJavaFileStub -import com.intellij.psi.search.searches.AnnotatedMembersSearch +import com.intellij.psi.search.searches.AnnotatedElementsSearch import com.intellij.testFramework.LightProjectDescriptor import junit.framework.TestCase import org.jetbrains.kotlin.asJava.builder.LightClassConstructionContext @@ -40,7 +41,14 @@ abstract class AbstractAnnotatedMembersSearchTest : AbstractSearcherTest() { PsiBasedClassResolver.trueHits.set(0) PsiBasedClassResolver.falseHits.set(0) - AbstractSearcherTest.checkResult(path, AnnotatedMembersSearch.search(psiClass, projectScope)) + AbstractSearcherTest.checkResult( + path, + AnnotatedElementsSearch.searchElements( + psiClass, + projectScope, + PsiModifierListOwner::class.java + ) + ) val optimizedTrue = InTextDirectivesUtils.getPrefixedInt(fileText, "// OPTIMIZED_TRUE:") if (optimizedTrue != null) { diff --git a/idea/tests/org/jetbrains/kotlin/search/AnnotatedMembersSearchTestGenerated.java b/idea/tests/org/jetbrains/kotlin/search/AnnotatedMembersSearchTestGenerated.java index e4819f28d4e..40079109707 100644 --- a/idea/tests/org/jetbrains/kotlin/search/AnnotatedMembersSearchTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/search/AnnotatedMembersSearchTestGenerated.java @@ -54,6 +54,11 @@ public class AnnotatedMembersSearchTestGenerated extends AbstractAnnotatedMember runTest("idea/testData/search/annotations/testAnnotationsOnFunction.kt"); } + @TestMetadata("testAnnotationsOnPropertiesAndParameters.kt") + public void testTestAnnotationsOnPropertiesAndParameters() throws Exception { + runTest("idea/testData/search/annotations/testAnnotationsOnPropertiesAndParameters.kt"); + } + @TestMetadata("testAnnotationsWithParameters.kt") public void testTestAnnotationsWithParameters() throws Exception { runTest("idea/testData/search/annotations/testAnnotationsWithParameters.kt");