diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt index 37fee545348..2eda88ebf67 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt @@ -15,7 +15,7 @@ import org.jetbrains.kotlin.fir.resolve.transformers.ensureResolved import org.jetbrains.kotlin.fir.scopes.FirTypeScope import org.jetbrains.kotlin.fir.scopes.impl.FirStandardOverrideChecker import org.jetbrains.kotlin.fir.scopes.impl.FirTypeIntersectionScope -import org.jetbrains.kotlin.fir.scopes.scope +import org.jetbrains.kotlin.fir.scopes.scopeForClass import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.fir.typeContext import org.jetbrains.kotlin.fir.types.* @@ -39,7 +39,7 @@ private fun ConeKotlinType.scope(useSiteSession: FirSession, scopeSession: Scope val substitution = createSubstitution(fir.typeParameters, fullyExpandedType, useSiteSession) - fir.scope(substitutorByMap(substitution), useSiteSession, scopeSession, skipPrivateMembers = false) + fir.scopeForClass(substitutorByMap(substitution), useSiteSession, scopeSession) } is ConeTypeParameterType -> { val symbol = lookupTag.toSymbol() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConstructorProcessing.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConstructorProcessing.kt index 92f750dcd8e..d063280487d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConstructorProcessing.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConstructorProcessing.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap import org.jetbrains.kotlin.fir.resolve.transformers.ensureResolved import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope -import org.jetbrains.kotlin.fir.scopes.scope +import org.jetbrains.kotlin.fir.scopes.scopeForClass import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.name.Name @@ -153,8 +153,8 @@ private fun processConstructors( } else basicScope } is FirClassSymbol -> - (matchedSymbol.fir as FirClass<*>).scope( - substitutor, session, scopeSession, skipPrivateMembers = false, + (matchedSymbol.fir as FirClass<*>).scopeForClass( + substitutor, session, scopeSession ) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/KotlinScopeProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/KotlinScopeProvider.kt index d828bb09276..c1729f08fc1 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/KotlinScopeProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/KotlinScopeProvider.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap import org.jetbrains.kotlin.fir.scopes.impl.* import org.jetbrains.kotlin.fir.symbols.CallableId +import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.types.ConeClassErrorType import org.jetbrains.kotlin.fir.types.ConeClassLikeType @@ -44,12 +45,10 @@ class KotlinScopeProvider( val symbol = useSiteSuperType.lookupTag.toSymbol(useSiteSession) if (symbol is FirRegularClassSymbol) { val delegateField = delegateFields.find { it.returnTypeRef.coneType == useSiteSuperType } - symbol.fir.scope( + symbol.fir.scopeForSupertype( substitutor(symbol, useSiteSuperType, useSiteSession), useSiteSession, scopeSession, delegateField, - skipPrivateMembers = true, - classId = klass.classId, - isFromExpectClass = (klass as? FirRegularClass)?.isExpect == true + subClass = klass ).let { it as? FirTypeScope ?: error("$it is expected to be FirOverrideAwareScope") } @@ -101,32 +100,58 @@ fun FirClass<*>.unsubstitutedScope(useSiteSession: FirSession, scopeSession: Sco return scopeProvider.getUseSiteMemberScope(this, useSiteSession, scopeSession) } -internal fun FirClass<*>.scope( +fun FirClass<*>.scopeForClass( + substitutor: ConeSubstitutor, + useSiteSession: FirSession, + scopeSession: ScopeSession +): FirTypeScope = scopeForClassImpl( + substitutor, useSiteSession, scopeSession, + skipPrivateMembers = false, + containingClassForAdditionalMembers = symbol.toLookupTag(), + // TODO: why it's always false? + isFromExpectClass = false +) + +private fun FirClass<*>.scopeForSupertype( substitutor: ConeSubstitutor, useSiteSession: FirSession, scopeSession: ScopeSession, - delegateField: FirField? = null, - skipPrivateMembers: Boolean, - classId: ClassId? = this.classId, - isFromExpectClass: Boolean = false -): FirTypeScope { - val basicScope = unsubstitutedScope(useSiteSession, scopeSession).let { - if (delegateField != null) { - scopeSession.getOrBuild(delegateField, DelegatedMemberScopeKey(delegateField.symbol.callableId)) { - FirDelegatedMemberScope(it, useSiteSession) - } - } else { - it + delegateField: FirField?, + subClass: FirClass<*> +): FirTypeScope = scopeForClassImpl( + substitutor, + useSiteSession, + scopeSession, + skipPrivateMembers = true, + containingClassForAdditionalMembers = subClass.symbol.toLookupTag(), + isFromExpectClass = (subClass as? FirRegularClass)?.isExpect == true +).let { + if (delegateField != null) { + scopeSession.getOrBuild(delegateField, DelegatedMemberScopeKey(delegateField.symbol.callableId)) { + FirDelegatedMemberScope(it, useSiteSession, subClass.symbol.toLookupTag(), delegateField) } + } else { + it } +} + +private fun FirClass<*>.scopeForClassImpl( + substitutor: ConeSubstitutor, + useSiteSession: FirSession, + scopeSession: ScopeSession, + skipPrivateMembers: Boolean, + containingClassForAdditionalMembers: ConeClassLikeLookupTag, + isFromExpectClass: Boolean +): FirTypeScope { + val basicScope = unsubstitutedScope(useSiteSession, scopeSession) if (substitutor == ConeSubstitutor.Empty) return basicScope return scopeSession.getOrBuild( - this, ConeSubstitutionScopeKey(classId, isFromExpectClass, substitutor) + this, ConeSubstitutionScopeKey(containingClassForAdditionalMembers.classId, isFromExpectClass, substitutor) ) { FirClassSubstitutionScope( useSiteSession, basicScope, scopeSession, substitutor, - skipPrivateMembers, classId, makeExpect = isFromExpectClass + skipPrivateMembers, containingClassForAdditionalMembers.classId, makeExpect = isFromExpectClass ) } }