Fir2Ir: create file level signatures where appropriate

This is godugly code, where a flag for file level signatures is passsed
around.
An alternative would be not to create file level signatures for toplevel
private clases, since those still need unique names, at least on JVM.
But that would break binary compatibility.
Signatures are due for overhaul anyway. Hopefully this code can be
reverted at that point.
This commit is contained in:
Georgy Bronnikov
2022-03-25 22:24:43 +03:00
committed by Alexander Udalov
parent 9d4ab09b41
commit 39bba7973c
23 changed files with 230 additions and 48 deletions
@@ -481,10 +481,11 @@ class Fir2IrClassifierStorage(
fun createIrEnumEntry(
enumEntry: FirEnumEntry,
irParent: IrClass?,
predefinedOrigin: IrDeclarationOrigin? = null
predefinedOrigin: IrDeclarationOrigin? = null,
forceTopLevelPrivate: Boolean = false,
): IrEnumEntry {
return enumEntry.convertWithOffsets { startOffset, endOffset ->
val signature = signatureComposer.composeSignature(enumEntry)
val signature = signatureComposer.composeSignature(enumEntry, forceTopLevelPrivate = forceTopLevelPrivate)
val result = declareIrEnumEntry(signature) { symbol ->
val origin = enumEntry.computeIrOrigin(predefinedOrigin)
irFactory.createEnumEntry(
@@ -522,13 +523,13 @@ class Fir2IrClassifierStorage(
}
}
fun getIrClassSymbol(firClassSymbol: FirClassSymbol<*>): IrClassSymbol {
fun getIrClassSymbol(firClassSymbol: FirClassSymbol<*>, forceTopLevelPrivate: Boolean = false): IrClassSymbol {
val firClass = firClassSymbol.fir
getCachedIrClass(firClass)?.let { return it.symbol }
if (firClass is FirAnonymousObject || firClass is FirRegularClass && firClass.visibility == Visibilities.Local) {
return createLocalIrClassOnTheFly(firClass).symbol
}
val signature = signatureComposer.composeSignature(firClass)!!
val signature = signatureComposer.composeSignature(firClass, forceTopLevelPrivate = forceTopLevelPrivate)!!
val symbol = symbolTable.referenceClass(signature)
if (symbol.isBound) {
val irClass = symbol.owner
@@ -477,9 +477,16 @@ class Fir2IrDeclarationStorage(
function: FirSimpleFunction,
irParent: IrDeclarationParent?,
isLocal: Boolean = false,
forceTopLevelPrivate: Boolean = false,
): IrSimpleFunction {
getCachedIrFunction(function)?.let { return it }
return createIrFunction(function, irParent, containingClass = function.containingClass(), isLocal = isLocal)
return createIrFunction(
function,
irParent,
containingClass = function.containingClass(),
isLocal = isLocal,
forceTopLevelPrivate = forceTopLevelPrivate
)
}
fun createIrFunction(
@@ -489,6 +496,7 @@ class Fir2IrDeclarationStorage(
predefinedOrigin: IrDeclarationOrigin? = null,
isLocal: Boolean = false,
containingClass: ConeClassLikeLookupTag? = null,
forceTopLevelPrivate: Boolean = false,
): IrSimpleFunction = convertCatching(function) {
val simpleFunction = function as? FirSimpleFunction
val isLambda = function.source?.elementType.let { it == KtNodeTypes.FUNCTION_LITERAL || it == KtNodeTypes.LAMBDA_EXPRESSION }
@@ -504,7 +512,7 @@ class Fir2IrDeclarationStorage(
function.origin == FirDeclarationOrigin.Enhancement -> IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB
else -> function.computeIrOrigin(predefinedOrigin)
}
val signature = if (isLocal) null else signatureComposer.composeSignature(function, containingClass)
val signature = if (isLocal) null else signatureComposer.composeSignature(function, containingClass, forceTopLevelPrivate)
if (irParent is Fir2IrLazyClass && signature != null) {
// For private functions signature is null, fallback to non-lazy function
return createIrLazyFunction(function as FirSimpleFunction, signature, irParent, updatedOrigin)
@@ -598,11 +606,12 @@ class Fir2IrDeclarationStorage(
constructor: FirConstructor,
irParent: IrClass,
predefinedOrigin: IrDeclarationOrigin? = null,
isLocal: Boolean = false
isLocal: Boolean = false,
forceTopLevelPrivate: Boolean = false,
): IrConstructor = convertCatching(constructor) {
val origin = constructor.computeIrOrigin(predefinedOrigin)
val isPrimary = constructor.isPrimary
val signature = if (isLocal) null else signatureComposer.composeSignature(constructor)
val signature = if (isLocal) null else signatureComposer.composeSignature(constructor, forceTopLevelPrivate = forceTopLevelPrivate)
val created = constructor.convertWithOffsets { startOffset, endOffset ->
declareIrConstructor(signature) { symbol ->
classifierStorage.preCacheTypeParameters(constructor, symbol)
@@ -627,10 +636,11 @@ class Fir2IrDeclarationStorage(
constructor: FirConstructor,
irParent: IrClass,
predefinedOrigin: IrDeclarationOrigin? = null,
isLocal: Boolean = false
isLocal: Boolean = false,
forceTopLevelPrivate: Boolean = false,
): IrConstructor {
getCachedIrConstructor(constructor)?.let { return it }
return createIrConstructor(constructor, irParent, predefinedOrigin, isLocal)
return createIrConstructor(constructor, irParent, predefinedOrigin, isLocal, forceTopLevelPrivate = forceTopLevelPrivate)
}
private fun declareIrAccessor(
@@ -657,9 +667,10 @@ class Fir2IrDeclarationStorage(
isLocal: Boolean = false,
containingClass: ConeClassLikeLookupTag? = null,
propertyAccessorForAnnotations: FirPropertyAccessor? = propertyAccessor,
forceTopLevelPrivate: Boolean = false,
): IrSimpleFunction = convertCatching(propertyAccessor ?: property) {
val prefix = if (isSetter) "set" else "get"
val signature = if (isLocal) null else signatureComposer.composeAccessorSignature(property, isSetter, containingClass)
val signature = if (isLocal) null else signatureComposer.composeAccessorSignature(property, isSetter, containingClass, forceTopLevelPrivate)
val containerSource = (correspondingProperty as? IrProperty)?.containerSource
return declareIrAccessor(
signature,
@@ -779,9 +790,10 @@ class Fir2IrDeclarationStorage(
property: FirProperty,
irParent: IrDeclarationParent?,
isLocal: Boolean = false,
forceTopLevelPrivate: Boolean = false,
): IrProperty {
getCachedIrProperty(property)?.let { return it }
return createIrProperty(property, irParent, isLocal = isLocal)
return createIrProperty(property, irParent, isLocal = isLocal, forceTopLevelPrivate = forceTopLevelPrivate)
}
fun getOrCreateIrPropertyByPureField(
@@ -822,9 +834,10 @@ class Fir2IrDeclarationStorage(
predefinedOrigin: IrDeclarationOrigin? = null,
isLocal: Boolean = false,
containingClass: ConeClassLikeLookupTag? = (irParent as? IrClass)?.classId?.let { ConeClassLikeLookupTagImpl(it) },
forceTopLevelPrivate: Boolean = false,
): IrProperty = convertCatching(property) {
val origin = property.computeIrOrigin(predefinedOrigin)
val signature = if (isLocal) null else signatureComposer.composeSignature(property, containingClass)
val signature = if (isLocal) null else signatureComposer.composeSignature(property, containingClass, forceTopLevelPrivate)
if (irParent is Fir2IrLazyClass && signature != null) {
// For private functions signature is null, fallback to non-lazy property
return createIrLazyProperty(property, signature, irParent, origin)
@@ -898,6 +911,7 @@ class Fir2IrDeclarationStorage(
},
startOffset, endOffset, isLocal, containingClass,
property.unwrapFakeOverrides().getter,
forceTopLevelPrivate = forceTopLevelPrivate,
)
if (property.isVar) {
this.setter = createIrPropertyAccessor(
@@ -909,6 +923,7 @@ class Fir2IrDeclarationStorage(
},
startOffset, endOffset, isLocal, containingClass,
property.unwrapFakeOverrides().setter,
forceTopLevelPrivate = forceTopLevelPrivate,
)
}
leaveScope(this)
@@ -1199,13 +1214,15 @@ class Fir2IrDeclarationStorage(
}
}
fun getIrConstructorSymbol(firConstructorSymbol: FirConstructorSymbol): IrConstructorSymbol {
fun getIrConstructorSymbol(firConstructorSymbol: FirConstructorSymbol, forceTopLevelPrivate: Boolean = false): IrConstructorSymbol {
val fir = firConstructorSymbol.fir
return getIrCallableSymbol(
firConstructorSymbol,
dispatchReceiverLookupTag = null,
getCachedIrDeclaration = { constructor: FirConstructor, _, calculator -> getCachedIrConstructor(constructor, calculator) },
createIrDeclaration = { parent, origin -> createIrConstructor(fir, parent as IrClass, predefinedOrigin = origin) },
createIrDeclaration = { parent, origin ->
createIrConstructor(fir, parent as IrClass, predefinedOrigin = origin, forceTopLevelPrivate = forceTopLevelPrivate)
},
createIrLazyDeclaration = { signature, lazyParent, declarationOrigin ->
val symbol = Fir2IrConstructorSymbol(signature)
val irConstructor = fir.convertWithOffsets { startOffset, endOffset ->
@@ -1221,13 +1238,15 @@ class Fir2IrDeclarationStorage(
// NB: this is needed to prevent recursions in case of self bounds
(irConstructor as Fir2IrLazyConstructor).prepareTypeParameters()
irConstructor
}
},
forceTopLevelPrivate = forceTopLevelPrivate
) as IrConstructorSymbol
}
fun getIrFunctionSymbol(
firFunctionSymbol: FirFunctionSymbol<*>,
dispatchReceiverLookupTag: ConeClassLikeLookupTag? = null
dispatchReceiverLookupTag: ConeClassLikeLookupTag? = null,
forceTopLevelPrivate: Boolean = false,
): IrFunctionSymbol {
return when (val fir = firFunctionSymbol.fir) {
is FirAnonymousFunction -> {
@@ -1247,11 +1266,12 @@ class Fir2IrDeclarationStorage(
dispatchReceiverLookupTag,
getCachedIrDeclaration = ::getCachedIrFunction,
createIrDeclaration = { parent, origin ->
createIrFunction(fir, parent, predefinedOrigin = origin)
createIrFunction(fir, parent, predefinedOrigin = origin, forceTopLevelPrivate = forceTopLevelPrivate)
},
createIrLazyDeclaration = { signature, lazyParent, declarationOrigin ->
createIrLazyFunction(fir, signature, lazyParent, declarationOrigin)
}
},
forceTopLevelPrivate = forceTopLevelPrivate
) as IrFunctionSymbol
if (unmatchedReceiver && dispatchReceiverLookupTag is ConeClassLookupTagWithFixedSymbol) {
val originalFunction = originalSymbol.owner as IrSimpleFunction
@@ -1261,7 +1281,7 @@ class Fir2IrDeclarationStorage(
}
}
is FirConstructor -> {
getIrConstructorSymbol(fir.symbol)
getIrConstructorSymbol(fir.symbol, forceTopLevelPrivate = forceTopLevelPrivate)
}
else -> error("Unknown kind of function: ${fir::class.java}: ${fir.render()}")
}
@@ -1296,7 +1316,8 @@ class Fir2IrDeclarationStorage(
fun getIrPropertySymbol(
firPropertySymbol: FirPropertySymbol,
dispatchReceiverLookupTag: ConeClassLikeLookupTag? = null
dispatchReceiverLookupTag: ConeClassLikeLookupTag? = null,
forceTopLevelPrivate: Boolean = false,
): IrSymbol {
val fir = firPropertySymbol.fir
if (fir.isLocal) {
@@ -1312,10 +1333,15 @@ class Fir2IrDeclarationStorage(
firPropertySymbol,
dispatchReceiverLookupTag = this,
getCachedIrDeclaration = ::getCachedIrProperty,
createIrDeclaration = { parent, origin -> createIrProperty(fir, parent, predefinedOrigin = origin) },
createIrDeclaration = { parent, origin ->
createIrProperty(
fir, parent, predefinedOrigin = origin, forceTopLevelPrivate = forceTopLevelPrivate
)
},
createIrLazyDeclaration = { signature, lazyParent, declarationOrigin ->
createIrLazyProperty(fir, signature, lazyParent, declarationOrigin)
}
},
forceTopLevelPrivate = forceTopLevelPrivate
)
val originalSymbol = dispatchReceiverLookupTag.getIrCallableSymbol()
@@ -1400,10 +1426,11 @@ class Fir2IrDeclarationStorage(
getCachedIrDeclaration: (firDeclaration: F, dispatchReceiverLookupTag: ConeClassLikeLookupTag?, () -> IdSignature?) -> I?,
createIrDeclaration: (parent: IrDeclarationParent?, origin: IrDeclarationOrigin) -> I,
createIrLazyDeclaration: (signature: IdSignature, lazyOwner: IrDeclarationParent, origin: IrDeclarationOrigin) -> I,
forceTopLevelPrivate: Boolean = false,
): IrSymbol {
val fir = firSymbol.fir as F
val irParent by lazy { findIrParent(fir) }
val signature by lazy { signatureComposer.composeSignature(fir, dispatchReceiverLookupTag) }
val signature by lazy { signatureComposer.composeSignature(fir, dispatchReceiverLookupTag, forceTopLevelPrivate) }
synchronized(symbolTable.lock) {
getCachedIrDeclaration(fir, dispatchReceiverLookupTag.takeIf { it !is ConeClassLookupTagWithFixedSymbol }) {
// Parent calculation provokes declaration calculation for some members from IrBuiltIns
@@ -14,8 +14,18 @@ import org.jetbrains.kotlin.ir.util.IdSignature
interface Fir2IrSignatureComposer {
val mangler: FirMangler
fun composeSignature(declaration: FirDeclaration, containingClass: ConeClassLikeLookupTag? = null): IdSignature?
fun composeAccessorSignature(property: FirProperty, isSetter: Boolean, containingClass: ConeClassLikeLookupTag? = null): IdSignature?
fun composeSignature(
declaration: FirDeclaration,
containingClass: ConeClassLikeLookupTag? = null,
forceTopLevelPrivate: Boolean = false
): IdSignature?
fun composeAccessorSignature(
property: FirProperty,
isSetter: Boolean,
containingClass: ConeClassLikeLookupTag? = null,
forceTopLevelPrivate: Boolean = false
): IdSignature?
fun composeTypeParameterSignature(typeParameter: FirTypeParameter, index: Int, containerSignature: IdSignature?): IdSignature?
fun withFileSignature(sig: IdSignature.FileSignature, body: () -> Unit)
}
@@ -7,9 +7,11 @@ package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData.SymbolKind
import org.jetbrains.kotlin.backend.common.serialization.kind
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.backend.generators.FakeOverrideGenerator
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.classId
import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
@@ -73,19 +75,22 @@ class FirIrProvider(val fir2IrComponents: Fir2IrComponents) : IrProvider {
val firCandidates: List<FirDeclaration>
val parent: IrDeclarationParent
var isTopLevelPrivate = false
if (nameSegments.size == 1 && kind != SymbolKind.CLASS_SYMBOL) {
firCandidates = symbolProvider.getTopLevelCallableSymbols(packageFqName, topName).map { it.fir }
parent = packageFragment // TODO: need to insert file facade class on JVM
} else {
var firParentClass: FirRegularClass? = null
var firClass = symbolProvider.getClassLikeSymbolByClassId(ClassId(packageFqName, topName))?.fir as? FirRegularClass
val topLevelClass = symbolProvider.getClassLikeSymbolByClassId(ClassId(packageFqName, topName))?.fir as? FirRegularClass
?: return null
var firParentClass: FirRegularClass? = null
var firClass = topLevelClass
val midSegments = if (kind == SymbolKind.CLASS_SYMBOL) nameSegments.drop(1) else nameSegments.drop(1).dropLast(1)
for (midName in midSegments) {
firParentClass = firClass
firClass = firClass.declarations.singleOrNull { (it as? FirRegularClass)?.name?.asString() == midName } as? FirRegularClass
?: return null
}
isTopLevelPrivate = topLevelClass.visibility == Visibilities.Private
val classId = firClass.classId
val scope =
firClass.unsubstitutedScope(fir2IrComponents.session, fir2IrComponents.scopeSession, withForcedTypeCalculator = true)
@@ -160,19 +165,24 @@ class FirIrProvider(val fir2IrComponents: Fir2IrComponents) : IrProvider {
?: return null
return when (kind) {
SymbolKind.CLASS_SYMBOL -> classifierStorage.getIrClassSymbol((firDeclaration as FirRegularClass).symbol).owner
SymbolKind.ENUM_ENTRY_SYMBOL -> classifierStorage.createIrEnumEntry(firDeclaration as FirEnumEntry, parent as IrClass)
SymbolKind.CLASS_SYMBOL -> classifierStorage.getIrClassSymbol(
(firDeclaration as FirRegularClass).symbol,
forceTopLevelPrivate = isTopLevelPrivate
).owner
SymbolKind.ENUM_ENTRY_SYMBOL -> classifierStorage.createIrEnumEntry(
firDeclaration as FirEnumEntry, parent as IrClass, forceTopLevelPrivate = isTopLevelPrivate
)
SymbolKind.CONSTRUCTOR_SYMBOL -> {
val firConstructor = firDeclaration as FirConstructor
declarationStorage.getOrCreateIrConstructor(firConstructor, parent as IrClass)
declarationStorage.getOrCreateIrConstructor(firConstructor, parent as IrClass, forceTopLevelPrivate = isTopLevelPrivate)
}
SymbolKind.FUNCTION_SYMBOL -> {
val firSimpleFunction = firDeclaration as FirSimpleFunction
declarationStorage.getOrCreateIrFunction(firSimpleFunction, parent)
declarationStorage.getOrCreateIrFunction(firSimpleFunction, parent, forceTopLevelPrivate = isTopLevelPrivate)
}
SymbolKind.PROPERTY_SYMBOL -> {
val firProperty = firDeclaration as FirProperty
declarationStorage.getOrCreateIrProperty(firProperty, parent)
declarationStorage.getOrCreateIrProperty(firProperty, parent, forceTopLevelPrivate = isTopLevelPrivate)
}
SymbolKind.FIELD_SYMBOL -> {
val firField = firDeclaration as FirField
@@ -35,7 +35,6 @@ import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.ir.util.parentAsClass
import org.jetbrains.kotlin.ir.util.withScope
import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities
import org.jetbrains.kotlin.name.Name
@@ -232,7 +231,8 @@ class FakeOverrideGenerator(
// have the same signature.
// Now we avoid this problem by signature caching,
// so both FIR overrides correspond to one IR fake override
signatureComposer.composeSignature(fakeOverrideFirDeclaration)
val isTopLevelPrivate = irClass.symbol.signature is IdSignature.CompositeSignature
signatureComposer.composeSignature(fakeOverrideFirDeclaration, forceTopLevelPrivate = isTopLevelPrivate)
}?.takeIf { it.parent == irClass }
?: createIrDeclaration(
fakeOverrideFirDeclaration,
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.ir.types.IrSimpleType
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
import org.jetbrains.kotlin.ir.util.DeserializableClass
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlin.utils.addIfNotNull
@@ -149,17 +150,18 @@ class Fir2IrLazyClass(
}
override val declarations: MutableList<IrDeclaration> by lazyVar(lock) {
val isTopLevelPrivate = symbol.signature is IdSignature.CompositeSignature
val result = mutableListOf<IrDeclaration>()
// NB: it's necessary to take all callables from scope,
// e.g. to avoid accessing un-enhanced Java declarations with FirJavaTypeRef etc. inside
val scope = fir.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true)
scope.processDeclaredConstructors {
result += declarationStorage.getIrConstructorSymbol(it).owner
result += declarationStorage.getIrConstructorSymbol(it, forceTopLevelPrivate = isTopLevelPrivate).owner
}
for (declaration in fir.declarations) {
if (declaration is FirRegularClass) {
val nestedSymbol = classifierStorage.getIrClassSymbol(declaration.symbol)
val nestedSymbol = classifierStorage.getIrClassSymbol(declaration.symbol, forceTopLevelPrivate = isTopLevelPrivate)
result += nestedSymbol.owner
}
}
@@ -174,7 +176,7 @@ class Fir2IrLazyClass(
if (declaration.source == null && declaration.origin != FirDeclarationOrigin.Java ||
declaration.source?.kind == KtFakeSourceElementKind.EnumGeneratedDeclaration
) {
result += declarationStorage.getIrFunctionSymbol(declaration.symbol).owner
result += declarationStorage.getIrFunctionSymbol(declaration.symbol, forceTopLevelPrivate = isTopLevelPrivate).owner
}
}
}
@@ -187,13 +189,15 @@ class Fir2IrLazyClass(
if (it.isAbstractMethodOfAny()) {
return@processFunctionsByName
}
result += declarationStorage.getIrFunctionSymbol(it).owner
result += declarationStorage.getIrFunctionSymbol(it, forceTopLevelPrivate = isTopLevelPrivate).owner
}
}
scope.processPropertiesByName(name) {
if (it.isSubstitutionOrIntersectionOverride) return@processPropertiesByName
if (it is FirPropertySymbol && it.dispatchReceiverClassOrNull() == ownerLookupTag) {
result.addIfNotNull(declarationStorage.getIrPropertySymbol(it).owner as? IrDeclaration)
result.addIfNotNull(
declarationStorage.getIrPropertySymbol(it, forceTopLevelPrivate = isTopLevelPrivate).owner as? IrDeclaration
)
}
}
}
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.util.IdSignature
class Fir2IrLazyProperty(
components: Fir2IrComponents,
@@ -160,7 +161,12 @@ class Fir2IrLazyProperty(
override var getter: IrSimpleFunction? by lazyVar(lock) {
if (fir.isConst) return@lazyVar null
val signature = signatureComposer.composeAccessorSignature(fir, isSetter = false, containingClass?.symbol?.toLookupTag())!!
val signature = signatureComposer.composeAccessorSignature(
fir,
isSetter = false,
containingClass?.symbol?.toLookupTag(),
forceTopLevelPrivate = symbol.signature is IdSignature.CompositeSignature
)!!
symbolTable.declareSimpleFunction(signature, symbolFactory = { Fir2IrSimpleFunctionSymbol(signature) }) { symbol ->
Fir2IrLazyPropertyAccessor(
components, startOffset, endOffset,
@@ -189,7 +195,12 @@ class Fir2IrLazyProperty(
override var setter: IrSimpleFunction? by lazyVar(lock) {
if (!fir.isVar) null
else {
val signature = signatureComposer.composeAccessorSignature(fir, isSetter = true, containingClass?.symbol?.toLookupTag())!!
val signature = signatureComposer.composeAccessorSignature(
fir,
isSetter = true,
containingClass?.symbol?.toLookupTag(),
forceTopLevelPrivate = symbol.signature is IdSignature.CompositeSignature
)!!
symbolTable.declareSimpleFunction(signature, symbolFactory = { Fir2IrSimpleFunctionSymbol(signature) }) { symbol ->
Fir2IrLazyPropertyAccessor(
components, startOffset, endOffset,
@@ -18,7 +18,6 @@ import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.name.ClassId
// @NoMutableState -- we'll restore this annotation once we get rid of withFileSignature().
class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignatureComposer {
@@ -76,7 +75,11 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
}
}
override fun composeSignature(declaration: FirDeclaration, containingClass: ConeClassLikeLookupTag?): IdSignature? {
override fun composeSignature(
declaration: FirDeclaration,
containingClass: ConeClassLikeLookupTag?,
forceTopLevelPrivate: Boolean
): IdSignature? {
if (declaration is FirAnonymousObject || declaration is FirAnonymousFunction) return null
if (declaration is FirRegularClass && declaration.classId.isLocal) return null
if (declaration is FirCallableDeclaration) {
@@ -118,7 +121,7 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
}
else -> error("Unsupported FIR declaration in signature composer: ${declaration.render()}")
}
return if (isTopLevelPrivate(declaration, containingClass)) {
return if (isTopLevelPrivate(declaration, containingClass) || forceTopLevelPrivate) {
val fileSig = fileSignature ?: return null
IdSignature.CompositeSignature(fileSig, publicSignature)
} else
@@ -140,11 +143,12 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
override fun composeAccessorSignature(
property: FirProperty,
isSetter: Boolean,
containingClass: ConeClassLikeLookupTag?
containingClass: ConeClassLikeLookupTag?,
forceTopLevelPrivate: Boolean
): IdSignature? {
val propSig: IdSignature.CommonSignature
val fileSig: IdSignature.FileSignature?
when (val propertySignature = composeSignature(property, containingClass)) {
when (val propertySignature = composeSignature(property, containingClass, forceTopLevelPrivate)) {
is IdSignature.CompositeSignature -> {
propSig = propertySignature.inner as? IdSignature.CommonSignature ?: return null
fileSig = propertySignature.container as? IdSignature.FileSignature ?: return null
@@ -175,7 +179,7 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
}
private fun isTopLevelPrivate(declaration: FirDeclaration, containingClass: ConeClassLikeLookupTag?): Boolean =
containingClass == null && declaration is FirCallableDeclaration && declaration.visibility == Visibilities.Private
containingClass == null && declaration is FirMemberDeclaration && declaration.visibility == Visibilities.Private
private fun FirProperty.getterOrDefault() =
getter ?: FirDefaultPropertyGetter(
@@ -3660,6 +3660,12 @@ public class FirBlackBoxInlineCodegenTestGenerated extends AbstractFirBlackBoxIn
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass.kt");
}
@Test
@TestMetadata("nestedInPrivateClass2.kt")
public void testNestedInPrivateClass2() throws Exception {
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass2.kt");
}
@Test
@TestMetadata("privateClass.kt")
public void testPrivateClass() throws Exception {
@@ -3660,6 +3660,12 @@ public class FirLightTreeBlackBoxInlineCodegenTestGenerated extends AbstractFirL
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass.kt");
}
@Test
@TestMetadata("nestedInPrivateClass2.kt")
public void testNestedInPrivateClass2() throws Exception {
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass2.kt");
}
@Test
@TestMetadata("privateClass.kt")
public void testPrivateClass() throws Exception {
@@ -3660,6 +3660,12 @@ public class FirSerializeCompileKotlinAgainstInlineKotlinTestGenerated extends A
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass.kt");
}
@Test
@TestMetadata("nestedInPrivateClass2.kt")
public void testNestedInPrivateClass2() throws Exception {
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass2.kt");
}
@Test
@TestMetadata("privateClass.kt")
public void testPrivateClass() throws Exception {
@@ -0,0 +1,32 @@
// FILE: 1.kt
package test
private class S public constructor() {
class Z {
fun a(): String {
return "K"
}
val empty = ""
}
enum class E(val s: String) {
EMPTY("")
}
}
// This function exposes S.Z and S.E, nested into a private class S (package-private in the byte code)
// They can be accessed outside the `test` package now that S.Z, S.E are public in the byte code, but that may be changed later
internal inline fun call(s: () -> String): String {
return s() + S.Z().empty + S.E.EMPTY.s + S.Z().a()
}
// FILE: 2.kt
import test.*
fun box(): String {
return call {
"O"
}
}
@@ -3660,6 +3660,12 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass.kt");
}
@Test
@TestMetadata("nestedInPrivateClass2.kt")
public void testNestedInPrivateClass2() throws Exception {
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass2.kt");
}
@Test
@TestMetadata("privateClass.kt")
public void testPrivateClass() throws Exception {
@@ -3660,6 +3660,12 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass.kt");
}
@Test
@TestMetadata("nestedInPrivateClass2.kt")
public void testNestedInPrivateClass2() throws Exception {
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass2.kt");
}
@Test
@TestMetadata("privateClass.kt")
public void testPrivateClass() throws Exception {
@@ -3660,6 +3660,12 @@ public class IrBlackBoxInlineCodegenTestGenerated extends AbstractIrBlackBoxInli
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass.kt");
}
@Test
@TestMetadata("nestedInPrivateClass2.kt")
public void testNestedInPrivateClass2() throws Exception {
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass2.kt");
}
@Test
@TestMetadata("privateClass.kt")
public void testPrivateClass() throws Exception {
@@ -3660,6 +3660,12 @@ public class IrCompileKotlinAgainstInlineKotlinTestGenerated extends AbstractIrC
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass.kt");
}
@Test
@TestMetadata("nestedInPrivateClass2.kt")
public void testNestedInPrivateClass2() throws Exception {
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass2.kt");
}
@Test
@TestMetadata("privateClass.kt")
public void testPrivateClass() throws Exception {
@@ -3660,6 +3660,12 @@ public class IrSerializeCompileKotlinAgainstInlineKotlinTestGenerated extends Ab
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass.kt");
}
@Test
@TestMetadata("nestedInPrivateClass2.kt")
public void testNestedInPrivateClass2() throws Exception {
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass2.kt");
}
@Test
@TestMetadata("privateClass.kt")
public void testPrivateClass() throws Exception {
@@ -3660,6 +3660,12 @@ public class JvmIrAgainstOldBoxInlineTestGenerated extends AbstractJvmIrAgainstO
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass.kt");
}
@Test
@TestMetadata("nestedInPrivateClass2.kt")
public void testNestedInPrivateClass2() throws Exception {
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass2.kt");
}
@Test
@TestMetadata("privateClass.kt")
public void testPrivateClass() throws Exception {
@@ -3660,6 +3660,12 @@ public class JvmOldAgainstIrBoxInlineTestGenerated extends AbstractJvmOldAgainst
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass.kt");
}
@Test
@TestMetadata("nestedInPrivateClass2.kt")
public void testNestedInPrivateClass2() throws Exception {
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass2.kt");
}
@Test
@TestMetadata("privateClass.kt")
public void testPrivateClass() throws Exception {
@@ -3276,6 +3276,12 @@ public class JsCodegenInlineTestGenerated extends AbstractJsCodegenInlineTest {
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass.kt");
}
@Test
@TestMetadata("nestedInPrivateClass2.kt")
public void testNestedInPrivateClass2() throws Exception {
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass2.kt");
}
@Test
@TestMetadata("privateClass.kt")
public void testPrivateClass() throws Exception {
@@ -3276,6 +3276,12 @@ public class IrJsCodegenInlineTestGenerated extends AbstractIrJsCodegenInlineTes
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass.kt");
}
@Test
@TestMetadata("nestedInPrivateClass2.kt")
public void testNestedInPrivateClass2() throws Exception {
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass2.kt");
}
@Test
@TestMetadata("privateClass.kt")
public void testPrivateClass() throws Exception {
@@ -3005,6 +3005,11 @@ public class IrCodegenBoxInlineWasmTestGenerated extends AbstractIrCodegenBoxInl
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass.kt");
}
@TestMetadata("nestedInPrivateClass2.kt")
public void testNestedInPrivateClass2() throws Exception {
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass2.kt");
}
@TestMetadata("privateClass.kt")
public void testPrivateClass() throws Exception {
runTest("compiler/testData/codegen/boxInline/private/privateClass.kt");
@@ -42100,6 +42100,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass.kt");
}
@Test
@TestMetadata("nestedInPrivateClass2.kt")
public void testNestedInPrivateClass2() throws Exception {
runTest("compiler/testData/codegen/boxInline/private/nestedInPrivateClass2.kt");
}
@Test
@TestMetadata("privateClass.kt")
public void testPrivateClass() throws Exception {