[FIR2IR] Create IrConst instead of IrGetField for default value param in annotation class, ^KT-52676 Fixed

This commit is contained in:
Ivan Kochurkin
2022-06-08 00:59:46 +03:00
committed by teamcity
parent ca222b9c31
commit 157eedca43
8 changed files with 107 additions and 12 deletions
@@ -448,14 +448,23 @@ class Fir2IrVisitor(
}
override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: Any?): IrElement {
val explicitReceiverExpression = convertToIrReceiverExpression(
qualifiedAccessExpression.explicitReceiver, qualifiedAccessExpression.calleeReference
)
return callGenerator.convertToIrCall(qualifiedAccessExpression, qualifiedAccessExpression.typeRef, explicitReceiverExpression)
return convertQualifiedAccessExpression(qualifiedAccessExpression)
}
override fun visitPropertyAccessExpression(propertyAccessExpression: FirPropertyAccessExpression, data: Any?): IrElement {
return visitQualifiedAccessExpression(propertyAccessExpression, data)
return convertQualifiedAccessExpression(propertyAccessExpression)
}
private fun convertQualifiedAccessExpression(
qualifiedAccessExpression: FirQualifiedAccessExpression,
annotationMode: Boolean = false
) : IrExpression {
val explicitReceiverExpression = convertToIrReceiverExpression(
qualifiedAccessExpression.explicitReceiver, qualifiedAccessExpression.calleeReference
)
return callGenerator.convertToIrCall(
qualifiedAccessExpression, qualifiedAccessExpression.typeRef, explicitReceiverExpression, annotationMode = annotationMode
)
}
// Note that this mimics psi2ir [StatementGenerator#isThisForClassPhysicallyAvailable].
@@ -621,9 +630,10 @@ class Fir2IrVisitor(
val unwrappedExpression = expression.unwrapArgument()
if (annotationMode) {
when (unwrappedExpression) {
is FirFunctionCall -> convertToIrCall(unwrappedExpression, annotationMode)
is FirArrayOfCall -> convertToArrayOfCall(unwrappedExpression, annotationMode)
is FirFunctionCall -> convertToIrCall(unwrappedExpression, true)
is FirArrayOfCall -> convertToArrayOfCall(unwrappedExpression, true)
is FirCallableReferenceAccess -> convertCallableReferenceAccess(unwrappedExpression, isDelegate)
is FirQualifiedAccessExpression -> convertQualifiedAccessExpression(unwrappedExpression, true)
else -> expression.accept(this, null) as IrExpression
}
} else {
@@ -480,11 +480,19 @@ class CallAndReferenceGenerator(
)
}
}
is IrFieldSymbol -> IrGetFieldImpl(
startOffset, endOffset, symbol, type,
origin = IrStatementOrigin.GET_PROPERTY.takeIf { calleeReference !is FirDelegateFieldReference },
superQualifierSymbol = dispatchReceiver.superQualifierSymbolForField(symbol)
)
is IrFieldSymbol -> if (annotationMode) {
val resolvedSymbol = calleeReference.resolvedSymbol ?: error("should have resolvedSymbol")
val returnType = (resolvedSymbol as FirCallableSymbol<*>).resolvedReturnTypeRef.toIrType()
val firConstExpression = (resolvedSymbol.fir as FirVariable).initializer as? FirConstExpression<*>
?: error("should be FirConstExpression")
firConstExpression.toIrConst(returnType)
} else {
IrGetFieldImpl(
startOffset, endOffset, symbol, type,
origin = IrStatementOrigin.GET_PROPERTY.takeIf { calleeReference !is FirDelegateFieldReference },
superQualifierSymbol = dispatchReceiver.superQualifierSymbolForField(symbol)
)
}
is IrValueSymbol -> {
IrGetValueImpl(
startOffset, endOffset, type, symbol,
@@ -561,6 +561,12 @@ public class Fir2IrTextTestGenerated extends AbstractFir2IrTextTest {
runTest("compiler/testData/ir/irText/declarations/annotations/annotationsWithVarargParameters.kt");
}
@Test
@TestMetadata("argWithDefaultValueInAnnotationClass.kt")
public void testArgWithDefaultValueInAnnotationClass() throws Exception {
runTest("compiler/testData/ir/irText/declarations/annotations/argWithDefaultValueInAnnotationClass.kt");
}
@Test
@TestMetadata("arrayInAnnotationArguments.kt")
public void testArrayInAnnotationArguments() throws Exception {
@@ -561,6 +561,12 @@ public class LightTreeFir2IrTextTestGenerated extends AbstractLightTreeFir2IrTex
runTest("compiler/testData/ir/irText/declarations/annotations/annotationsWithVarargParameters.kt");
}
@Test
@TestMetadata("argWithDefaultValueInAnnotationClass.kt")
public void testArgWithDefaultValueInAnnotationClass() throws Exception {
runTest("compiler/testData/ir/irText/declarations/annotations/argWithDefaultValueInAnnotationClass.kt");
}
@Test
@TestMetadata("arrayInAnnotationArguments.kt")
public void testArrayInAnnotationArguments() throws Exception {
@@ -0,0 +1,34 @@
FILE fqName:<root> fileName:/main.kt
CLASS ANNOTATION_CLASS name:ModuleInfo modality:OPEN visibility:public superTypes:[kotlin.Annotation]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.ModuleInfo
CONSTRUCTOR visibility:public <> (keyBind:kotlin.Int) returnType:<root>.ModuleInfo [primary]
VALUE_PARAMETER name:keyBind index:0 type:kotlin.Int
EXPRESSION_BODY
CONST Int type=kotlin.Int value=1234
BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any'
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS ANNOTATION_CLASS name:ModuleInfo modality:OPEN visibility:public superTypes:[kotlin.Annotation]'
PROPERTY name:keyBind visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:keyBind type:kotlin.Int visibility:private [final]
EXPRESSION_BODY
GET_VAR 'keyBind: kotlin.Int declared in <root>.ModuleInfo.<init>' type=kotlin.Int origin=INITIALIZE_PROPERTY_FROM_PARAMETER
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-keyBind> visibility:public modality:FINAL <> ($this:<root>.ModuleInfo) returnType:kotlin.Int
correspondingProperty: PROPERTY name:keyBind visibility:public modality:FINAL [val]
$this: VALUE_PARAMETER name:<this> type:<root>.ModuleInfo
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-keyBind> (): kotlin.Int declared in <root>.ModuleInfo'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:keyBind type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.ModuleInfo declared in <root>.ModuleInfo.<get-keyBind>' type=<root>.ModuleInfo origin=null
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in kotlin.Annotation
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
VALUE_PARAMETER name:other index:0 type:kotlin.Any?
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override]
overridden:
public open fun hashCode (): kotlin.Int [fake_override] declared in kotlin.Annotation
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override]
overridden:
public open fun toString (): kotlin.String [fake_override] declared in kotlin.Annotation
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
@@ -0,0 +1,13 @@
// TARGET_BACKEND: JVM
// FIR_IDENTICAL
// ISSUE: KT-52676
// FILE: Keyboard.java
public class Keyboard {
public static final int CHAR_NONE = 1234;
}
// FILE: main.kt
annotation class ModuleInfo(val keyBind: Int = Keyboard.CHAR_NONE)
@@ -0,0 +1,12 @@
open annotation class ModuleInfo : Annotation {
constructor(keyBind: Int = 1234) /* primary */ {
super/*Any*/()
/* <init>() */
}
val keyBind: Int
field = keyBind
get
}
@@ -561,6 +561,12 @@ public class IrTextTestGenerated extends AbstractIrTextTest {
runTest("compiler/testData/ir/irText/declarations/annotations/annotationsWithVarargParameters.kt");
}
@Test
@TestMetadata("argWithDefaultValueInAnnotationClass.kt")
public void testArgWithDefaultValueInAnnotationClass() throws Exception {
runTest("compiler/testData/ir/irText/declarations/annotations/argWithDefaultValueInAnnotationClass.kt");
}
@Test
@TestMetadata("arrayInAnnotationArguments.kt")
public void testArrayInAnnotationArguments() throws Exception {