Making var arg kParameters default to empty array no argument given
fixes KT-29969
This commit is contained in:
committed by
Alexander Udalov
parent
b1dbacf45f
commit
34a64d9171
Generated
+10
@@ -22728,6 +22728,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/reflection/callBy/defaultInSuperInterface.kt");
|
runTest("compiler/testData/codegen/box/reflection/callBy/defaultInSuperInterface.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("emptyVarArg.kt")
|
||||||
|
public void testEmptyVarArg() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/reflection/callBy/emptyVarArg.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("extensionFunction.kt")
|
@TestMetadata("extensionFunction.kt")
|
||||||
public void testExtensionFunction() throws Exception {
|
public void testExtensionFunction() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/reflection/callBy/extensionFunction.kt");
|
runTest("compiler/testData/codegen/box/reflection/callBy/extensionFunction.kt");
|
||||||
@@ -23035,6 +23040,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callByKotlin.kt");
|
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callByKotlin.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("callByWithEmptyVarArg.kt")
|
||||||
|
public void testCallByWithEmptyVarArg() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callByWithEmptyVarArg.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("callJava.kt")
|
@TestMetadata("callJava.kt")
|
||||||
public void testCallJava() throws Exception {
|
public void testCallJava() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callJava.kt");
|
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callJava.kt");
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
// IGNORE_BACKEND_FIR: JVM_IR
|
||||||
|
// IGNORE_BACKEND: JS_IR
|
||||||
|
// IGNORE_BACKEND: JS, NATIVE
|
||||||
|
|
||||||
|
// WITH_REFLECT
|
||||||
|
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
fun join(vararg strings: String) = strings.toList().joinToString("")
|
||||||
|
|
||||||
|
fun sum(vararg bytes: Byte) = bytes.toList().fold(0) { acc, el -> acc + el }
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val j = ::join
|
||||||
|
val s = ::sum
|
||||||
|
assertEquals("", j.callBy(emptyMap()))
|
||||||
|
assertEquals(0, s.callBy(emptyMap()))
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+25
@@ -0,0 +1,25 @@
|
|||||||
|
// IGNORE_BACKEND_FIR: JVM_IR
|
||||||
|
// IGNORE_BACKEND: JS_IR
|
||||||
|
// IGNORE_BACKEND: JS, NATIVE
|
||||||
|
|
||||||
|
// WITH_REFLECT
|
||||||
|
|
||||||
|
import kotlin.reflect.*
|
||||||
|
import kotlin.reflect.full.*
|
||||||
|
import kotlin.test.assert
|
||||||
|
|
||||||
|
annotation class Foo(vararg val strings: String)
|
||||||
|
|
||||||
|
annotation class Bar(vararg val bytes: Byte)
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val fooConstructor = Foo::class.primaryConstructor!!
|
||||||
|
val foo = fooConstructor.callBy(emptyMap())
|
||||||
|
assert(foo.strings.isEmpty())
|
||||||
|
|
||||||
|
val barConstructor = Bar::class.primaryConstructor!!
|
||||||
|
val bar = barConstructor.callBy(emptyMap())
|
||||||
|
assert(bar.bytes.isEmpty())
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+10
@@ -24289,6 +24289,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/reflection/callBy/defaultInSuperInterface.kt");
|
runTest("compiler/testData/codegen/box/reflection/callBy/defaultInSuperInterface.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("emptyVarArg.kt")
|
||||||
|
public void testEmptyVarArg() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/reflection/callBy/emptyVarArg.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("extensionFunction.kt")
|
@TestMetadata("extensionFunction.kt")
|
||||||
public void testExtensionFunction() throws Exception {
|
public void testExtensionFunction() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/reflection/callBy/extensionFunction.kt");
|
runTest("compiler/testData/codegen/box/reflection/callBy/extensionFunction.kt");
|
||||||
@@ -24596,6 +24601,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callByKotlin.kt");
|
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callByKotlin.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("callByWithEmptyVarArg.kt")
|
||||||
|
public void testCallByWithEmptyVarArg() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callByWithEmptyVarArg.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("callJava.kt")
|
@TestMetadata("callJava.kt")
|
||||||
public void testCallJava() throws Exception {
|
public void testCallJava() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callJava.kt");
|
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callJava.kt");
|
||||||
|
|||||||
+10
@@ -23106,6 +23106,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/reflection/callBy/defaultInSuperInterface.kt");
|
runTest("compiler/testData/codegen/box/reflection/callBy/defaultInSuperInterface.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("emptyVarArg.kt")
|
||||||
|
public void testEmptyVarArg() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/reflection/callBy/emptyVarArg.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("extensionFunction.kt")
|
@TestMetadata("extensionFunction.kt")
|
||||||
public void testExtensionFunction() throws Exception {
|
public void testExtensionFunction() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/reflection/callBy/extensionFunction.kt");
|
runTest("compiler/testData/codegen/box/reflection/callBy/extensionFunction.kt");
|
||||||
@@ -23413,6 +23418,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callByKotlin.kt");
|
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callByKotlin.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("callByWithEmptyVarArg.kt")
|
||||||
|
public void testCallByWithEmptyVarArg() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callByWithEmptyVarArg.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("callJava.kt")
|
@TestMetadata("callJava.kt")
|
||||||
public void testCallJava() throws Exception {
|
public void testCallJava() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callJava.kt");
|
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callJava.kt");
|
||||||
|
|||||||
+10
@@ -22728,6 +22728,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/reflection/callBy/defaultInSuperInterface.kt");
|
runTest("compiler/testData/codegen/box/reflection/callBy/defaultInSuperInterface.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("emptyVarArg.kt")
|
||||||
|
public void testEmptyVarArg() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/reflection/callBy/emptyVarArg.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("extensionFunction.kt")
|
@TestMetadata("extensionFunction.kt")
|
||||||
public void testExtensionFunction() throws Exception {
|
public void testExtensionFunction() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/reflection/callBy/extensionFunction.kt");
|
runTest("compiler/testData/codegen/box/reflection/callBy/extensionFunction.kt");
|
||||||
@@ -23035,6 +23040,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callByKotlin.kt");
|
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callByKotlin.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("callByWithEmptyVarArg.kt")
|
||||||
|
public void testCallByWithEmptyVarArg() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callByWithEmptyVarArg.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("callJava.kt")
|
@TestMetadata("callJava.kt")
|
||||||
public void testCallJava() throws Exception {
|
public void testCallJava() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callJava.kt");
|
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callJava.kt");
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
|||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor
|
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor
|
||||||
|
import java.lang.reflect.Array as ReflectArray
|
||||||
import java.lang.reflect.ParameterizedType
|
import java.lang.reflect.ParameterizedType
|
||||||
import java.lang.reflect.Type
|
import java.lang.reflect.Type
|
||||||
import java.lang.reflect.WildcardType
|
import java.lang.reflect.WildcardType
|
||||||
@@ -17,6 +18,7 @@ import kotlin.coroutines.Continuation
|
|||||||
import kotlin.reflect.*
|
import kotlin.reflect.*
|
||||||
import kotlin.reflect.jvm.internal.calls.Caller
|
import kotlin.reflect.jvm.internal.calls.Caller
|
||||||
import kotlin.reflect.jvm.javaType
|
import kotlin.reflect.jvm.javaType
|
||||||
|
import kotlin.reflect.jvm.jvmErasure
|
||||||
|
|
||||||
internal abstract class KCallableImpl<out R> : KCallable<R> {
|
internal abstract class KCallableImpl<out R> : KCallable<R> {
|
||||||
abstract val descriptor: CallableMemberDescriptor
|
abstract val descriptor: CallableMemberDescriptor
|
||||||
@@ -134,6 +136,9 @@ internal abstract class KCallableImpl<out R> : KCallable<R> {
|
|||||||
mask = mask or (1 shl (index % Integer.SIZE))
|
mask = mask or (1 shl (index % Integer.SIZE))
|
||||||
anyOptional = true
|
anyOptional = true
|
||||||
}
|
}
|
||||||
|
parameter.isVararg -> {
|
||||||
|
arguments.add(defaultEmptyArray(parameter.type))
|
||||||
|
}
|
||||||
else -> {
|
else -> {
|
||||||
throw IllegalArgumentException("No argument provided for a required parameter: $parameter")
|
throw IllegalArgumentException("No argument provided for a required parameter: $parameter")
|
||||||
}
|
}
|
||||||
@@ -174,6 +179,7 @@ internal abstract class KCallableImpl<out R> : KCallable<R> {
|
|||||||
args[parameter] ?: throw IllegalArgumentException("Annotation argument value cannot be null ($parameter)")
|
args[parameter] ?: throw IllegalArgumentException("Annotation argument value cannot be null ($parameter)")
|
||||||
}
|
}
|
||||||
parameter.isOptional -> null
|
parameter.isOptional -> null
|
||||||
|
parameter.isVararg -> defaultEmptyArray(parameter.type)
|
||||||
else -> throw IllegalArgumentException("No argument provided for a required parameter: $parameter")
|
else -> throw IllegalArgumentException("No argument provided for a required parameter: $parameter")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -202,6 +208,14 @@ internal abstract class KCallableImpl<out R> : KCallable<R> {
|
|||||||
}
|
}
|
||||||
} else null
|
} else null
|
||||||
|
|
||||||
|
private fun defaultEmptyArray(type: KType): Any =
|
||||||
|
type.jvmErasure.java.run {
|
||||||
|
if (isArray) ReflectArray.newInstance(componentType, 0)
|
||||||
|
else throw KotlinReflectionInternalError(
|
||||||
|
"Cannot instantiate the default empty array of type $simpleName, because it is not an array type"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
private fun extractContinuationArgument(): Type? {
|
private fun extractContinuationArgument(): Type? {
|
||||||
if ((descriptor as? FunctionDescriptor)?.isSuspend == true) {
|
if ((descriptor as? FunctionDescriptor)?.isSuspend == true) {
|
||||||
// kotlin.coroutines.Continuation<? super java.lang.String>
|
// kotlin.coroutines.Continuation<? super java.lang.String>
|
||||||
|
|||||||
Generated
+10
@@ -19299,6 +19299,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/reflection/callBy/defaultInSuperInterface.kt");
|
runTest("compiler/testData/codegen/box/reflection/callBy/defaultInSuperInterface.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("emptyVarArg.kt")
|
||||||
|
public void testEmptyVarArg() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/reflection/callBy/emptyVarArg.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("extensionFunction.kt")
|
@TestMetadata("extensionFunction.kt")
|
||||||
public void testExtensionFunction() throws Exception {
|
public void testExtensionFunction() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/reflection/callBy/extensionFunction.kt");
|
runTest("compiler/testData/codegen/box/reflection/callBy/extensionFunction.kt");
|
||||||
@@ -19496,6 +19501,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/reflection/createAnnotation/arrayOfKClasses.kt");
|
runTest("compiler/testData/codegen/box/reflection/createAnnotation/arrayOfKClasses.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("callByWithEmptyVarArg.kt")
|
||||||
|
public void testCallByWithEmptyVarArg() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callByWithEmptyVarArg.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("enumKClassAnnotation.kt")
|
@TestMetadata("enumKClassAnnotation.kt")
|
||||||
public void testEnumKClassAnnotation() throws Exception {
|
public void testEnumKClassAnnotation() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/reflection/createAnnotation/enumKClassAnnotation.kt");
|
runTest("compiler/testData/codegen/box/reflection/createAnnotation/enumKClassAnnotation.kt");
|
||||||
|
|||||||
+10
@@ -19359,6 +19359,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/reflection/callBy/defaultInSuperInterface.kt");
|
runTest("compiler/testData/codegen/box/reflection/callBy/defaultInSuperInterface.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("emptyVarArg.kt")
|
||||||
|
public void testEmptyVarArg() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/reflection/callBy/emptyVarArg.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("extensionFunction.kt")
|
@TestMetadata("extensionFunction.kt")
|
||||||
public void testExtensionFunction() throws Exception {
|
public void testExtensionFunction() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/reflection/callBy/extensionFunction.kt");
|
runTest("compiler/testData/codegen/box/reflection/callBy/extensionFunction.kt");
|
||||||
@@ -19556,6 +19561,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/reflection/createAnnotation/arrayOfKClasses.kt");
|
runTest("compiler/testData/codegen/box/reflection/createAnnotation/arrayOfKClasses.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("callByWithEmptyVarArg.kt")
|
||||||
|
public void testCallByWithEmptyVarArg() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/reflection/createAnnotation/callByWithEmptyVarArg.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("enumKClassAnnotation.kt")
|
@TestMetadata("enumKClassAnnotation.kt")
|
||||||
public void testEnumKClassAnnotation() throws Exception {
|
public void testEnumKClassAnnotation() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/reflection/createAnnotation/enumKClassAnnotation.kt");
|
runTest("compiler/testData/codegen/box/reflection/createAnnotation/enumKClassAnnotation.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user