[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:
+14
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user