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 b6638b82f7d..15a7800902c 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 @@ -5,14 +5,13 @@ package org.jetbrains.kotlin.fir.backend.generators -import org.jetbrains.kotlin.descriptors.Visibilities 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.FirRegularClass -import org.jetbrains.kotlin.fir.declarations.visibility +import org.jetbrains.kotlin.fir.declarations.allowsToHaveFakeOverride import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.buildUseSiteMemberScope import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope @@ -82,7 +81,7 @@ internal class FakeOverrideGenerator( declarations += irFunction.withFunction { overriddenSymbols = listOf(overriddenSymbol) } - } else if (fakeOverrideMode != FakeOverrideMode.SUBSTITUTION && originalFunction.visibility != Visibilities.PRIVATE) { + } else if (fakeOverrideMode != FakeOverrideMode.SUBSTITUTION && originalFunction.allowsToHaveFakeOverride) { // Trivial fake override case val fakeOverrideSymbol = FirClassSubstitutionScope.createFakeOverrideFunction( session, originalFunction, functionSymbol @@ -112,7 +111,7 @@ internal class FakeOverrideGenerator( declarations += irProperty.withProperty { setOverriddenSymbolsForAccessors(originalProperty, firOverriddenSymbol = baseSymbol) } - } else if (fakeOverrideMode != FakeOverrideMode.SUBSTITUTION && originalProperty.visibility != Visibilities.PRIVATE) { + } else if (fakeOverrideMode != FakeOverrideMode.SUBSTITUTION && originalProperty.allowsToHaveFakeOverride) { // Trivial fake override case val fakeOverrideSymbol = FirClassSubstitutionScope.createFakeOverrideProperty( session, originalProperty, propertySymbol, derivedClassId = klass.symbol.classId @@ -121,7 +120,15 @@ internal class FakeOverrideGenerator( val irProperty = declarationStorage.createIrProperty( fakeOverrideProperty, irParent = this, origin = origin - ) + ).apply { + // Do not create fake overrides for accessors if not allowed to do so, e.g., private lateinit var. + if (originalProperty.getter?.allowsToHaveFakeOverride != true) { + getter = null + } + if (originalProperty.setter?.allowsToHaveFakeOverride != true) { + setter = null + } + } declarations += irProperty.withProperty { setOverriddenSymbolsForAccessors(fakeOverrideProperty, firOverriddenSymbol = propertySymbol) } @@ -131,4 +138,4 @@ internal class FakeOverrideGenerator( } } -} \ No newline at end of file +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt index ca90568d98e..2c2156e6beb 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.declarations import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.declarations.builder.AbstractFirRegularClassBuilder import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol @@ -36,6 +37,8 @@ inline val FirRegularClass.isData get() = status.isData inline val FirRegularClass.isInline get() = status.isInline inline val FirMemberDeclaration.modality get() = status.modality inline val FirMemberDeclaration.visibility get() = status.visibility +inline val FirMemberDeclaration.allowsToHaveFakeOverride: Boolean + get() = !Visibilities.isPrivate(visibility) && this != Visibilities.INVISIBLE_FAKE inline val FirMemberDeclaration.effectiveVisibility get() = status.effectiveVisibility inline val FirMemberDeclaration.isActual get() = status.isActual inline val FirMemberDeclaration.isExpect get() = status.isExpect @@ -55,6 +58,8 @@ inline val FirMemberDeclaration.isFromEnumClass: Boolean get() = status.isFromEn inline val FirPropertyAccessor.modality get() = status.modality inline val FirPropertyAccessor.visibility get() = status.visibility +inline val FirPropertyAccessor.allowsToHaveFakeOverride: Boolean + get() = !Visibilities.isPrivate(visibility) && this != Visibilities.INVISIBLE_FAKE fun AbstractFirRegularClassBuilder.addDeclaration(declaration: FirDeclaration) { declarations += declaration @@ -67,7 +72,6 @@ fun AbstractFirRegularClassBuilder.addDeclarations(declarations: Collection.classId get() = symbol.classId diff --git a/compiler/testData/codegen/box/properties/kt3930.kt b/compiler/testData/codegen/box/properties/kt3930.kt index b9946b8fe75..b03168b7f43 100644 --- a/compiler/testData/codegen/box/properties/kt3930.kt +++ b/compiler/testData/codegen/box/properties/kt3930.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR public abstract class Foo { var isOpen = true private set diff --git a/compiler/testData/codegen/box/properties/lateinit/privateSetterViaSubclass.kt b/compiler/testData/codegen/box/properties/lateinit/privateSetterViaSubclass.kt index a910d478be3..be73743b028 100644 --- a/compiler/testData/codegen/box/properties/lateinit/privateSetterViaSubclass.kt +++ b/compiler/testData/codegen/box/properties/lateinit/privateSetterViaSubclass.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR open class A { lateinit var x: String private set