diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt index e5395201e4c..1a346e24d3e 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.backend.common.actualizer.FakeOverrideRebuilder import org.jetbrains.kotlin.backend.common.sourceElement import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.fir.* @@ -233,7 +234,13 @@ class Fir2IrConverter( irClass.declarations.addAll(classifierStorage.getFieldsWithContextReceiversForClass(irClass, klass)) val irConstructor = klass.primaryConstructorIfAny(session)?.let { - declarationStorage.getOrCreateIrConstructor(it.fir, irClass, isLocal = klass.isLocal) + if (klass.classKind == ClassKind.ANNOTATION_CLASS) { + // TODO: this branch should be removed after fix of KT-62856 + @OptIn(GetOrCreateSensitiveAPI::class) + declarationStorage.getOrCreateIrConstructor(it.fir, irClass, isLocal = klass.isLocal) + } else { + declarationStorage.createAndCacheIrConstructor(it.fir, { irClass }, isLocal = klass.isLocal) + } } // At least on enum entry creation we may need a default constructor, so ctors should be converted first for (declaration in syntheticPropertiesLast(allDeclarations)) { @@ -532,7 +539,14 @@ class Fir2IrConverter( } } is FirConstructor -> if (!declaration.isPrimary) { - declarationStorage.getOrCreateIrConstructor(declaration, parent as IrClass, isLocal = isInLocalClass) + // the primary constructor was already created in `processClassMembers` function + if (containingClass?.classKind == ClassKind.ANNOTATION_CLASS) { + // TODO: this branch should be removed after fix of KT-62856 + @OptIn(GetOrCreateSensitiveAPI::class) + declarationStorage.getOrCreateIrConstructor(declaration, parent as IrClass, isLocal = isInLocalClass) + } else { + declarationStorage.createAndCacheIrConstructor(declaration, { parent as IrClass }, isLocal = isInLocalClass) + } } is FirEnumEntry -> { classifierStorage.getOrCreateIrEnumEntry(declaration, parent as IrClass) 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 118f0cb5d72..d4490e9ce6d 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 @@ -375,6 +375,7 @@ class Fir2IrDeclarationStorage( } } + @GetOrCreateSensitiveAPI fun getOrCreateIrConstructor( constructor: FirConstructor, irParent: IrClass, @@ -384,6 +385,7 @@ class Fir2IrDeclarationStorage( return getOrCreateIrConstructor(constructor, { irParent }, predefinedOrigin, isLocal) } + @GetOrCreateSensitiveAPI private fun getOrCreateIrConstructor( constructor: FirConstructor, irParent: () -> IrClass, @@ -391,6 +393,15 @@ class Fir2IrDeclarationStorage( isLocal: Boolean = false, ): IrConstructor { getCachedIrConstructorSymbol(constructor)?.ownerIfBound()?.let { return it } + return createAndCacheIrConstructor(constructor, irParent, predefinedOrigin, isLocal) + } + + fun createAndCacheIrConstructor( + constructor: FirConstructor, + irParent: () -> IrClass, + predefinedOrigin: IrDeclarationOrigin? = null, + isLocal: Boolean = false, + ): IrConstructor { // caching of created constructor is not called here, because `callablesGenerator` calls `cacheIrConstructor` by itself return callablesGenerator.createIrConstructor(constructor, irParent(), predefinedOrigin, isLocal) } @@ -400,6 +411,7 @@ class Fir2IrDeclarationStorage( constructorCache[constructor] = irConstructor.symbol } + @OptIn(GetOrCreateSensitiveAPI::class) fun getIrConstructorSymbol(firConstructorSymbol: FirConstructorSymbol): IrConstructorSymbol { val fir = firConstructorSymbol.fir return getOrCreateIrConstructor(fir, { findIrParent(fir, fakeOverrideOwnerLookupTag = null) as IrClass }).symbol 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 3bc6f74b032..99973e87a11 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 @@ -160,6 +160,7 @@ class FirIrProvider(val components: Fir2IrComponents) : IrProvider { val firDeclaration = findDeclarationByHash(firCandidates, signature.id) ?: return null val parent = parentClass ?: declarationStorage.getIrExternalPackageFragment(packageFqName, firDeclaration.moduleData) + @OptIn(GetOrCreateSensitiveAPI::class) return when (kind) { SymbolKind.CLASS_SYMBOL -> { classifierStorage.getOrCreateIrClass((firDeclaration as FirRegularClass).symbol) @@ -173,7 +174,6 @@ class FirIrProvider(val components: Fir2IrComponents) : IrProvider { } SymbolKind.FUNCTION_SYMBOL -> { val firSimpleFunction = firDeclaration as FirSimpleFunction - @OptIn(GetOrCreateSensitiveAPI::class) declarationStorage.getOrCreateIrFunction(firSimpleFunction, parent) } SymbolKind.PROPERTY_SYMBOL -> { 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 235f033ef24..d81eec23c68 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 @@ -162,6 +162,7 @@ class Fir2IrLazyClass( scope.processDeclaredConstructors { val constructor = it.fir if (shouldBuildStub(constructor)) { + @OptIn(GetOrCreateSensitiveAPI::class) result += declarationStorage.getOrCreateIrConstructor(constructor, this, origin) } }