[Analysis API FIR] implement SyntheticPropertyAccessorReference.canBeReferenceTo for fir reference

it might improve find usages performance

^KTIJ-24696
This commit is contained in:
Ilya Kirillov
2023-02-17 18:33:16 +01:00
committed by Space Team
parent 8d587322e9
commit 78d0749235
2 changed files with 11 additions and 13 deletions
@@ -5,22 +5,16 @@
package org.jetbrains.kotlin.references.fe10
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiMethod
import com.intellij.util.SmartList
import org.jetbrains.kotlin.references.fe10.base.KtFe10Reference
import org.jetbrains.kotlin.asJava.canHaveSyntheticGetter
import org.jetbrains.kotlin.asJava.canHaveSyntheticSetter
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.idea.references.SyntheticPropertyAccessorReference
import org.jetbrains.kotlin.idea.references.readWriteAccess
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtImportAlias
import org.jetbrains.kotlin.psi.KtNameReferenceExpression
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.bindingContextUtil.getReferenceTargets
import org.jetbrains.kotlin.resolve.references.ReferenceAccess
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
import org.jetbrains.kotlin.utils.addIfNotNull
@@ -29,13 +23,6 @@ class Fe10SyntheticPropertyAccessorReference(
getter: Boolean
) : SyntheticPropertyAccessorReference(expression, getter), KtFe10Reference {
override fun canBeReferenceTo(candidateTarget: PsiElement): Boolean {
if (candidateTarget !is PsiMethod || !isAccessorName(candidateTarget.name)) return false
if (getter && !candidateTarget.canHaveSyntheticGetter || !getter && !candidateTarget.canHaveSyntheticSetter) return false
if (!getter && expression.readWriteAccess(true) == ReferenceAccess.READ) return false
return true
}
override fun getTargetDescriptors(context: BindingContext): Collection<DeclarationDescriptor> {
val descriptors = expression.getReferenceTargets(context)
if (descriptors.none { it is SyntheticJavaPropertyDescriptor }) return emptyList()
@@ -7,8 +7,12 @@ package org.jetbrains.kotlin.idea.references
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiMethod
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtNameReferenceExpression
import org.jetbrains.kotlin.resolve.references.ReferenceAccess
import org.jetbrains.kotlin.asJava.canHaveSyntheticSetter
import org.jetbrains.kotlin.asJava.canHaveSyntheticGetter
abstract class SyntheticPropertyAccessorReference(
expression: KtNameReferenceExpression,
@@ -21,6 +25,13 @@ abstract class SyntheticPropertyAccessorReference(
return name.startsWith("set")
}
override fun canBeReferenceTo(candidateTarget: PsiElement): Boolean {
if (candidateTarget !is PsiMethod || !isAccessorName(candidateTarget.name)) return false
if (getter && !candidateTarget.canHaveSyntheticGetter || !getter && !candidateTarget.canHaveSyntheticSetter) return false
if (!getter && expression.readWriteAccess(true) == ReferenceAccess.READ) return false
return true
}
override fun getRangeInElement() = TextRange(0, expression.textLength)
override fun canRename() = true