FIR: Fix serialization of non-delegated members in FirDelegatedMemberScope

This commit is contained in:
Denis.Zharkov
2021-06-30 14:39:40 +03:00
committed by TeamCityServer
parent 3671b14e5b
commit a3f64f65f2
2 changed files with 30 additions and 4 deletions
@@ -33,7 +33,7 @@ class FirDelegatedMemberScope(
private val containingClass: FirClass, private val containingClass: FirClass,
private val declaredMemberScope: FirScope, private val declaredMemberScope: FirScope,
private val delegateFields: List<FirField>, private val delegateFields: List<FirField>,
) : FirScope() { ) : FirScope(), FirContainingNamesAwareScope {
private val dispatchReceiverType = containingClass.defaultType() private val dispatchReceiverType = containingClass.defaultType()
private val overrideChecker = FirStandardOverrideChecker(session) private val overrideChecker = FirStandardOverrideChecker(session)
@@ -171,6 +171,31 @@ class FirDelegatedMemberScope(
result += delegatedSymbol result += delegatedSymbol
} }
} }
@OptIn(ExperimentalStdlibApi::class)
private val callableNamesLazy: Set<Name> by lazy(LazyThreadSafetyMode.PUBLICATION) {
buildSet {
addAll(declaredMemberScope.getContainingCallableNamesIfPresent())
delegateFields.flatMapTo(this) {
buildScope(it)?.getCallableNames() ?: emptySet()
}
}
}
@OptIn(ExperimentalStdlibApi::class)
private val classifierNamesLazy: Set<Name> by lazy(LazyThreadSafetyMode.PUBLICATION) {
buildSet {
addAll(declaredMemberScope.getContainingClassifierNamesIfPresent())
delegateFields.flatMapTo(this) {
buildScope(it)?.getClassifierNames() ?: emptySet()
}
}
}
override fun getCallableNames(): Set<Name> = callableNamesLazy
override fun getClassifierNames(): Set<Name> = classifierNamesLazy
} }
private object MultipleDelegatesWithTheSameSignatureKey : FirDeclarationDataKey() private object MultipleDelegatesWithTheSameSignatureKey : FirDeclarationDataKey()
@@ -14,15 +14,16 @@ interface UClass : PsiClass {
abstract class BaseKotlinUClass( abstract class BaseKotlinUClass(
psi: PsiClass, psi: PsiClass,
val w: String,
) : UClass, PsiClass by psi ) : UClass, PsiClass by psi
// MODULE: main(base) // MODULE: main(base)
// FILE: main.kt // FILE: main.kt
class A(psi: PsiClass) : BaseKotlinUClass(psi) class A(psi: PsiClass) : BaseKotlinUClass(psi, "K")
fun bar(uClass: UClass): String = uClass.foo()!! fun bar(uClass: UClass): String = uClass.foo()!! + (uClass as BaseKotlinUClass).w
fun box(): String = bar(A(object : PsiClass { fun box(): String = bar(A(object : PsiClass {
override fun foo(): String? = "OK" override fun foo(): String? = "O"
})) }))