diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt index a040dd94392..b099ac626fe 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt @@ -8,10 +8,7 @@ package org.jetbrains.kotlin.fir.backend.generators import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.collectCallableNamesFromSupertypes -import org.jetbrains.kotlin.fir.declarations.FirClass -import org.jetbrains.kotlin.fir.declarations.FirProperty -import org.jetbrains.kotlin.fir.declarations.allowsToHaveFakeOverride -import org.jetbrains.kotlin.fir.declarations.isStatic +import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.buildUseSiteMemberScope import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope @@ -22,6 +19,7 @@ import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol +import org.jetbrains.kotlin.load.java.JavaVisibilities import org.jetbrains.kotlin.name.Name internal class FakeOverrideGenerator( @@ -57,6 +55,12 @@ internal class FakeOverrideGenerator( return this } + private fun FirCallableMemberDeclaration<*>.allowsToHaveFakeOverrideIn(klass: FirClass<*>): Boolean { + if (!allowsToHaveFakeOverride) return false + if (this.visibility != JavaVisibilities.PACKAGE_VISIBILITY) return true + return this.symbol.callableId.packageName == klass.symbol.classId.packageFqName + } + fun IrClass.addFakeOverrides(klass: FirClass<*>, processedCallableNames: MutableList) { if (fakeOverrideMode == FakeOverrideMode.NONE) return val superTypesCallableNames = klass.collectCallableNamesFromSupertypes(session) @@ -85,7 +89,7 @@ internal class FakeOverrideGenerator( declarations += irFunction.withFunction { overriddenSymbols = listOf(overriddenSymbol) } - } else if (fakeOverrideMode != FakeOverrideMode.SUBSTITUTION && originalFunction.allowsToHaveFakeOverride) { + } else if (fakeOverrideMode != FakeOverrideMode.SUBSTITUTION && originalFunction.allowsToHaveFakeOverrideIn(klass)) { // Trivial fake override case val fakeOverrideSymbol = FirClassSubstitutionScope.createFakeOverrideFunction( session, originalFunction, functionSymbol @@ -115,7 +119,7 @@ internal class FakeOverrideGenerator( declarations += irProperty.withProperty { setOverriddenSymbolsForAccessors(originalProperty, firOverriddenSymbol = baseSymbol) } - } else if (fakeOverrideMode != FakeOverrideMode.SUBSTITUTION && originalProperty.allowsToHaveFakeOverride) { + } else if (fakeOverrideMode != FakeOverrideMode.SUBSTITUTION && originalProperty.allowsToHaveFakeOverrideIn(klass)) { // Trivial fake override case val fakeOverrideSymbol = FirClassSubstitutionScope.createFakeOverrideProperty( session, originalProperty, propertySymbol, derivedClassId = klass.symbol.classId diff --git a/compiler/testData/ir/irText/classes/fakeOverridesForJavaStaticMembers.fir.txt b/compiler/testData/ir/irText/classes/fakeOverridesForJavaStaticMembers.fir.txt index 44bdf59b4b3..90b41ee34fc 100644 --- a/compiler/testData/ir/irText/classes/fakeOverridesForJavaStaticMembers.fir.txt +++ b/compiler/testData/ir/irText/classes/fakeOverridesForJavaStaticMembers.fir.txt @@ -11,9 +11,6 @@ FILE fqName: fileName:/fakeOverridesForJavaStaticMembers.kt FUN FAKE_OVERRIDE name:protectedStaticMethod visibility:protected/*protected static*/ modality:OPEN <> () returnType:kotlin.Unit [fake_override] overridden: protected/*protected static*/ open fun protectedStaticMethod (): kotlin.Unit declared in a.Base - FUN FAKE_OVERRIDE name:packagePrivateStaticMethod visibility:public/*package*/ modality:OPEN <> () returnType:kotlin.Unit [fake_override] - overridden: - public/*package*/ open fun packagePrivateStaticMethod (): kotlin.Unit declared in 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