FIR. Fix currentFile unset in specific type resolver in some cases

This commit is contained in:
Simon Ogorodnik
2022-02-03 19:26:30 +03:00
committed by Space
parent 9943b146e9
commit 9c727e6d5d
2 changed files with 16 additions and 4 deletions
@@ -200,8 +200,11 @@ private fun createOtherScopesForNestedClassesOrCompanion(
}
fun FirRegularClass.resolveSupertypesInTheAir(session: FirSession): List<FirTypeRef> {
return FirSupertypeResolverVisitor(session, SupertypeComputationSession(), ScopeSession())
.resolveSpecificClassLikeSupertypes(this, superTypeRefs)
return FirSupertypeResolverVisitor(session, SupertypeComputationSession(), ScopeSession()).run {
withFile(session.firProvider.getFirClassifierContainerFile(this@resolveSupertypesInTheAir.symbol)) {
resolveSpecificClassLikeSupertypes(this@resolveSupertypesInTheAir, superTypeRefs)
}
}
}
open class FirSupertypeResolverVisitor(
@@ -211,7 +214,7 @@ open class FirSupertypeResolverVisitor(
private val scopeForLocalClass: PersistentList<FirScope>? = null,
private val localClassesNavigationInfo: LocalClassesNavigationInfo? = null,
private val firProviderInterceptor: FirProviderInterceptor? = null,
private var useSiteFile: FirFile? = null,
@property:PrivateForInline var useSiteFile: FirFile? = null,
containingDeclarations: List<FirDeclaration> = emptyList(),
) : FirDefaultVisitor<Unit, Any?>() {
private val supertypeGenerationExtensions = session.extensionService.supertypeGenerators
@@ -225,7 +228,8 @@ open class FirSupertypeResolverVisitor(
}
}
private inline fun <R> withFile(file: FirFile, block: () -> R): R {
@OptIn(PrivateForInline::class)
inline fun <R> withFile(file: FirFile, block: () -> R): R {
val oldFile = useSiteFile
try {
useSiteFile = file
@@ -345,6 +349,8 @@ open class FirSupertypeResolverVisitor(
val scopes = prepareScopes(classLikeDeclaration)
val transformer = FirSpecificTypeResolverTransformer(session, supertypeSupplier = supertypeComputationSession.supertypesSupplier)
@OptIn(PrivateForInline::class)
val resolvedTypesRefs = transformer.withFile(useSiteFile) {
resolveSuperTypeRefs(
transformer,
@@ -151,4 +151,10 @@ private class FirAnnotationResolveTransformer(
predicateBasedProvider.registerAnnotatedDeclaration(declaration, owners)
}
}
override fun transformFile(file: FirFile, data: Multimap<AnnotationFqn, FirRegularClass>): FirFile {
typeResolverTransformer.withFile(file) {
return super.transformFile(file, data)
}
}
}