[Analysis API FIR] implement SyntheticPropertyAccessorReference.canBeReferenceTo for fir reference
it might improve find usages performance ^KTIJ-24696
This commit is contained in:
committed by
Space Team
parent
8d587322e9
commit
78d0749235
-13
@@ -5,22 +5,16 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.references.fe10
|
package org.jetbrains.kotlin.references.fe10
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
|
||||||
import com.intellij.psi.PsiMethod
|
|
||||||
import com.intellij.util.SmartList
|
import com.intellij.util.SmartList
|
||||||
import org.jetbrains.kotlin.references.fe10.base.KtFe10Reference
|
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.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.idea.references.SyntheticPropertyAccessorReference
|
import org.jetbrains.kotlin.idea.references.SyntheticPropertyAccessorReference
|
||||||
import org.jetbrains.kotlin.idea.references.readWriteAccess
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.KtImportAlias
|
import org.jetbrains.kotlin.psi.KtImportAlias
|
||||||
import org.jetbrains.kotlin.psi.KtNameReferenceExpression
|
import org.jetbrains.kotlin.psi.KtNameReferenceExpression
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.bindingContextUtil.getReferenceTargets
|
import org.jetbrains.kotlin.resolve.bindingContextUtil.getReferenceTargets
|
||||||
import org.jetbrains.kotlin.resolve.references.ReferenceAccess
|
|
||||||
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
|
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
|
||||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||||
|
|
||||||
@@ -29,13 +23,6 @@ class Fe10SyntheticPropertyAccessorReference(
|
|||||||
getter: Boolean
|
getter: Boolean
|
||||||
) : SyntheticPropertyAccessorReference(expression, getter), KtFe10Reference {
|
) : 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> {
|
override fun getTargetDescriptors(context: BindingContext): Collection<DeclarationDescriptor> {
|
||||||
val descriptors = expression.getReferenceTargets(context)
|
val descriptors = expression.getReferenceTargets(context)
|
||||||
if (descriptors.none { it is SyntheticJavaPropertyDescriptor }) return emptyList()
|
if (descriptors.none { it is SyntheticJavaPropertyDescriptor }) return emptyList()
|
||||||
|
|||||||
+11
@@ -7,8 +7,12 @@ package org.jetbrains.kotlin.idea.references
|
|||||||
|
|
||||||
import com.intellij.openapi.util.TextRange
|
import com.intellij.openapi.util.TextRange
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
|
import com.intellij.psi.PsiMethod
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.KtNameReferenceExpression
|
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(
|
abstract class SyntheticPropertyAccessorReference(
|
||||||
expression: KtNameReferenceExpression,
|
expression: KtNameReferenceExpression,
|
||||||
@@ -21,6 +25,13 @@ abstract class SyntheticPropertyAccessorReference(
|
|||||||
return name.startsWith("set")
|
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 getRangeInElement() = TextRange(0, expression.textLength)
|
||||||
|
|
||||||
override fun canRename() = true
|
override fun canRename() = true
|
||||||
|
|||||||
Reference in New Issue
Block a user