diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index be6f7e87eaf..5a64669d78c 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -206,7 +206,7 @@ class Fir2IrVisitor( declarations += irFunction.setParentByParentStack().withFunction { setFunctionContent(irFunction.descriptor, originalFunction, firOverriddenSymbol = baseSymbol) } - } else if (fakeOverrideMode != FakeOverrideMode.SUBSTITUTION) { + } else if (fakeOverrideMode != FakeOverrideMode.SUBSTITUTION && originalFunction.visibility != Visibilities.PRIVATE) { // Trivial fake override case val fakeOverrideSymbol = FirClassSubstitutionScope.createFakeOverrideFunction(session, originalFunction, functionSymbol) @@ -234,7 +234,7 @@ class Fir2IrVisitor( declarations += irProperty.setParentByParentStack().withProperty { setPropertyContent(irProperty.descriptor, originalProperty, firOverriddenSymbol = baseSymbol) } - } else if (fakeOverrideMode != FakeOverrideMode.SUBSTITUTION) { + } else if (fakeOverrideMode != FakeOverrideMode.SUBSTITUTION && originalProperty.visibility != Visibilities.PRIVATE) { // Trivial fake override case val fakeOverrideSymbol = FirClassSubstitutionScope.createFakeOverrideProperty(session, originalProperty, propertySymbol) 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 c33df344857..212fc990520 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 @@ -33,7 +33,7 @@ fun ConeKotlinType.scope(useSiteSession: FirSession, scopeSession: ScopeSession) else -> emptyMap() } - fir.scope(substitutorByMap(substitution), useSiteSession, scopeSession) + fir.scope(substitutorByMap(substitution), useSiteSession, scopeSession, skipPrivateMembers = false) } is ConeTypeParameterType -> { // TODO: support LibraryTypeParameterSymbol or get rid of it diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt index dfe6c8c25cf..11b13cc4b18 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt @@ -94,9 +94,11 @@ fun ConeClassLikeType.wrapSubstitutionScopeIfNeed( // to determine parameter types properly (e.g. String, String instead of K, V) val javaTypeParameters = javaClass.typeParameters val javaSubstitution = createSubstitution(javaTypeParameters, typeArguments, session) - FirClassSubstitutionScope(session, useSiteMemberScope, builder, originalSubstitution + javaSubstitution) + FirClassSubstitutionScope( + session, useSiteMemberScope, builder, originalSubstitution + javaSubstitution, skipPrivateMembers = true + ) } else { - FirClassSubstitutionScope(session, useSiteMemberScope, builder, originalSubstitution) + FirClassSubstitutionScope(session, useSiteMemberScope, builder, originalSubstitution, skipPrivateMembers = true) } } } 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 6f825bc79d1..3f84d557a86 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 @@ -47,7 +47,10 @@ class KotlinScopeProvider( if (useSiteSuperType is ConeClassErrorType) return@mapNotNull null val symbol = useSiteSuperType.lookupTag.toSymbol(useSiteSession) if (symbol is FirRegularClassSymbol) { - symbol.fir.scope(substitutor(symbol, useSiteSuperType, useSiteSession), useSiteSession, scopeSession) + symbol.fir.scope( + substitutor(symbol, useSiteSuperType, useSiteSession), + useSiteSession, scopeSession, skipPrivateMembers = true + ) } else { null } @@ -80,10 +83,15 @@ class KotlinScopeProvider( data class ConeSubstitutionScopeKey(val substitutor: ConeSubstitutor) : ScopeSessionKey, FirClassSubstitutionScope>() fun FirClass<*>.unsubstitutedScope(useSiteSession: FirSession, scopeSession: ScopeSession): FirScope { - return scope(ConeSubstitutor.Empty, useSiteSession, scopeSession) + return scopeProvider.getUseSiteMemberScope(this, useSiteSession, scopeSession) } -fun FirClass<*>.scope(substitutor: ConeSubstitutor, useSiteSession: FirSession, scopeSession: ScopeSession): FirScope { +internal fun FirClass<*>.scope( + substitutor: ConeSubstitutor, + useSiteSession: FirSession, + scopeSession: ScopeSession, + skipPrivateMembers: Boolean +): FirScope { val basicScope = scopeProvider.getUseSiteMemberScope( this, useSiteSession, scopeSession ) @@ -92,6 +100,6 @@ fun FirClass<*>.scope(substitutor: ConeSubstitutor, useSiteSession: FirSession, return scopeSession.getOrBuild( this, ConeSubstitutionScopeKey(substitutor) ) { - FirClassSubstitutionScope(useSiteSession, basicScope, scopeSession, substitutor) + FirClassSubstitutionScope(useSiteSession, basicScope, scopeSession, substitutor, skipPrivateMembers) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt index b09ece1cc15..e677cbec76b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt @@ -5,11 +5,9 @@ package org.jetbrains.kotlin.fir.scopes.impl +import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.FirSession -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.declarations.FirTypeParameter +import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.* import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty @@ -33,7 +31,8 @@ class FirClassSubstitutionScope( private val session: FirSession, private val useSiteMemberScope: FirScope, scopeSession: ScopeSession, - private val substitutor: ConeSubstitutor + private val substitutor: ConeSubstitutor, + private val skipPrivateMembers: Boolean ) : FirScope() { private val fakeOverrideFunctions = mutableMapOf, FirFunctionSymbol<*>>() @@ -43,8 +42,9 @@ class FirClassSubstitutionScope( constructor( session: FirSession, useSiteMemberScope: FirScope, scopeSession: ScopeSession, - substitution: Map - ) : this(session, useSiteMemberScope, scopeSession, substitutorByMap(substitution)) + substitution: Map, + skipPrivateMembers: Boolean + ) : this(session, useSiteMemberScope, scopeSession, substitutorByMap(substitution), skipPrivateMembers) override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) { useSiteMemberScope.processFunctionsByName(name) process@{ original -> @@ -101,6 +101,7 @@ class FirClassSubstitutionScope( is FirConstructorSymbol -> return original else -> throw AssertionError("Should not be here") } + if (skipPrivateMembers && member.visibility == Visibilities.PRIVATE) return original val (newTypeParameters, newSubstitutor) = createNewTypeParametersAndSubstitutor(member) @@ -170,6 +171,7 @@ class FirClassSubstitutionScope( private fun createFakeOverrideProperty(original: FirPropertySymbol): FirPropertySymbol { if (substitutor == ConeSubstitutor.Empty) return original val member = original.fir + if (skipPrivateMembers && member.visibility == Visibilities.PRIVATE) return original val receiverType = member.receiverTypeRef?.coneTypeUnsafe() val newReceiverType = receiverType?.substitute() @@ -187,6 +189,7 @@ class FirClassSubstitutionScope( private fun createFakeOverrideField(original: FirFieldSymbol): FirFieldSymbol { if (substitutor == ConeSubstitutor.Empty) return original val member = original.fir + if (skipPrivateMembers && member.visibility == Visibilities.PRIVATE) return original val returnType = typeCalculator.tryCalculateReturnType(member).type val newReturnType = returnType.substitute() ?: return original @@ -197,6 +200,7 @@ class FirClassSubstitutionScope( private fun createFakeOverrideAccessor(original: FirAccessorSymbol): FirAccessorSymbol { if (substitutor == ConeSubstitutor.Empty) return original val member = original.fir as FirSyntheticProperty + if (skipPrivateMembers && member.visibility == Visibilities.PRIVATE) return original val returnType = typeCalculator.tryCalculateReturnType(member).type val newReturnType = returnType.substitute() diff --git a/compiler/testData/codegen/box/classes/kt1134.kt b/compiler/testData/codegen/box/classes/kt1134.kt index 1fa9b0ddedb..9022b6c5a8e 100644 --- a/compiler/testData/codegen/box/classes/kt1134.kt +++ b/compiler/testData/codegen/box/classes/kt1134.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TODO: Enable when JS backend supports Java class library // TARGET_BACKEND: JVM public class SomeClass() : java.lang.Object() { diff --git a/compiler/testData/codegen/box/jvm8/defaults/privateDefaultFromDefaultImpl.kt b/compiler/testData/codegen/box/jvm8/defaults/privateDefaultFromDefaultImpl.kt index b90b71dcb5a..393c52f6718 100644 --- a/compiler/testData/codegen/box/jvm8/defaults/privateDefaultFromDefaultImpl.kt +++ b/compiler/testData/codegen/box/jvm8/defaults/privateDefaultFromDefaultImpl.kt @@ -1,5 +1,4 @@ // !JVM_DEFAULT_MODE: enable -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // JVM_TARGET: 1.8 // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/traits/noPrivateDelegation.kt b/compiler/testData/codegen/box/traits/noPrivateDelegation.kt index 800c5f35525..42a64385eb8 100644 --- a/compiler/testData/codegen/box/traits/noPrivateDelegation.kt +++ b/compiler/testData/codegen/box/traits/noPrivateDelegation.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // IGNORE_BACKEND: JS_IR // TODO: muted automatically, investigate should it be ran for JS or not // IGNORE_BACKEND: JS, NATIVE diff --git a/compiler/testData/codegen/box/traits/syntheticAccessor.kt b/compiler/testData/codegen/box/traits/syntheticAccessor.kt index bc1a509989c..32ce13d9d57 100644 --- a/compiler/testData/codegen/box/traits/syntheticAccessor.kt +++ b/compiler/testData/codegen/box/traits/syntheticAccessor.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR var result = "fail" interface B { diff --git a/compiler/testData/codegen/box/typealias/kt15109.kt b/compiler/testData/codegen/box/typealias/kt15109.kt index dc6528e9ed1..f6846176bf5 100644 --- a/compiler/testData/codegen/box/typealias/kt15109.kt +++ b/compiler/testData/codegen/box/typealias/kt15109.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR open class A(private val s: String = "") { fun foo() = s } diff --git a/compiler/testData/ir/irText/classes/fakeOverridesForJavaStaticMembers.fir.txt b/compiler/testData/ir/irText/classes/fakeOverridesForJavaStaticMembers.fir.txt index 2580ffc0f4b..8d7187659e2 100644 --- a/compiler/testData/ir/irText/classes/fakeOverridesForJavaStaticMembers.fir.txt +++ b/compiler/testData/ir/irText/classes/fakeOverridesForJavaStaticMembers.fir.txt @@ -17,10 +17,6 @@ FILE fqName: fileName:/fakeOverridesForJavaStaticMembers.kt overridden: public/*package*/ open fun packagePrivateStaticMethod (): kotlin.Unit declared in a.Base $this: VALUE_PARAMETER name: type:a.Base - FUN FAKE_OVERRIDE name:privateStaticMethod visibility:private modality:OPEN <> ($this:a.Base) returnType:kotlin.Unit [fake_override] - overridden: - private open fun privateStaticMethod (): kotlin.Unit declared in a.Base - $this: VALUE_PARAMETER name: type:a.Base FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] overridden: public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any