From 10d6583d87273b346812ce1662d2d7f19d11ca88 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 13 Jan 2023 18:38:16 +0900 Subject: [PATCH] [LL API] Add fallback for cases when a containing class cannot be found In some cases, 'LLFirProvider' doesn't return the existing class, e.g. when the class is inside the 'kotlin.' package but when the '-Xallow-kotlin-package' flag is not passed. This fixes the test 'DiagnosisCompilerTestFE10TestdataTestGenerated. TestsWithStdLib.testInaccessibleInternalClass()'.' --- .../low/level/api/fir/api/FirDesignation.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 eed051e6b4c..dcf86ebf07a 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 @@ -5,7 +5,13 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.api +import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirElementBuilder +import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.FileBasedKotlinDeclarationProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.nullableJavaSymbolProvider +import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirResolvableModuleSession +import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.llFirSession +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.FirElementFinder +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.containingKtFileIfAny import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getContainingFile import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment @@ -19,6 +25,8 @@ 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.name.ClassId +import org.jetbrains.kotlin.psi.KtClassOrObject +import org.jetbrains.kotlin.psi.KtFile class FirDesignationWithFile( path: List, @@ -113,6 +121,7 @@ private fun collectDesignationPathWithContainingClass(target: FirDeclaration, co fun resolveChunk(classId: ClassId): FirRegularClass { val declaration = useSiteSession.firProvider.getFirClassifierByFqName(classId) ?: useSiteSession.nullableJavaSymbolProvider?.getClassLikeSymbolByClassId(classId)?.fir + ?: findNearClass(classId, target) check(declaration != null) @@ -127,6 +136,11 @@ private fun collectDesignationPathWithContainingClass(target: FirDeclaration, co return chain.toMutableList().also { it.reverse() } } +private fun findNearClass(classId: ClassId, target: FirDeclaration): FirRegularClass? { + val firFile = target.getContainingFile() ?: return null + return FirElementFinder.findClassifierWithClassId(firFile, classId) as? FirRegularClass +} + fun FirElementWithResolvePhase.collectDesignation(firFile: FirFile): FirDesignationWithFile = tryCollectDesignation(firFile) ?: buildErrorWithAttachment("No designation of local declaration") { withFirEntry("firFile", firFile)