[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()'.'
This commit is contained in:
Yan Zhulanow
2023-01-13 18:38:16 +09:00
committed by Space Team
parent e5cbe79027
commit 10d6583d87
@@ -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<FirRegularClass>,
@@ -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)