diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt index c16deea4144..bc96856b731 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt @@ -5,17 +5,15 @@ package org.jetbrains.kotlin.fir.backend.generators -import org.jetbrains.kotlin.fir.backend.Fir2IrComponents -import org.jetbrains.kotlin.fir.backend.generateOverriddenAccessorSymbols -import org.jetbrains.kotlin.fir.backend.generateOverriddenFunctionSymbols -import org.jetbrains.kotlin.fir.backend.generateOverriddenPropertySymbols -import org.jetbrains.kotlin.fir.declarations.FirClass -import org.jetbrains.kotlin.fir.declarations.FirField -import org.jetbrains.kotlin.fir.declarations.FirProperty -import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction +import org.jetbrains.kotlin.fir.backend.* +import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.isIntersectionOverride import org.jetbrains.kotlin.fir.isJavaDefault import org.jetbrains.kotlin.fir.scopes.* +import org.jetbrains.kotlin.fir.scopes.impl.delegatedWrapperData import org.jetbrains.kotlin.fir.scopes.impl.unwrapDelegateTarget +import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag +import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrBlockBody @@ -202,3 +200,32 @@ internal class DelegatedMemberGenerator( } } + +private fun , D : FirCallableMemberDeclaration> S.unwrapDelegateTarget( + subClassLookupTag: ConeClassLikeLookupTag, + directOverridden: S.() -> List, + firField: FirField, + firSubClass: FirClass, +): D? { + firSubClass.hashCode() + val unwrappedIntersectionSymbol = this.unwrapIntersectionOverride(directOverridden) ?: return null + + val callable = unwrappedIntersectionSymbol.fir as? D ?: return null + + val delegatedWrapperData = callable.delegatedWrapperData ?: return null + if (delegatedWrapperData.containingClass != subClassLookupTag) return null + if (delegatedWrapperData.delegateField != firField) return null + + val wrapped = delegatedWrapperData.wrapped as? D ?: return null + + @Suppress("UNCHECKED_CAST") + val wrappedSymbol = wrapped.symbol as? S ?: return null + + @Suppress("UNCHECKED_CAST") + return wrappedSymbol.unwrapCallRepresentative().fir as D +} + +private fun > S.unwrapIntersectionOverride(directOverridden: S.() -> List): S? { + if (this.fir.isIntersectionOverride) return directOverridden().firstOrNull { it.fir.delegatedWrapperData != null } + return this +} 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 7b493f92ab0..a97c1575387 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 @@ -12,8 +12,6 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.modality import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.isIntersectionOverride -import org.jetbrains.kotlin.fir.isSubstitutionOverride -import org.jetbrains.kotlin.fir.originalForSubstitutionOverride import org.jetbrains.kotlin.fir.resolve.defaultType import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag @@ -170,35 +168,6 @@ class DelegatedWrapperData( var D.delegatedWrapperData: DelegatedWrapperData? by FirDeclarationDataRegistry.data(DelegatedWrapperDataKey) -inline fun , reified D : FirCallableMemberDeclaration> S.unwrapDelegateTarget( - subClassLookupTag: ConeClassLikeLookupTag, - noinline directOverridden: S.() -> List, - firField: FirField, - firSubClass: FirClass, -): D? { - val unwrappedIntersectionSymbol = this.unwrapIntersectionOverride(directOverridden) ?: return null - - val callable = unwrappedIntersectionSymbol.fir as? D ?: return null - - val delegatedWrapperData = callable.delegatedWrapperData ?: return null - if (delegatedWrapperData.containingClass != subClassLookupTag) return null - if (delegatedWrapperData.delegateField != firField) return null - - val wrapped = delegatedWrapperData.wrapped as? D ?: return null - val wrappedSymbol = wrapped.symbol as? S ?: return null - - return when { - wrappedSymbol.fir.isSubstitutionOverride && - (wrappedSymbol.fir.dispatchReceiverType as? ConeClassLikeType)?.lookupTag == firSubClass.symbol.toLookupTag() -> - wrapped.originalForSubstitutionOverride - else -> wrapped - } -} - -fun > S.unwrapIntersectionOverride(directOverridden: S.() -> List): S? { - if (this.fir.isIntersectionOverride) return directOverridden().firstOrNull { it.fir.delegatedWrapperData != null } - return this -} // From the definition of function interfaces in the Java specification (pt. 9.8): // "methods that are members of I that do not have the same signature as any public instance method of the class Object"