FIR2IR: fix library annotation call generation

This commit is contained in:
Mikhail Glukhikh
2019-08-22 13:43:28 +03:00
parent 27ccff12c1
commit 6f785ec881
6 changed files with 18 additions and 23 deletions
@@ -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<FirConstructor>().firstOrNull()?.takeIf { it.isPrimary }
private fun IrClass.addFakeOverrides(klass: FirClass, processedFunctionNames: MutableList<Name>) {
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 {
@@ -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:<this> type:test.A
CONSTRUCTOR visibility:public <> (x:kotlin.String) returnType:test.A [primary]
VALUE_PARAMETER name:x index:0 type:kotlin.String
@@ -1,5 +1,7 @@
FILE fqName:<root> 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:<this> type:<root>.TestAnn
CONSTRUCTOR visibility:public <> (x:kotlin.String) returnType:<root>.TestAnn [primary]
VALUE_PARAMETER name:x index:0 type:kotlin.String
@@ -1,5 +1,7 @@
FILE fqName:<root> 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:<this> type:<root>.Anno
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
@@ -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
@file:JvmName("FileWithAnnotations")