FIR: introduce separate containingClass in BodyResolveContext

This commit is contained in:
Mikhail Glukhikh
2021-03-16 19:15:37 +03:00
parent f9618db9e2
commit ca15df7815
2 changed files with 20 additions and 6 deletions
@@ -75,6 +75,9 @@ class BodyResolveContext(
@set:PrivateForInline @set:PrivateForInline
var containers: PersistentList<FirDeclaration> = persistentListOf() var containers: PersistentList<FirDeclaration> = persistentListOf()
@set:PrivateForInline
var containingClass: FirRegularClass? = null
val containerIfAny: FirDeclaration? val containerIfAny: FirDeclaration?
get() = containers.lastOrNull() get() = containers.lastOrNull()
@@ -114,6 +117,20 @@ class BodyResolveContext(
} }
} }
@PrivateForInline
private inline fun <T> withContainerClass(declaration: FirRegularClass, f: () -> T): T {
val oldContainers = containers
val oldContainingClass = containingClass
containers = containers.add(declaration)
containingClass = declaration
return try {
f()
} finally {
containers = oldContainers
containingClass = oldContainingClass
}
}
@PrivateForInline @PrivateForInline
inline fun <R> withTowerDataCleanup(l: () -> R): R { inline fun <R> withTowerDataCleanup(l: () -> R): R {
val initialContext = towerDataContext val initialContext = towerDataContext
@@ -340,7 +357,7 @@ class BodyResolveContext(
storeClassIfNotNested(regularClass) storeClassIfNotNested(regularClass)
if (forContracts) { if (forContracts) {
return withTypeParametersOf(regularClass) { return withTypeParametersOf(regularClass) {
withContainer(regularClass, f) withContainerClass(regularClass, f)
} }
} }
return withTowerModeCleanup { return withTowerModeCleanup {
@@ -353,7 +370,7 @@ class BodyResolveContext(
} }
withScopesForClass(regularClass, holder) { withScopesForClass(regularClass, holder) {
withContainer(regularClass, f) withContainerClass(regularClass, f)
} }
} }
} }
@@ -39,9 +39,6 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer) : FirPartialBodyResolveTransformer(transformer) { open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer) : FirPartialBodyResolveTransformer(transformer) {
private val containingClass: FirRegularClass?
get() = context.containers.asReversed().firstOrNull { it is FirRegularClass } as? FirRegularClass
private val statusResolver: FirStatusResolver = FirStatusResolver(session, scopeSession) private val statusResolver: FirStatusResolver = FirStatusResolver(session, scopeSession)
private fun FirDeclaration.visibilityForApproximation(): Visibility { private fun FirDeclaration.visibilityForApproximation(): Visibility {
@@ -187,7 +184,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
if (typeRef is FirResolvedTypeRef && property.returnTypeRef is FirResolvedTypeRef) { if (typeRef is FirResolvedTypeRef && property.returnTypeRef is FirResolvedTypeRef) {
val typeArguments = (typeRef.type as ConeClassLikeType).typeArguments val typeArguments = (typeRef.type as ConeClassLikeType).typeArguments
val extensionType = property.receiverTypeRef?.coneType val extensionType = property.receiverTypeRef?.coneType
val dispatchType = containingClass?.let { containingClass -> val dispatchType = context.containingClass?.let { containingClass ->
containingClass.symbol.constructStarProjectedType(containingClass.typeParameters.size) containingClass.symbol.constructStarProjectedType(containingClass.typeParameters.size)
} }
propertyReferenceAccess.replaceTypeRef( propertyReferenceAccess.replaceTypeRef(