[FIR] Add contaning class lookup element for local FirRegular classes

This commit is contained in:
Igor Yakovlev
2021-03-30 17:44:31 +02:00
parent a428cc6eb4
commit ea8858e694
5 changed files with 18 additions and 2 deletions
@@ -524,6 +524,8 @@ class DeclarationsConverter(
}
}
}
}.also {
it.initContainingClassForLocalAttr()
}
}
@@ -896,6 +896,8 @@ open class RawFirBuilder(
}
}
}
}.also {
it.initContainingClassForLocalAttr()
}
}
@@ -5,7 +5,7 @@ FILE: initBlockWithDeclarations.kt
}
init {
local final? class classInInit : R|kotlin/Any| {
local final? [ContainingClassKey=X] class classInInit : R|kotlin/Any| {
public? [ContainingClassKey=classInInit] constructor(): R|X.classInInit| {
super<R|kotlin/Any|>()
}
@@ -27,7 +27,7 @@ FILE: initBlockWithDeclarations.kt
}
init {
local final? class classInInit : R|kotlin/Any| {
local final? [ContainingClassKey=<no name provided>] class classInInit : R|kotlin/Any| {
public? [ContainingClassKey=classInInit] constructor(): R|<no name provided>.classInInit| {
super<R|kotlin/Any|>()
}
@@ -1152,6 +1152,15 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
}
}
protected fun FirRegularClass.initContainingClassForLocalAttr() {
if (isLocal) {
val currentDispatchReceiverType = currentDispatchReceiverType()
if (currentDispatchReceiverType != null) {
containingClassForLocalAttr = currentDispatchReceiverType.lookupTag
}
}
}
protected fun FirCallableDeclaration<*>.initContainingClassAttr() {
val currentDispatchReceiverType = currentDispatchReceiverType() ?: return
containingClassAttr = currentDispatchReceiverType.lookupTag
@@ -32,9 +32,12 @@ fun FirCallableDeclaration<*>.containingClass(): ConeClassLikeLookupTag? {
fun FirCallableMemberDeclaration<*>.containingClass(): ConeClassLikeLookupTag? {
return (containingClassAttr ?: dispatchReceiverClassOrNull())
}
fun FirRegularClass.containingClassForLocal(): ConeClassLikeLookupTag? =
if (isLocal) containingClassForLocalAttr else null
private object ContainingClassKey : FirDeclarationDataKey()
var FirCallableDeclaration<*>.containingClassAttr: ConeClassLikeLookupTag? by FirDeclarationDataRegistry.data(ContainingClassKey)
var FirRegularClass.containingClassForLocalAttr: ConeClassLikeLookupTag? by FirDeclarationDataRegistry.data(ContainingClassKey)
val FirCallableDeclaration<*>.isIntersectionOverride get() = origin == FirDeclarationOrigin.IntersectionOverride
val FirCallableDeclaration<*>.isSubstitutionOverride get() = origin == FirDeclarationOrigin.SubstitutionOverride