diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrBuiltIns.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrBuiltIns.kt index d5abf92ec9f..1078daae957 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrBuiltIns.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrBuiltIns.kt @@ -6,6 +6,9 @@ package org.jetbrains.kotlin.fir.backend import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider +import org.jetbrains.kotlin.fir.scopes.getDeclaredConstructors +import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope +import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl @@ -17,45 +20,69 @@ import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance class Fir2IrBuiltIns( private val components: Fir2IrComponents, - private val provider: Fir2IrSpecialSymbolProvider? + private val provider: Fir2IrSpecialSymbolProvider ) : Fir2IrComponents by components { init { - provider?.initComponents(components) + provider.initComponents(components) } - private val enhancedNullabilityAnnotationSymbol by lazy { - annotationSymbolById(StandardClassIds.Annotations.EnhancedNullability) + // ---------------------- special annotations ---------------------- + + private val enhancedNullabilityAnnotationIrSymbol by lazy { + specialAnnotationIrSymbolById(StandardClassIds.Annotations.EnhancedNullability) } internal fun enhancedNullabilityAnnotationConstructorCall(): IrConstructorCall? = - enhancedNullabilityAnnotationSymbol?.toConstructorCall() + enhancedNullabilityAnnotationIrSymbol?.toConstructorCall() private val flexibleNullabilityAnnotationSymbol by lazy { - annotationSymbolById(StandardClassIds.Annotations.FlexibleNullability) + specialAnnotationIrSymbolById(StandardClassIds.Annotations.FlexibleNullability) } internal fun flexibleNullabilityAnnotationConstructorCall(): IrConstructorCall? = flexibleNullabilityAnnotationSymbol?.toConstructorCall() - private val extensionFunctionTypeAnnotationSymbol by lazy { - annotationSymbolById(StandardClassIds.Annotations.ExtensionFunctionType) - } - - internal fun extensionFunctionTypeAnnotationConstructorCall(): IrConstructorCall? = - extensionFunctionTypeAnnotationSymbol?.toConstructorCall() - private val rawTypeAnnotationSymbol by lazy { - annotationSymbolById(StandardClassIds.Annotations.RawTypeAnnotation) + specialAnnotationIrSymbolById(StandardClassIds.Annotations.RawTypeAnnotation) } internal fun rawTypeAnnotationConstructorCall(): IrConstructorCall? = rawTypeAnnotationSymbol?.toConstructorCall() - private fun annotationSymbolById(id: ClassId): IrClassSymbol? = - provider?.getClassSymbolById(id) ?: session.symbolProvider.getClassLikeSymbolByClassId(id)?.toSymbol( - ConversionTypeContext.DEFAULT - ) as? IrClassSymbol + // ---------------------- regular annotations ---------------------- - private fun IrClassSymbol.toConstructorCall(): IrConstructorCallImpl = - IrConstructorCallImpl.fromSymbolOwner(defaultType, owner.declarations.firstIsInstance().symbol) + private val extensionFunctionTypeAnnotationFirSymbol by lazy { + regularAnnotationFirSymbolById(StandardClassIds.Annotations.ExtensionFunctionType) + } + + private val extensionFunctionTypeAnnotationSymbol by lazy { + extensionFunctionTypeAnnotationFirSymbol?.toSymbol(ConversionTypeContext.DEFAULT) as? IrClassSymbol + } + + internal fun extensionFunctionTypeAnnotationConstructorCall(): IrConstructorCall? = + extensionFunctionTypeAnnotationSymbol?.toConstructorCall(extensionFunctionTypeAnnotationFirSymbol!!) + + // ---------------------- utils ---------------------- + + private fun specialAnnotationIrSymbolById(classId: ClassId): IrClassSymbol? { + return provider.getClassSymbolById(classId) + } + + private fun regularAnnotationFirSymbolById(id: ClassId): FirRegularClassSymbol? { + return session.symbolProvider.getClassLikeSymbolByClassId(id) as? FirRegularClassSymbol + } + + private fun IrClassSymbol.toConstructorCall(firSymbol: FirRegularClassSymbol? = null): IrConstructorCallImpl? { + val constructorSymbol = if (firSymbol == null) { + owner.declarations.firstIsInstance().symbol + } else { + val firConstructorSymbol = firSymbol.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true) + .getDeclaredConstructors() + .singleOrNull() + ?: return null + + declarationStorage.getIrConstructorSymbol(firConstructorSymbol) + } + return IrConstructorCallImpl.fromSymbolOwner(defaultType, constructorSymbol) + } } 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 313bccf1b94..35ccd32af34 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 @@ -425,7 +425,7 @@ class Fir2IrConverter( irMangler: KotlinMangler.IrMangler, irFactory: IrFactory, visibilityConverter: Fir2IrVisibilityConverter, - specialSymbolProvider: Fir2IrSpecialSymbolProvider?, + specialSymbolProvider: Fir2IrSpecialSymbolProvider, irGenerationExtensions: Collection ): Fir2IrResult { val moduleDescriptor = FirModuleDescriptor(session)