FIR: introduce separate containingClass in BodyResolveContext
This commit is contained in:
+19
-2
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-4
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user