FIR find usage: separate FirSimpleNameReference objects for read/write
FirSimpleNameReference class handles the references to the Java synthetic property. It causes an issue in `processReference(..)` method of `MethodTextOccurrenceProcessor` when the property is used by read/write. Since read/write has two results of the reference resolution i.e., getter for read and setter for write, `ref.solve()` in the method returns `null` because it uses `resolve()` method in PsiPolyVariantReferenceBase that returns null when it has multiple results. This commit separates FirSimpleNameReference objects for read/write to fix the issue.
This commit is contained in:
committed by
Ilya Kirillov
parent
f7a2889a40
commit
7a3e90f907
+4
-6
@@ -16,7 +16,8 @@ import org.jetbrains.kotlin.psi.*
|
|||||||
import org.jetbrains.kotlin.resolve.references.ReferenceAccess
|
import org.jetbrains.kotlin.resolve.references.ReferenceAccess
|
||||||
|
|
||||||
internal class KtFirSimpleNameReference(
|
internal class KtFirSimpleNameReference(
|
||||||
expression: KtSimpleNameExpression
|
expression: KtSimpleNameExpression,
|
||||||
|
val isRead: Boolean,
|
||||||
) : KtSimpleNameReference(expression), KtFirReference {
|
) : KtSimpleNameReference(expression), KtFirReference {
|
||||||
|
|
||||||
private val isAnnotationCall: Boolean
|
private val isAnnotationCall: Boolean
|
||||||
@@ -51,11 +52,8 @@ internal class KtFirSimpleNameReference(
|
|||||||
referenceTargetSymbols.flatMap { symbol ->
|
referenceTargetSymbols.flatMap { symbol ->
|
||||||
when (symbol) {
|
when (symbol) {
|
||||||
is KtFirSyntheticJavaPropertySymbol ->
|
is KtFirSyntheticJavaPropertySymbol ->
|
||||||
when (expression.readWriteAccess(useResolveForReadWrite = true)) {
|
if (isRead) listOfNotNull(symbol.javaGetterSymbol.psi)
|
||||||
ReferenceAccess.READ -> listOfNotNull(symbol.javaGetterSymbol.psi)
|
else listOfNotNull(symbol.javaSetterSymbol?.psi)
|
||||||
ReferenceAccess.WRITE -> listOfNotNull(symbol.javaSetterSymbol?.psi)
|
|
||||||
ReferenceAccess.READ_WRITE -> listOfNotNull(symbol.javaGetterSymbol.psi, symbol.javaSetterSymbol?.psi)
|
|
||||||
}
|
|
||||||
else -> listOfNotNull(symbol.psi)
|
else -> listOfNotNull(symbol.psi)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-1
@@ -5,10 +5,14 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.references
|
package org.jetbrains.kotlin.idea.references
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiReference
|
||||||
|
import org.jetbrains.kotlin.psi.KtNameReferenceExpression
|
||||||
|
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
|
||||||
|
import org.jetbrains.kotlin.resolve.references.ReferenceAccess
|
||||||
|
|
||||||
class KotlinFirReferenceContributor : KotlinReferenceProviderContributor {
|
class KotlinFirReferenceContributor : KotlinReferenceProviderContributor {
|
||||||
override fun registerReferenceProviders(registrar: KotlinPsiReferenceRegistrar) {
|
override fun registerReferenceProviders(registrar: KotlinPsiReferenceRegistrar) {
|
||||||
with(registrar) {
|
with(registrar) {
|
||||||
registerProvider(factory = ::KtFirSimpleNameReference)
|
|
||||||
registerProvider(factory = ::KtFirForLoopInReference)
|
registerProvider(factory = ::KtFirForLoopInReference)
|
||||||
registerProvider(factory = ::KtFirInvokeFunctionReference)
|
registerProvider(factory = ::KtFirInvokeFunctionReference)
|
||||||
registerProvider(factory = ::KtFirPropertyDelegationMethodsReference)
|
registerProvider(factory = ::KtFirPropertyDelegationMethodsReference)
|
||||||
@@ -16,6 +20,17 @@ class KotlinFirReferenceContributor : KotlinReferenceProviderContributor {
|
|||||||
registerProvider(factory = ::KtFirArrayAccessReference)
|
registerProvider(factory = ::KtFirArrayAccessReference)
|
||||||
registerProvider(factory = ::KtFirConstructorDelegationReference)
|
registerProvider(factory = ::KtFirConstructorDelegationReference)
|
||||||
registerProvider(factory = ::KtFirCollectionLiteralReference)
|
registerProvider(factory = ::KtFirCollectionLiteralReference)
|
||||||
|
|
||||||
|
registerMultiProvider<KtSimpleNameExpression> { nameReferenceExpression ->
|
||||||
|
when (nameReferenceExpression.readWriteAccess(useResolveForReadWrite = true)) {
|
||||||
|
ReferenceAccess.READ -> arrayOf(KtFirSimpleNameReference(nameReferenceExpression, isRead = true))
|
||||||
|
ReferenceAccess.WRITE -> arrayOf(KtFirSimpleNameReference(nameReferenceExpression, isRead = false))
|
||||||
|
ReferenceAccess.READ_WRITE -> arrayOf(
|
||||||
|
KtFirSimpleNameReference(nameReferenceExpression, isRead = true),
|
||||||
|
KtFirSimpleNameReference(nameReferenceExpression, isRead = false),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user