diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 2a4375ff562..883b0c879fe 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -524,6 +524,8 @@ class DeclarationsConverter( } } } + }.also { + it.initContainingClassForLocalAttr() } } diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 4db4e94326c..74024128715 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -896,6 +896,8 @@ open class RawFirBuilder( } } } + }.also { + it.initContainingClassForLocalAttr() } } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/initBlockWithDeclarations.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/initBlockWithDeclarations.txt index 97df679a768..e76aec6936a 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/initBlockWithDeclarations.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/initBlockWithDeclarations.txt @@ -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() } @@ -27,7 +27,7 @@ FILE: initBlockWithDeclarations.kt } init { - local final? class classInInit : R|kotlin/Any| { + local final? [ContainingClassKey=] class classInInit : R|kotlin/Any| { public? [ContainingClassKey=classInInit] constructor(): R|.classInInit| { super() } diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt index fbbf24cb91a..fcd3721ae05 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt @@ -1152,6 +1152,15 @@ abstract class BaseFirBuilder(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 diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt index 80459211a26..38003d5e306 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt @@ -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