[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
|
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.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.getContainingFile
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
|
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.diagnostics.ConeDestructuringDeclarationsOnTopLevel
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
|
||||||
class FirDesignationWithFile(
|
class FirDesignationWithFile(
|
||||||
path: List<FirRegularClass>,
|
path: List<FirRegularClass>,
|
||||||
@@ -113,6 +121,7 @@ private fun collectDesignationPathWithContainingClass(target: FirDeclaration, co
|
|||||||
fun resolveChunk(classId: ClassId): FirRegularClass {
|
fun resolveChunk(classId: ClassId): FirRegularClass {
|
||||||
val declaration = useSiteSession.firProvider.getFirClassifierByFqName(classId)
|
val declaration = useSiteSession.firProvider.getFirClassifierByFqName(classId)
|
||||||
?: useSiteSession.nullableJavaSymbolProvider?.getClassLikeSymbolByClassId(classId)?.fir
|
?: useSiteSession.nullableJavaSymbolProvider?.getClassLikeSymbolByClassId(classId)?.fir
|
||||||
|
?: findNearClass(classId, target)
|
||||||
|
|
||||||
check(declaration != null)
|
check(declaration != null)
|
||||||
|
|
||||||
@@ -127,6 +136,11 @@ private fun collectDesignationPathWithContainingClass(target: FirDeclaration, co
|
|||||||
return chain.toMutableList().also { it.reverse() }
|
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 =
|
fun FirElementWithResolvePhase.collectDesignation(firFile: FirFile): FirDesignationWithFile =
|
||||||
tryCollectDesignation(firFile) ?: buildErrorWithAttachment("No designation of local declaration") {
|
tryCollectDesignation(firFile) ?: buildErrorWithAttachment("No designation of local declaration") {
|
||||||
withFirEntry("firFile", firFile)
|
withFirEntry("firFile", firFile)
|
||||||
|
|||||||
Reference in New Issue
Block a user