[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 package org.jetbrains.kotlin.fir.backend.generators
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.backend.collectCallableNamesFromSupertypes import org.jetbrains.kotlin.fir.backend.collectCallableNamesFromSupertypes
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirRegularClass 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.ScopeSession
import org.jetbrains.kotlin.fir.resolve.buildUseSiteMemberScope import org.jetbrains.kotlin.fir.resolve.buildUseSiteMemberScope
import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope
@@ -82,7 +81,7 @@ internal class FakeOverrideGenerator(
declarations += irFunction.withFunction { declarations += irFunction.withFunction {
overriddenSymbols = listOf(overriddenSymbol) overriddenSymbols = listOf(overriddenSymbol)
} }
} else if (fakeOverrideMode != FakeOverrideMode.SUBSTITUTION && originalFunction.visibility != Visibilities.PRIVATE) { } else if (fakeOverrideMode != FakeOverrideMode.SUBSTITUTION && originalFunction.allowsToHaveFakeOverride) {
// Trivial fake override case // Trivial fake override case
val fakeOverrideSymbol = FirClassSubstitutionScope.createFakeOverrideFunction( val fakeOverrideSymbol = FirClassSubstitutionScope.createFakeOverrideFunction(
session, originalFunction, functionSymbol session, originalFunction, functionSymbol
@@ -112,7 +111,7 @@ internal class FakeOverrideGenerator(
declarations += irProperty.withProperty { declarations += irProperty.withProperty {
setOverriddenSymbolsForAccessors(originalProperty, firOverriddenSymbol = baseSymbol) setOverriddenSymbolsForAccessors(originalProperty, firOverriddenSymbol = baseSymbol)
} }
} else if (fakeOverrideMode != FakeOverrideMode.SUBSTITUTION && originalProperty.visibility != Visibilities.PRIVATE) { } else if (fakeOverrideMode != FakeOverrideMode.SUBSTITUTION && originalProperty.allowsToHaveFakeOverride) {
// Trivial fake override case // Trivial fake override case
val fakeOverrideSymbol = FirClassSubstitutionScope.createFakeOverrideProperty( val fakeOverrideSymbol = FirClassSubstitutionScope.createFakeOverrideProperty(
session, originalProperty, propertySymbol, derivedClassId = klass.symbol.classId session, originalProperty, propertySymbol, derivedClassId = klass.symbol.classId
@@ -121,7 +120,15 @@ internal class FakeOverrideGenerator(
val irProperty = declarationStorage.createIrProperty( val irProperty = declarationStorage.createIrProperty(
fakeOverrideProperty, irParent = this, origin = origin 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 { declarations += irProperty.withProperty {
setOverriddenSymbolsForAccessors(fakeOverrideProperty, firOverriddenSymbol = propertySymbol) setOverriddenSymbolsForAccessors(fakeOverrideProperty, firOverriddenSymbol = propertySymbol)
} }
@@ -131,4 +138,4 @@ internal class FakeOverrideGenerator(
} }
} }
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.declarations package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.descriptors.ClassKind 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.AbstractFirRegularClassBuilder
import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol 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 FirRegularClass.isInline get() = status.isInline
inline val FirMemberDeclaration.modality get() = status.modality inline val FirMemberDeclaration.modality get() = status.modality
inline val FirMemberDeclaration.visibility get() = status.visibility 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.effectiveVisibility get() = status.effectiveVisibility
inline val FirMemberDeclaration.isActual get() = status.isActual inline val FirMemberDeclaration.isActual get() = status.isActual
inline val FirMemberDeclaration.isExpect get() = status.isExpect 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.modality get() = status.modality
inline val FirPropertyAccessor.visibility get() = status.visibility 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) { fun AbstractFirRegularClassBuilder.addDeclaration(declaration: FirDeclaration) {
declarations += declaration declarations += declaration
@@ -67,7 +72,6 @@ fun AbstractFirRegularClassBuilder.addDeclarations(declarations: Collection<FirD
declarations.forEach(this::addDeclaration) declarations.forEach(this::addDeclaration)
} }
val FirTypeAlias.expandedConeType: ConeClassLikeType? get() = expandedTypeRef.coneTypeSafe() val FirTypeAlias.expandedConeType: ConeClassLikeType? get() = expandedTypeRef.coneTypeSafe()
val FirClass<*>.classId get() = symbol.classId val FirClass<*>.classId get() = symbol.classId
-1
View File
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
public abstract class Foo { public abstract class Foo {
var isOpen = true var isOpen = true
private set private set
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
open class A { open class A {
lateinit var x: String lateinit var x: String
private set private set