FIR2IR: fix library annotation call generation
This commit is contained in:
@@ -26,14 +26,8 @@ import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
|||||||
import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope
|
import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTagImpl
|
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTagImpl
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
import org.jetbrains.kotlin.fir.types.impl.*
|
||||||
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.visitors.FirVisitor
|
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
@@ -199,7 +193,7 @@ internal class Fir2IrVisitor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun FirClass.getPrimaryConstructorIfAny(): FirConstructor? =
|
private fun FirClass.getPrimaryConstructorIfAny(): FirConstructor? =
|
||||||
(declarations.firstOrNull() as? FirConstructor)?.takeIf { it.isPrimary }
|
declarations.filterIsInstance<FirConstructor>().firstOrNull()?.takeIf { it.isPrimary }
|
||||||
|
|
||||||
private fun IrClass.addFakeOverrides(klass: FirClass, processedFunctionNames: MutableList<Name>) {
|
private fun IrClass.addFakeOverrides(klass: FirClass, processedFunctionNames: MutableList<Name>) {
|
||||||
if (fakeOverrideMode == FakeOverrideMode.NONE) return
|
if (fakeOverrideMode == FakeOverrideMode.NONE) return
|
||||||
@@ -693,13 +687,19 @@ internal class Fir2IrVisitor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun FirAnnotationCall.toIrExpression(): IrExpression {
|
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
|
val symbol = type?.classifierOrNull
|
||||||
return convertWithOffsets { startOffset, endOffset ->
|
return convertWithOffsets { startOffset, endOffset ->
|
||||||
when (symbol) {
|
when (symbol) {
|
||||||
is IrClassSymbol -> {
|
is IrClassSymbol -> {
|
||||||
val irClass = symbol.owner
|
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) {
|
if (irConstructor == null) {
|
||||||
IrErrorCallExpressionImpl(startOffset, endOffset, type, "No annotation constructor found: ${irClass.name}")
|
IrErrorCallExpressionImpl(startOffset, endOffset, type, "No annotation constructor found: ${irClass.name}")
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ FILE fqName:test fileName:/fileAnnotations.kt
|
|||||||
annotations:
|
annotations:
|
||||||
A(x = 'File annotation')
|
A(x = 'File annotation')
|
||||||
CLASS ANNOTATION_CLASS name:A modality:FINAL visibility:public superTypes:[kotlin.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:<this> type:test.A
|
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:test.A
|
||||||
CONSTRUCTOR visibility:public <> (x:kotlin.String) returnType:test.A [primary]
|
CONSTRUCTOR visibility:public <> (x:kotlin.String) returnType:test.A [primary]
|
||||||
VALUE_PARAMETER name:x index:0 type:kotlin.String
|
VALUE_PARAMETER name:x index:0 type:kotlin.String
|
||||||
|
|||||||
+2
@@ -1,5 +1,7 @@
|
|||||||
FILE fqName:<root> fileName:/typeAliasesWithAnnotations.kt
|
FILE fqName:<root> fileName:/typeAliasesWithAnnotations.kt
|
||||||
CLASS ANNOTATION_CLASS name:TestAnn modality:FINAL visibility:public superTypes:[kotlin.Annotation]
|
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:<this> type:<root>.TestAnn
|
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.TestAnn
|
||||||
CONSTRUCTOR visibility:public <> (x:kotlin.String) returnType:<root>.TestAnn [primary]
|
CONSTRUCTOR visibility:public <> (x:kotlin.String) returnType:<root>.TestAnn [primary]
|
||||||
VALUE_PARAMETER name:x index:0 type:kotlin.String
|
VALUE_PARAMETER name:x index:0 type:kotlin.String
|
||||||
|
|||||||
+2
@@ -1,5 +1,7 @@
|
|||||||
FILE fqName:<root> fileName:/typeParametersWithAnnotations.kt
|
FILE fqName:<root> fileName:/typeParametersWithAnnotations.kt
|
||||||
CLASS ANNOTATION_CLASS name:Anno modality:FINAL visibility:public superTypes:[kotlin.Annotation]
|
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:<this> type:<root>.Anno
|
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.Anno
|
||||||
CONSTRUCTOR visibility:public <> () returnType:<root>.Anno [primary]
|
CONSTRUCTOR visibility:public <> () returnType:<root>.Anno [primary]
|
||||||
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean
|
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
FILE fqName:<root> 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:<get-bar> 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 <get-bar> (): kotlin.Int declared in <root>'
|
|
||||||
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:bar type:kotlin.Int visibility:public [final,static]' type=kotlin.Int origin=null
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
@file:JvmName("FileWithAnnotations")
|
@file:JvmName("FileWithAnnotations")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user