[FIR2IR] Don't create fake overrides for private property accessors
This commit is contained in:
committed by
Mikhail Glukhikh
parent
3e6b38a921
commit
44c34ab8c3
+13
-6
@@ -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(
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<FirD
|
||||
declarations.forEach(this::addDeclaration)
|
||||
}
|
||||
|
||||
|
||||
val FirTypeAlias.expandedConeType: ConeClassLikeType? get() = expandedTypeRef.coneTypeSafe()
|
||||
|
||||
val FirClass<*>.classId get() = symbol.classId
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
public abstract class Foo {
|
||||
var isOpen = true
|
||||
private set
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
open class A {
|
||||
lateinit var x: String
|
||||
private set
|
||||
|
||||
Reference in New Issue
Block a user