[FIR2IR] Don't create fake overrides for private property accessors

This commit is contained in:
Jinseong Jeon
2020-04-01 23:42:46 +03:00
committed by Mikhail Glukhikh
parent 3e6b38a921
commit 44c34ab8c3
4 changed files with 18 additions and 9 deletions
@@ -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
View File
@@ -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