diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index 7fb3fd438e0..1191a3a3c6b 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -26,14 +26,8 @@ import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.impl.* -import org.jetbrains.kotlin.fir.types.ConeClassLikeType -import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef -import org.jetbrains.kotlin.fir.types.FirTypeRef -import org.jetbrains.kotlin.fir.types.impl.FirImplicitBooleanTypeRef -import org.jetbrains.kotlin.fir.types.impl.FirImplicitNothingTypeRef -import org.jetbrains.kotlin.fir.types.impl.FirImplicitStringTypeRef -import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitTypeRef -import org.jetbrains.kotlin.fir.types.render +import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.fir.types.impl.* import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement @@ -199,7 +193,7 @@ internal class Fir2IrVisitor( } private fun FirClass.getPrimaryConstructorIfAny(): FirConstructor? = - (declarations.firstOrNull() as? FirConstructor)?.takeIf { it.isPrimary } + declarations.filterIsInstance().firstOrNull()?.takeIf { it.isPrimary } private fun IrClass.addFakeOverrides(klass: FirClass, processedFunctionNames: MutableList) { if (fakeOverrideMode == FakeOverrideMode.NONE) return @@ -693,13 +687,19 @@ internal class Fir2IrVisitor( } private fun FirAnnotationCall.toIrExpression(): IrExpression { - val type = (annotationTypeRef as? FirResolvedTypeRef)?.type?.toIrType(this@Fir2IrVisitor.session, declarationStorage) + val coneType = (annotationTypeRef as? FirResolvedTypeRef)?.type as? ConeLookupTagBasedType + val firSymbol = coneType?.lookupTag?.toSymbol(session) as? FirClassSymbol + val type = coneType?.toIrType(this@Fir2IrVisitor.session, declarationStorage) val symbol = type?.classifierOrNull return convertWithOffsets { startOffset, endOffset -> when (symbol) { is IrClassSymbol -> { val irClass = symbol.owner - val irConstructor = irClass.constructors.firstOrNull() + val irConstructor = firSymbol?.fir?.getPrimaryConstructorIfAny()?.let { firConstructor -> + declarationStorage.getIrConstructor(firConstructor, irParent = irClass, shouldLeaveScope = true) + }?.apply { + this.parent = irClass + } if (irConstructor == null) { IrErrorCallExpressionImpl(startOffset, endOffset, type, "No annotation constructor found: ${irClass.name}") } else { diff --git a/compiler/testData/ir/irText/declarations/annotations/fileAnnotations.fir.txt b/compiler/testData/ir/irText/declarations/annotations/fileAnnotations.fir.txt index 8d6c4e8d8fa..4a492374710 100644 --- a/compiler/testData/ir/irText/declarations/annotations/fileAnnotations.fir.txt +++ b/compiler/testData/ir/irText/declarations/annotations/fileAnnotations.fir.txt @@ -2,6 +2,8 @@ FILE fqName:test fileName:/fileAnnotations.kt annotations: A(x = 'File annotation') CLASS ANNOTATION_CLASS name:A modality:FINAL visibility:public superTypes:[kotlin.Annotation] + annotations: + Target(allowedTargets = GET_OBJECT 'CLASS ENUM_ENTRY name:FILE modality:FINAL visibility:unknown superTypes:[]' type=kotlin.annotation.AnnotationTarget) $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:test.A CONSTRUCTOR visibility:public <> (x:kotlin.String) returnType:test.A [primary] VALUE_PARAMETER name:x index:0 type:kotlin.String diff --git a/compiler/testData/ir/irText/declarations/annotations/typeAliasesWithAnnotations.fir.txt b/compiler/testData/ir/irText/declarations/annotations/typeAliasesWithAnnotations.fir.txt index 454eb3be5e0..63078c2b633 100644 --- a/compiler/testData/ir/irText/declarations/annotations/typeAliasesWithAnnotations.fir.txt +++ b/compiler/testData/ir/irText/declarations/annotations/typeAliasesWithAnnotations.fir.txt @@ -1,5 +1,7 @@ FILE fqName: fileName:/typeAliasesWithAnnotations.kt CLASS ANNOTATION_CLASS name:TestAnn modality:FINAL visibility:public superTypes:[kotlin.Annotation] + annotations: + Target(allowedTargets = GET_OBJECT 'CLASS ENUM_ENTRY name:TYPEALIAS modality:FINAL visibility:unknown superTypes:[]' type=kotlin.annotation.AnnotationTarget) $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.TestAnn CONSTRUCTOR visibility:public <> (x:kotlin.String) returnType:.TestAnn [primary] VALUE_PARAMETER name:x index:0 type:kotlin.String diff --git a/compiler/testData/ir/irText/declarations/annotations/typeParametersWithAnnotations.fir.txt b/compiler/testData/ir/irText/declarations/annotations/typeParametersWithAnnotations.fir.txt index f9ffd632a69..35656ccc21c 100644 --- a/compiler/testData/ir/irText/declarations/annotations/typeParametersWithAnnotations.fir.txt +++ b/compiler/testData/ir/irText/declarations/annotations/typeParametersWithAnnotations.fir.txt @@ -1,5 +1,7 @@ FILE fqName: fileName:/typeParametersWithAnnotations.kt CLASS ANNOTATION_CLASS name:Anno modality:FINAL visibility:public superTypes:[kotlin.Annotation] + annotations: + Target(allowedTargets = GET_OBJECT 'CLASS ENUM_ENTRY name:TYPE_PARAMETER modality:FINAL visibility:unknown superTypes:[]' type=kotlin.annotation.AnnotationTarget) $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.Anno CONSTRUCTOR visibility:public <> () returnType:.Anno [primary] FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean diff --git a/compiler/testData/ir/irText/declarations/fileWithAnnotations.fir.txt b/compiler/testData/ir/irText/declarations/fileWithAnnotations.fir.txt deleted file mode 100644 index 6577c27a9cb..00000000000 --- a/compiler/testData/ir/irText/declarations/fileWithAnnotations.fir.txt +++ /dev/null @@ -1,12 +0,0 @@ -FILE fqName: fileName:/fileWithAnnotations.kt - FUN name:foo visibility:public modality:FINAL <> () returnType:kotlin.Unit - BLOCK_BODY - PROPERTY name:bar visibility:public modality:FINAL [val] - FIELD PROPERTY_BACKING_FIELD name:bar type:kotlin.Int visibility:public [final,static] - EXPRESSION_BODY - CONST Int type=kotlin.Int value=42 - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Int - correspondingProperty: PROPERTY name:bar visibility:public modality:FINAL [val] - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in ' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:bar type:kotlin.Int visibility:public [final,static]' type=kotlin.Int origin=null diff --git a/compiler/testData/ir/irText/declarations/fileWithAnnotations.kt b/compiler/testData/ir/irText/declarations/fileWithAnnotations.kt index 9a773aa6858..0e0f4174bbb 100644 --- a/compiler/testData/ir/irText/declarations/fileWithAnnotations.kt +++ b/compiler/testData/ir/irText/declarations/fileWithAnnotations.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // WITH_RUNTIME @file:JvmName("FileWithAnnotations")