diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirSimpleNameReference.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirSimpleNameReference.kt index 5b34097ccdb..278de6c9cc1 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirSimpleNameReference.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirSimpleNameReference.kt @@ -9,10 +9,11 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirNamedClassOrObjectSymbol +import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSyntheticJavaPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtClassKind import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.resolve.references.ReferenceAccess internal class KtFirSimpleNameReference( expression: KtSimpleNameExpression @@ -43,6 +44,23 @@ internal class KtFirSimpleNameReference( return fixUpAnnotationCallResolveToCtor(results) } + override fun getResolvedToPsi(analysisSession: KtAnalysisSession): Collection = with(analysisSession) { + val referenceTargetSymbols = resolveToSymbols() + val psiOfReferenceTarget = super.getResolvedToPsi(analysisSession, referenceTargetSymbols) + if (psiOfReferenceTarget.isNotEmpty()) return psiOfReferenceTarget + referenceTargetSymbols.flatMap { symbol -> + when (symbol) { + is KtFirSyntheticJavaPropertySymbol -> + when (expression.readWriteAccess(useResolveForReadWrite = true)) { + ReferenceAccess.READ -> listOfNotNull(symbol.javaGetterSymbol.psi) + ReferenceAccess.WRITE -> listOfNotNull(symbol.javaSetterSymbol?.psi) + ReferenceAccess.READ_WRITE -> listOfNotNull(symbol.javaGetterSymbol.psi, symbol.javaSetterSymbol?.psi) + } + else -> listOfNotNull(symbol.psi) + } + } + } + override fun canBeReferenceTo(candidateTarget: PsiElement): Boolean { return true // TODO } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirReference.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirReference.kt index 0685c060801..6e57a9c6e38 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirReference.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirReference.kt @@ -15,14 +15,20 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin interface KtFirReference : KtReference, KtSymbolBasedReference { - fun getResolvedToPsi(analysisSession: KtAnalysisSession): Collection = with(analysisSession) { - resolveToSymbols().flatMap { symbol -> - when (symbol) { - is KtFirSymbol<*> -> getPsiDeclarations(symbol) - else -> listOfNotNull(symbol.psi) + fun getResolvedToPsi(analysisSession: KtAnalysisSession, referenceTargetSymbols: Collection): Collection = + with(analysisSession) { + referenceTargetSymbols.flatMap { symbol -> + when (symbol) { + is KtFirSymbol<*> -> getPsiDeclarations(symbol) + else -> listOfNotNull(symbol.psi) + } } } - } + + fun getResolvedToPsi(analysisSession: KtAnalysisSession): Collection = + with(analysisSession) { + getResolvedToPsi(analysisSession, resolveToSymbols()) + } private fun KtAnalysisSession.getPsiDeclarations(symbol: KtFirSymbol<*>): Collection { val intersectionOverriddenSymbolsOrSingle = when {