Making KotlinAnnotatedElementsSearcher able to search for parameters (KT-27794)

This commit is contained in:
Nicolay Mitropolsky
2019-02-13 22:24:18 +03:00
parent 2b9cf06c3f
commit 76bdfddfea
7 changed files with 72 additions and 13 deletions
@@ -57,14 +57,17 @@ open class KtLightMethodImpl protected constructor(
}
}
protected open fun buildParametersForList(): List<PsiParameter> =
clsDelegate.parameterList.parameters.mapIndexed { index, clsParameter ->
protected open fun buildParametersForList(): List<PsiParameter> {
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() }
@@ -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<KtParameter, PsiParameter> {
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
@@ -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<PsiModifierListOwner, Anno
LightClassUtil.getLightClassPropertyMethods(declaration).all { consumer.process(it) }
}
is KtParameter -> {
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
}
}
@@ -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
@@ -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());
}
@@ -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) {
@@ -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");