diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt index 5ad491fc2a8..982100f3872 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt @@ -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 diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index de86a3c0f61..e9625c0fac4 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -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 diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrSignatureComposer.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrSignatureComposer.kt index 4db932d22bc..be71bbbdf21 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrSignatureComposer.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrSignatureComposer.kt @@ -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) } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/FirIrProvider.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/FirIrProvider.kt index 990206cf019..14830a99f76 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/FirIrProvider.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/FirIrProvider.kt @@ -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 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 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 e6519c6d537..d6d8c9b368d 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 @@ -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, diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt index 97863bed85d..10304fbcdda 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt @@ -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 by lazyVar(lock) { + val isTopLevelPrivate = symbol.signature is IdSignature.CompositeSignature val result = mutableListOf() // 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 + ) } } } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt index 06ff88dc626..78ace9414fa 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt @@ -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, diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt index 800dc23c532..0853d3c6eef 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt @@ -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( diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxInlineCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxInlineCodegenTestGenerated.java index a8e5d2d02fa..8babd873cf6 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxInlineCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxInlineCodegenTestGenerated.java @@ -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 { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxInlineCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxInlineCodegenTestGenerated.java index 7ca5784e5a6..04e7c74aaa3 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxInlineCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxInlineCodegenTestGenerated.java @@ -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 { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirSerializeCompileKotlinAgainstInlineKotlinTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirSerializeCompileKotlinAgainstInlineKotlinTestGenerated.java index cc4d5ea290c..d8f9aa1e0f9 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirSerializeCompileKotlinAgainstInlineKotlinTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirSerializeCompileKotlinAgainstInlineKotlinTestGenerated.java @@ -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 { diff --git a/compiler/testData/codegen/boxInline/private/nestedInPrivateClass2.kt b/compiler/testData/codegen/boxInline/private/nestedInPrivateClass2.kt new file mode 100644 index 00000000000..ef3bcc4c76e --- /dev/null +++ b/compiler/testData/codegen/boxInline/private/nestedInPrivateClass2.kt @@ -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" + } +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxInlineCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxInlineCodegenTestGenerated.java index 51e95af9db3..69237c6b3b3 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxInlineCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxInlineCodegenTestGenerated.java @@ -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 { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java index bedbd3bb0ce..be43efe9531 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java @@ -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 { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxInlineCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxInlineCodegenTestGenerated.java index 4cb180be451..c1225a4723c 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxInlineCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxInlineCodegenTestGenerated.java @@ -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 { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrCompileKotlinAgainstInlineKotlinTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrCompileKotlinAgainstInlineKotlinTestGenerated.java index b078820b24e..3dbcd236641 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrCompileKotlinAgainstInlineKotlinTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrCompileKotlinAgainstInlineKotlinTestGenerated.java @@ -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 { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrSerializeCompileKotlinAgainstInlineKotlinTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrSerializeCompileKotlinAgainstInlineKotlinTestGenerated.java index 9c900512df7..4633fecfd66 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrSerializeCompileKotlinAgainstInlineKotlinTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrSerializeCompileKotlinAgainstInlineKotlinTestGenerated.java @@ -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 { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/JvmIrAgainstOldBoxInlineTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/JvmIrAgainstOldBoxInlineTestGenerated.java index e91e70f0bbf..f8a6587a9df 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/JvmIrAgainstOldBoxInlineTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/JvmIrAgainstOldBoxInlineTestGenerated.java @@ -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 { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/JvmOldAgainstIrBoxInlineTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/JvmOldAgainstIrBoxInlineTestGenerated.java index 7cefa0f89cd..6be0fe19ac8 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/JvmOldAgainstIrBoxInlineTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/JvmOldAgainstIrBoxInlineTestGenerated.java @@ -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 { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenInlineTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenInlineTestGenerated.java index f794d9e613b..fb9b70108f7 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenInlineTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenInlineTestGenerated.java @@ -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 { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenInlineTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenInlineTestGenerated.java index 294019d34e3..957b8e1161b 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenInlineTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenInlineTestGenerated.java @@ -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 { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxInlineWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxInlineWasmTestGenerated.java index 8d4ba2cff47..6f03ff31af9 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxInlineWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxInlineWasmTestGenerated.java @@ -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"); diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java index 0c1f85f2542..403e303f64b 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java @@ -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 {