JVM: Support instantiation of annotations with vararg parameters
when they are instantiated without argument. #KT-59033 Fixed
This commit is contained in:
+6
@@ -605,6 +605,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr
|
||||
public void testNestedAnnotationInstances() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("varargInAnnotationParameterInstantiation.kt")
|
||||
public void testVarargInAnnotationParameterInstantiation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
||||
+6
@@ -605,6 +605,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo
|
||||
public void testNestedAnnotationInstances() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("varargInAnnotationParameterInstantiation.kt")
|
||||
public void testVarargInAnnotationParameterInstantiation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
||||
+33
-8
@@ -17,12 +17,12 @@ import org.jetbrains.kotlin.ir.builders.declarations.buildClass
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl
|
||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||
import org.jetbrains.kotlin.ir.types.IrType
|
||||
import org.jetbrains.kotlin.ir.types.classOrNull
|
||||
import org.jetbrains.kotlin.ir.types.isArray
|
||||
import org.jetbrains.kotlin.ir.types.*
|
||||
import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -105,11 +105,36 @@ abstract class AnnotationImplementationTransformer(val context: BackendContext,
|
||||
|
||||
destination.symbol.owner.valueParameters.forEachIndexed { index, parameter ->
|
||||
val valueArg = argumentsByName[parameter.name]
|
||||
if (parameter.defaultValue == null && valueArg == null)
|
||||
error(
|
||||
"Usage of default value argument for this annotation is not yet possible.\n" +
|
||||
"Please specify value for '${source.type.classOrNull?.owner?.name}.${parameter.name}' explicitly"
|
||||
)
|
||||
|
||||
if (parameter.defaultValue == null && valueArg == null) {
|
||||
// if parameter is vararg, put an empty array as argument
|
||||
// The vararg is already lowered to array, so `isVararg` is false.
|
||||
if (parameter.type.isBoxedArray || parameter.type.isPrimitiveArray() || parameter.type.isUnsignedArray()) {
|
||||
val arrayType = parameter.type
|
||||
|
||||
val arrayConstructorCall =
|
||||
if (arrayType.isBoxedArray) {
|
||||
val arrayFunction = context.ir.symbols.arrayOfNulls
|
||||
IrCallImpl.fromSymbolOwner(source.startOffset, source.endOffset, arrayType, arrayFunction)
|
||||
} else {
|
||||
val arrayConstructor = arrayType.classOrNull!!.constructors.single {
|
||||
it.owner.valueParameters.size == 1 && it.owner.valueParameters.single().type == context.irBuiltIns.intType
|
||||
}
|
||||
IrConstructorCallImpl.fromSymbolOwner(source.startOffset, source.endOffset, arrayType, arrayConstructor)
|
||||
}
|
||||
arrayConstructorCall.putValueArgument(
|
||||
0,
|
||||
IrConstImpl.int(source.startOffset, source.endOffset, context.irBuiltIns.intType, 0)
|
||||
)
|
||||
destination.putValueArgument(index, arrayConstructorCall)
|
||||
return
|
||||
} else {
|
||||
error(
|
||||
"Usage of default value argument for this annotation is not yet possible.\n" +
|
||||
"Please specify value for '${source.type.classOrNull?.owner?.name}.${parameter.name}' explicitly"
|
||||
)
|
||||
}
|
||||
}
|
||||
destination.putValueArgument(index, valueArg)
|
||||
}
|
||||
}
|
||||
|
||||
Vendored
+18
@@ -0,0 +1,18 @@
|
||||
// WITH_STDLIB
|
||||
// IGNORE_BACKEND: JVM
|
||||
// UIntArray parameters do not work on WASM
|
||||
// See also: KT-59032.
|
||||
// IGNORE_BACKEND: WASM
|
||||
|
||||
annotation class KotlinAnn(vararg val foo: String)
|
||||
|
||||
annotation class KotlinIntAnn(vararg val foo: Int)
|
||||
|
||||
annotation class KotlinUIntAnn(vararg val foo: UInt)
|
||||
|
||||
fun box(): String {
|
||||
KotlinAnn()
|
||||
KotlinIntAnn()
|
||||
KotlinUIntAnn()
|
||||
return "OK"
|
||||
}
|
||||
+6
@@ -491,6 +491,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
public void testNestedAnnotationInstances() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("varargInAnnotationParameterInstantiation.kt")
|
||||
public void testVarargInAnnotationParameterInstantiation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
||||
+6
@@ -605,6 +605,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
public void testNestedAnnotationInstances() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("varargInAnnotationParameterInstantiation.kt")
|
||||
public void testVarargInAnnotationParameterInstantiation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
||||
+6
@@ -605,6 +605,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack
|
||||
public void testNestedAnnotationInstances() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("varargInAnnotationParameterInstantiation.kt")
|
||||
public void testVarargInAnnotationParameterInstantiation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
||||
+5
@@ -425,6 +425,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("varargInAnnotationParameterInstantiation.kt")
|
||||
public void ignoreVarargInAnnotationParameterInstantiation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt");
|
||||
}
|
||||
|
||||
private void runTest(String testDataFilePath) throws Exception {
|
||||
KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath);
|
||||
}
|
||||
|
||||
+6
@@ -107,6 +107,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
||||
public void testMultiplatformInstantiation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/multiplatformInstantiation.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("varargInAnnotationParameterInstantiation.kt")
|
||||
public void testVarargInAnnotationParameterInstantiation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
||||
+6
@@ -161,6 +161,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest {
|
||||
public void testNestedAnnotationInstances() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("varargInAnnotationParameterInstantiation.kt")
|
||||
public void testVarargInAnnotationParameterInstantiation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
||||
+6
@@ -161,6 +161,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
||||
public void testNestedAnnotationInstances() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("varargInAnnotationParameterInstantiation.kt")
|
||||
public void testVarargInAnnotationParameterInstantiation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
||||
+6
@@ -161,6 +161,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes
|
||||
public void testNestedAnnotationInstances() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("varargInAnnotationParameterInstantiation.kt")
|
||||
public void testVarargInAnnotationParameterInstantiation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
||||
+6
@@ -178,6 +178,12 @@ public class FirNativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTe
|
||||
public void testNestedAnnotationInstances() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("varargInAnnotationParameterInstantiation.kt")
|
||||
public void testVarargInAnnotationParameterInstantiation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
||||
+6
@@ -188,6 +188,12 @@ public class FirNativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenB
|
||||
public void testNestedAnnotationInstances() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("varargInAnnotationParameterInstantiation.kt")
|
||||
public void testVarargInAnnotationParameterInstantiation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
||||
+6
@@ -174,6 +174,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest
|
||||
public void testNestedAnnotationInstances() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("varargInAnnotationParameterInstantiation.kt")
|
||||
public void testVarargInAnnotationParameterInstantiation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
||||
+6
@@ -179,6 +179,12 @@ public class NativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenBoxT
|
||||
public void testNestedAnnotationInstances() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("varargInAnnotationParameterInstantiation.kt")
|
||||
public void testVarargInAnnotationParameterInstantiation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
||||
Generated
+5
@@ -157,6 +157,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
|
||||
public void testNestedAnnotationInstances() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/nestedAnnotationInstances.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("varargInAnnotationParameterInstantiation.kt")
|
||||
public void testVarargInAnnotationParameterInstantiation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/annotations/instances/varargInAnnotationParameterInstantiation.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/box/annotations/kClassMapping")
|
||||
|
||||
Reference in New Issue
Block a user