From 20b93507abb94a9d3f9eec14df364738c2e5365e Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 25 Jun 2020 15:59:49 +0300 Subject: [PATCH] FIR IDE: use symbols for reference resolve --- .../FunctionCallHighlightingVisitor.kt | 6 +- .../frontend/api/KtSymbolBasedReference.kt | 24 ++++++ .../kotlin/idea/references/FirKtReference.kt | 6 +- .../references/FirReferenceResolveHelper.kt | 82 +++++++++++-------- .../idea/references/FirSimpleNameReference.kt | 7 +- ...estructuringDeclarationReferenceFirImpl.kt | 14 ++-- .../references/KtForLoopInReferenceFirImpl.kt | 18 ++-- .../KtInvokeFunctionReferenceFirImpl.kt | 5 +- ...opertyDelegationMethodsReferenceFirImpl.kt | 14 ++-- 9 files changed, 112 insertions(+), 64 deletions(-) create mode 100644 idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/KtSymbolBasedReference.kt diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/highlighter/visitors/FunctionCallHighlightingVisitor.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/highlighter/visitors/FunctionCallHighlightingVisitor.kt index ff6da658f97..36b2ea7fbe3 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/highlighter/visitors/FunctionCallHighlightingVisitor.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/highlighter/visitors/FunctionCallHighlightingVisitor.kt @@ -10,10 +10,10 @@ import com.intellij.openapi.editor.colors.TextAttributesKey import org.jetbrains.kotlin.idea.frontend.api.* import org.jetbrains.kotlin.idea.frontend.api.symbols.KtAnonymousFunctionSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtConstructorSymbol -import org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionSymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbolKind import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration import org.jetbrains.kotlin.serialization.deserialization.KOTLIN_SUSPEND_BUILT_IN_FUNCTION_FQ_NAME import org.jetbrains.kotlin.idea.highlighter.KotlinHighlightingColors as Colors @@ -30,7 +30,7 @@ internal class FunctionCallHighlightingVisitor( analysisSession.resolveCall(expression) ?.takeIf { callInfo -> // ignore arithmetic-like operator calls - (callInfo.targetFunction as? KtNamedFunction)?.hasModifier(KtTokens.OPERATOR_KEYWORD) != true + (callInfo.targetFunction as? KtFunctionSymbol)?.isOperator != true } ?.let { callInfo -> getTextAttributesForCal(callInfo)?.let { attributes -> diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/KtSymbolBasedReference.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/KtSymbolBasedReference.kt new file mode 100644 index 00000000000..fc5423ce67b --- /dev/null +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/KtSymbolBasedReference.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.frontend.api + +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol +import org.jetbrains.kotlin.idea.references.KtReference +import org.jetbrains.kotlin.idea.references.KtSimpleReference + +interface KtSymbolBasedReference : KtReference { + fun resolveToSymbols(analysisSession: FrontendAnalysisSession): Collection +} + +fun KtReference.resolveToSymbols(analysisSession: FrontendAnalysisSession): Collection { + check(this is KtSymbolBasedReference) { "To get reference symbol the one should be KtSymbolBasedReference" } + return resolveToSymbols(analysisSession) +} + +fun KtSimpleReference<*>.resolveToSymbol(analysisSession: FrontendAnalysisSession): KtSymbol? { + check(this is KtSymbolBasedReference) { "To get reference symbol the one should be KtSymbolBasedReference" } + return resolveToSymbols(analysisSession).singleOrNull() +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirKtReference.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirKtReference.kt index 08815363797..3cee9511285 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirKtReference.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirKtReference.kt @@ -6,13 +6,13 @@ package org.jetbrains.kotlin.idea.references import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.idea.frontend.api.fir.FirAnalysisSession +import org.jetbrains.kotlin.idea.frontend.api.FrontendAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol interface FirKtReference : KtReference { - fun resolveToSymbols(analysisSession: FirAnalysisSession): Collection + fun resolveToSymbols(analysisSession: FrontendAnalysisSession): Collection - fun getResolvedToPsi(analysisSession: FirAnalysisSession): Collection = + fun getResolvedToPsi(analysisSession: FrontendAnalysisSession): Collection = resolveToSymbols(analysisSession).mapNotNull(KtSymbol::psi) override val resolver get() = KtFirReferenceResolver diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt index af5079199c2..2dfbb860233 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.idea.references -import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty @@ -19,34 +18,42 @@ import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.types.ConeLookupTagBasedType import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.idea.fir.* +import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder +import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType -object FirReferenceResolveHelper { - fun FirResolvedTypeRef.toTargetPsi(session: FirSession): PsiElement? { +internal object FirReferenceResolveHelper { + fun FirResolvedTypeRef.toTargetSymbol(session: FirSession, symbolBuilder: KtSymbolByFirBuilder): KtSymbol? { val type = type as? ConeLookupTagBasedType ?: return null - return (type.lookupTag.toSymbol(session) as? AbstractFirBasedSymbol<*>)?.fir?.findPsi(session) + val symbol = type.lookupTag.toSymbol(session) as? AbstractFirBasedSymbol<*> + return symbol?.fir?.buildSymbol(symbolBuilder) } - fun ClassId.toTargetPsi(session: FirSession, calleeReference: FirReference? = null): PsiElement? { + private fun ClassId.toTargetPsi( + session: FirSession, + symbolBuilder: KtSymbolByFirBuilder, + calleeReference: FirReference? = null + ): KtSymbol? { val classLikeDeclaration = ConeClassLikeLookupTagImpl(this).toSymbol(session)?.fir if (classLikeDeclaration is FirRegularClass) { if (calleeReference is FirResolvedNamedReference) { val callee = calleeReference.resolvedSymbol.fir as? FirCallableMemberDeclaration // TODO: check callee owner directly? if (callee !is FirConstructor && callee?.isStatic != true) { - classLikeDeclaration.companionObject?.let { return it.findPsi(session) } + classLikeDeclaration.companionObject?.let { return it.buildSymbol(symbolBuilder) } } } } - return classLikeDeclaration?.findPsi(session) + return classLikeDeclaration?.buildSymbol(symbolBuilder) } - fun FirReference.toTargetPsi(session: FirSession): PsiElement? { + fun FirReference.toTargetSymbol(session: FirSession, symbolBuilder: KtSymbolByFirBuilder): KtSymbol? { return when (this) { is FirResolvedNamedReference -> { - val targetFir = when (val symbol = resolvedSymbol) { + val fir = when (val symbol = resolvedSymbol) { is SyntheticPropertySymbol -> { val syntheticProperty = symbol.fir as FirSyntheticProperty if (syntheticProperty.getter.delegate.symbol.callableId == symbol.accessorId) { @@ -55,18 +62,18 @@ object FirReferenceResolveHelper { syntheticProperty.setter!!.delegate } } - else -> symbol.fir + else -> symbol.fir as? FirDeclaration } - targetFir.findPsi(session) + fir?.buildSymbol(symbolBuilder) } is FirResolvedCallableReference -> { - resolvedSymbol.fir.findPsi(session) + resolvedSymbol.fir.buildSymbol(symbolBuilder) } is FirThisReference -> { - boundSymbol?.fir?.findPsi(session) + boundSymbol?.fir?.buildSymbol(symbolBuilder) } is FirSuperReference -> { - (superTypeRef as? FirResolvedTypeRef)?.toTargetPsi(session) + (superTypeRef as? FirResolvedTypeRef)?.toTargetSymbol(session, symbolBuilder) } else -> { null @@ -74,7 +81,10 @@ object FirReferenceResolveHelper { } } - internal fun resolveSimpleNameReference(ref: KtSimpleNameReferenceFirImpl): Collection { + internal fun resolveSimpleNameReference( + ref: KtSimpleNameReferenceFirImpl, + symbolBuilder: KtSymbolByFirBuilder + ): Collection { val expression = ref.expression val fir = expression.getOrBuildFir() val session = expression.session @@ -91,10 +101,10 @@ object FirReferenceResolveHelper { // } (fir.dispatchReceiver as FirQualifiedAccessExpression).calleeReference } else fir.calleeReference - return listOfNotNull(calleeReference.toTargetPsi(session)) + return listOfNotNull(calleeReference.toTargetSymbol(session, symbolBuilder)) } is FirResolvedTypeRef -> { - return listOfNotNull(fir.toTargetPsi(session)) + return listOfNotNull(fir.toTargetSymbol(session, symbolBuilder)) } is FirResolvedQualifier -> { val classId = fir.classId ?: return emptyList() @@ -109,15 +119,15 @@ object FirReferenceResolveHelper { } val parentFir = selectorExpression.getOrBuildFir() if (parentFir is FirQualifiedAccess) { - return listOfNotNull(classId.toTargetPsi(session, parentFir.calleeReference)) + return listOfNotNull(classId.toTargetPsi(session, symbolBuilder, parentFir.calleeReference)) } parent = parent.parent as? KtDotQualifiedExpression } - return listOfNotNull(classId.toTargetPsi(session)) + return listOfNotNull(classId.toTargetPsi(session, symbolBuilder)) } is FirAnnotationCall -> { val type = fir.typeRef as? FirResolvedTypeRef ?: return emptyList() - return listOfNotNull(type.toTargetPsi(session)) + return listOfNotNull(type.toTargetSymbol(session, symbolBuilder)) } is FirResolvedImport -> { var parent = expression.parent @@ -126,30 +136,36 @@ object FirReferenceResolveHelper { // Special: package reference in the middle of import directive // import a.b.c.SomeClass // TODO: return reference to PsiPackage - return listOf(expression) +// return listOf(expression) + return emptyList() } parent = parent.parent } val classId = fir.resolvedClassId if (classId != null) { - return listOfNotNull(classId.toTargetPsi(session)) + return listOfNotNull(classId.toTargetPsi(session, symbolBuilder)) } val name = fir.importedName ?: return emptyList() val symbolProvider = session.firSymbolProvider - return symbolProvider.getTopLevelCallableSymbols(fir.packageFqName, name) - .mapNotNull { it.fir.findPsi(session) } + - listOfNotNull( - symbolProvider - .getClassLikeSymbolByFqName(ClassId(fir.packageFqName, name)) - ?.fir?.findPsi(session) - ) + + @OptIn(ExperimentalStdlibApi::class) + return buildList { + symbolProvider.getTopLevelCallableSymbols(fir.packageFqName, name) + .mapTo(this) { it.fir.buildSymbol(symbolBuilder) } + symbolProvider + .getClassLikeSymbolByFqName(ClassId(fir.packageFqName, name)) + ?.fir + ?.buildSymbol(symbolBuilder) + ?.let(::add) + } } is FirFile -> { if (expression.getNonStrictParentOfType() != null) { // Special: package reference in the middle of package directive - return listOf(expression) + return emptyList() +// return listOf(expression) } - return listOfNotNull(fir.findPsi(session)) + return listOf(symbolBuilder.buildSymbol(fir)) } is FirArrayOfCall -> { // We can't yet find PsiElement for arrayOf, intArrayOf, etc. @@ -157,7 +173,7 @@ object FirReferenceResolveHelper { } is FirReturnExpression -> { return if (expression is KtLabelReferenceExpression) { - listOfNotNull(fir.target.labeledElement.findPsi(session)) + listOf(fir.target.labeledElement.buildSymbol(symbolBuilder)) } else emptyList() } is FirErrorNamedReference -> { @@ -182,7 +198,7 @@ object FirReferenceResolveHelper { unresolvedCounter-- classId = classId?.outerClassId } - return listOfNotNull(classId?.toTargetPsi(session)) + return listOfNotNull(classId?.toTargetPsi(session, symbolBuilder)) } parent = parent.parent as? KtDotQualifiedExpression unresolvedCounter++ diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirSimpleNameReference.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirSimpleNameReference.kt index c6ee60de467..4a5e4033510 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirSimpleNameReference.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirSimpleNameReference.kt @@ -6,7 +6,9 @@ package org.jetbrains.kotlin.idea.references import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.idea.frontend.api.FrontendAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.FirAnalysisSession +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtImportAlias import org.jetbrains.kotlin.psi.KtSimpleNameExpression @@ -14,7 +16,10 @@ import org.jetbrains.kotlin.psi.KtSimpleNameExpression internal class KtSimpleNameReferenceFirImpl( expression: KtSimpleNameExpression ) : KtSimpleNameReference(expression), FirKtReference { - override fun getResolvedToPsi(analysisSession: FirAnalysisSession) = FirReferenceResolveHelper.resolveSimpleNameReference(this) + override fun resolveToSymbols(analysisSession: FrontendAnalysisSession): Collection { + check(analysisSession is FirAnalysisSession) + return FirReferenceResolveHelper.resolveSimpleNameReference(this, analysisSession.firSymbolBuilder) + } override fun doCanBeReferenceTo(candidateTarget: PsiElement): Boolean { return true // TODO diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtDestructuringDeclarationReferenceFirImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtDestructuringDeclarationReferenceFirImpl.kt index 8ef0199d634..abad4006d95 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtDestructuringDeclarationReferenceFirImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtDestructuringDeclarationReferenceFirImpl.kt @@ -5,11 +5,14 @@ package org.jetbrains.kotlin.idea.references -import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.expressions.FirComponentCall -import org.jetbrains.kotlin.idea.fir.* +import org.jetbrains.kotlin.idea.fir.getCalleeSymbol +import org.jetbrains.kotlin.idea.fir.getOrBuildFirSafe +import org.jetbrains.kotlin.idea.frontend.api.FrontendAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.FirAnalysisSession +import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.psi.KtDestructuringDeclarationEntry class KtDestructuringDeclarationReferenceFirImpl( @@ -17,11 +20,10 @@ class KtDestructuringDeclarationReferenceFirImpl( ) : KtDestructuringDeclarationReference(element), FirKtReference { override fun canRename(): Boolean = false //todo - override fun getResolvedToPsi( - analysisSession: FirAnalysisSession - ): Collection { + override fun resolveToSymbols(analysisSession: FrontendAnalysisSession): Collection { + check(analysisSession is FirAnalysisSession) val fir = expression.getOrBuildFirSafe() ?: return emptyList() val componentFunctionSymbol = (fir.initializer as? FirComponentCall)?.getCalleeSymbol() ?: return emptyList() - return listOfNotNull(componentFunctionSymbol.fir.findPsi(element.project)) + return listOfNotNull(componentFunctionSymbol.fir.buildSymbol(analysisSession.firSymbolBuilder)) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtForLoopInReferenceFirImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtForLoopInReferenceFirImpl.kt index 9d9f008b8a4..a100f2035a3 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtForLoopInReferenceFirImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtForLoopInReferenceFirImpl.kt @@ -5,21 +5,22 @@ package org.jetbrains.kotlin.idea.references -import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirWhileLoop -import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.getOrBuildFirSafe import org.jetbrains.kotlin.idea.fir.getResolvedSymbolOfNameReference +import org.jetbrains.kotlin.idea.frontend.api.FrontendAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.FirAnalysisSession +import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.psi.KtForExpression open class KtForLoopInReferenceFirImpl(expression: KtForExpression) : KtForLoopInReference(expression), FirKtReference { - override fun getResolvedToPsi( - analysisSession: FirAnalysisSession - ): Collection { + + override fun resolveToSymbols(analysisSession: FrontendAnalysisSession): Collection { + check(analysisSession is FirAnalysisSession) val firLoop = expression.getOrBuildFirSafe() ?: return emptyList() val condition = firLoop.condition as? FirFunctionCall val iterator = run { @@ -28,11 +29,10 @@ open class KtForLoopInReferenceFirImpl(expression: KtForExpression) : KtForLoopI } val hasNext = condition?.calleeReference?.getResolvedSymbolOfNameReference() val next = (firLoop.block.statements.firstOrNull() as? FirProperty?)?.getInitializerFunctionCall() - val project = element.project return listOfNotNull( - iterator?.fir?.findPsi(project), - hasNext?.fir?.findPsi(project), - next?.fir?.findPsi(project), + iterator?.fir?.buildSymbol(analysisSession.firSymbolBuilder), + hasNext?.fir?.buildSymbol(analysisSession.firSymbolBuilder), + next?.fir?.buildSymbol(analysisSession.firSymbolBuilder), ) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtInvokeFunctionReferenceFirImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtInvokeFunctionReferenceFirImpl.kt index f419b55f484..139f2090c1a 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtInvokeFunctionReferenceFirImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtInvokeFunctionReferenceFirImpl.kt @@ -5,9 +5,10 @@ package org.jetbrains.kotlin.idea.references -import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.idea.frontend.api.FrontendAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.VariableAsFunctionLikeCallInfo import org.jetbrains.kotlin.idea.frontend.api.fir.FirAnalysisSession +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtExpression @@ -16,7 +17,7 @@ class KtInvokeFunctionReferenceFirImpl(expression: KtCallExpression) : KtInvokeF TODO("Not yet implemented") } - override fun getResolvedToPsi(analysisSession: FirAnalysisSession): Collection { + override fun resolveToSymbols(analysisSession: FrontendAnalysisSession): Collection { val call = analysisSession.resolveCall(expression) ?: return emptyList() if (call is VariableAsFunctionLikeCallInfo) { return listOf(call.invokeFunction) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtPropertyDelegationMethodsReferenceFirImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtPropertyDelegationMethodsReferenceFirImpl.kt index 17d60187d1b..0744bef7bfc 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtPropertyDelegationMethodsReferenceFirImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtPropertyDelegationMethodsReferenceFirImpl.kt @@ -5,31 +5,31 @@ package org.jetbrains.kotlin.idea.references -import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirReturnExpression import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.idea.fir.* +import org.jetbrains.kotlin.idea.frontend.api.FrontendAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.FirAnalysisSession +import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtPropertyDelegate class KtPropertyDelegationMethodsReferenceFirImpl( element: KtPropertyDelegate ) : KtPropertyDelegationMethodsReference(element), FirKtReference { - override fun getResolvedToPsi( - analysisSession: FirAnalysisSession - ): Collection { + override fun resolveToSymbols(analysisSession: FrontendAnalysisSession): Collection { + check(analysisSession is FirAnalysisSession) val property = (expression.parent as? KtElement)?.getOrBuildFirSafe() ?: return emptyList() if (property.delegate == null) return emptyList() val getValueSymbol = (property.getter?.singleStatementOfType()?.result as? FirFunctionCall)?.getCalleeSymbol() val setValueSymbol = property.setter?.singleStatementOfType()?.getCalleeSymbol() - val project = element.project return listOfNotNull( - getValueSymbol?.fir?.findPsi(project), - setValueSymbol?.fir?.findPsi(project) + getValueSymbol?.fir?.buildSymbol(analysisSession.firSymbolBuilder), + setValueSymbol?.fir?.buildSymbol(analysisSession.firSymbolBuilder) ) }