diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDelegatedMemberScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDelegatedMemberScope.kt index 93f2707aa2e..db633b063bb 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDelegatedMemberScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDelegatedMemberScope.kt @@ -33,7 +33,7 @@ class FirDelegatedMemberScope( private val containingClass: FirClass, private val declaredMemberScope: FirScope, private val delegateFields: List, -) : FirScope() { +) : FirScope(), FirContainingNamesAwareScope { private val dispatchReceiverType = containingClass.defaultType() private val overrideChecker = FirStandardOverrideChecker(session) @@ -171,6 +171,31 @@ class FirDelegatedMemberScope( result += delegatedSymbol } } + + @OptIn(ExperimentalStdlibApi::class) + private val callableNamesLazy: Set by lazy(LazyThreadSafetyMode.PUBLICATION) { + buildSet { + addAll(declaredMemberScope.getContainingCallableNamesIfPresent()) + + delegateFields.flatMapTo(this) { + buildScope(it)?.getCallableNames() ?: emptySet() + } + } + } + + @OptIn(ExperimentalStdlibApi::class) + private val classifierNamesLazy: Set by lazy(LazyThreadSafetyMode.PUBLICATION) { + buildSet { + addAll(declaredMemberScope.getContainingClassifierNamesIfPresent()) + + delegateFields.flatMapTo(this) { + buildScope(it)?.getClassifierNames() ?: emptySet() + } + } + } + + override fun getCallableNames(): Set = callableNamesLazy + override fun getClassifierNames(): Set = classifierNamesLazy } private object MultipleDelegatesWithTheSameSignatureKey : FirDeclarationDataKey() diff --git a/compiler/testData/codegen/box/delegation/differentModules.kt b/compiler/testData/codegen/box/delegation/differentModules.kt index b39575c0b1d..a3f6cea39b2 100644 --- a/compiler/testData/codegen/box/delegation/differentModules.kt +++ b/compiler/testData/codegen/box/delegation/differentModules.kt @@ -14,15 +14,16 @@ interface UClass : PsiClass { abstract class BaseKotlinUClass( psi: PsiClass, + val w: String, ) : UClass, PsiClass by psi // MODULE: main(base) // 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 { - override fun foo(): String? = "OK" + override fun foo(): String? = "O" }))