From d44253198718ed28a9a71a616c5c7c143955749e Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 17 Jan 2023 22:54:18 +0900 Subject: [PATCH] [LL API] Use session of a callable container for designation computation Synthetic callables might be created with a call-site session in which the containing class might be not found. --- .../low/level/api/fir/api/FirDesignation.kt | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt index dcf86ebf07a..0e1f097e5ac 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt @@ -19,11 +19,13 @@ import org.jetbrains.kotlin.analysis.utils.errors.checkWithAttachmentBuilder import org.jetbrains.kotlin.analysis.utils.errors.unexpectedElementError import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.* +import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.utils.isLocal import org.jetbrains.kotlin.fir.diagnostics.ConeDestructuringDeclarationsOnTopLevel import org.jetbrains.kotlin.fir.resolve.providers.firProvider +import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtFile @@ -113,10 +115,7 @@ private fun collectDesignationPathWithContainingClass(target: FirDeclaration, co return null } - val useSiteSession = when (target) { - is FirSyntheticProperty -> target.getter.moduleData.session - else -> target.moduleData.session - } + val useSiteSession = getTargetSession(target) fun resolveChunk(classId: ClassId): FirRegularClass { val declaration = useSiteSession.firProvider.getFirClassifierByFqName(classId) @@ -136,6 +135,22 @@ private fun collectDesignationPathWithContainingClass(target: FirDeclaration, co return chain.toMutableList().also { it.reverse() } } +private fun getTargetSession(target: FirDeclaration): FirSession { + if (target is FirSyntheticProperty) { + return getTargetSession(target.getter) + } + + if (target is FirCallableDeclaration) { + val containingSymbol = target.containingClassLookupTag()?.toSymbol(target.moduleData.session) + if (containingSymbol != null) { + // Synthetic declarations might have a call site session + return containingSymbol.moduleData.session + } + } + + return target.moduleData.session +} + private fun findNearClass(classId: ClassId, target: FirDeclaration): FirRegularClass? { val firFile = target.getContainingFile() ?: return null return FirElementFinder.findClassifierWithClassId(firFile, classId) as? FirRegularClass