From 39bba7973c93488c64b89c0886af97334161542c Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Fri, 25 Mar 2022 22:24:43 +0300 Subject: [PATCH] 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. --- .../fir/backend/Fir2IrClassifierStorage.kt | 9 +-- .../fir/backend/Fir2IrDeclarationStorage.kt | 67 +++++++++++++------ .../fir/backend/Fir2IrSignatureComposer.kt | 14 +++- .../kotlin/fir/backend/FirIrProvider.kt | 24 +++++-- .../generators/FakeOverrideGenerator.kt | 4 +- .../kotlin/fir/lazy/Fir2IrLazyClass.kt | 14 ++-- .../kotlin/fir/lazy/Fir2IrLazyProperty.kt | 15 ++++- .../signaturer/FirBasedSignatureComposer.kt | 16 +++-- ...FirBlackBoxInlineCodegenTestGenerated.java | 6 ++ ...reeBlackBoxInlineCodegenTestGenerated.java | 6 ++ ...otlinAgainstInlineKotlinTestGenerated.java | 6 ++ .../private/nestedInPrivateClass2.kt | 32 +++++++++ .../BlackBoxInlineCodegenTestGenerated.java | 6 ++ ...otlinAgainstInlineKotlinTestGenerated.java | 6 ++ .../IrBlackBoxInlineCodegenTestGenerated.java | 6 ++ ...otlinAgainstInlineKotlinTestGenerated.java | 6 ++ ...otlinAgainstInlineKotlinTestGenerated.java | 6 ++ ...JvmIrAgainstOldBoxInlineTestGenerated.java | 6 ++ ...JvmOldAgainstIrBoxInlineTestGenerated.java | 6 ++ .../js/test/JsCodegenInlineTestGenerated.java | 6 ++ .../ir/IrJsCodegenInlineTestGenerated.java | 6 ++ .../IrCodegenBoxInlineWasmTestGenerated.java | 5 ++ .../NativeCodegenBoxTestGenerated.java | 6 ++ 23 files changed, 230 insertions(+), 48 deletions(-) create mode 100644 compiler/testData/codegen/boxInline/private/nestedInPrivateClass2.kt 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 {