KT-37779 Treat named value arguments in vararg as arguments with '*'
This commit is contained in:
@@ -3141,15 +3141,16 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
||||
List<ValueArgument> arguments = valueArgument.getArguments();
|
||||
int size = arguments.size();
|
||||
|
||||
boolean hasSpread = false;
|
||||
for (int i = 0; i != size; ++i) {
|
||||
if (arguments.get(i).getSpreadElement() != null) {
|
||||
hasSpread = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Named arguments in vararg are treated as having an implicit spread operator.
|
||||
// There can be only single such argument for a given vararg parameter, but here it doesn't really matter:
|
||||
// we'll just build a copy of array as if an array argument was passed as positional with an explicit spread operator.
|
||||
boolean hasSpreadOperator =
|
||||
state.getLanguageVersionSettings()
|
||||
.supportsFeature(LanguageFeature.AllowAssigningArrayElementsToVarargsInNamedFormForFunctions)
|
||||
? arguments.stream().anyMatch(argument -> argument.getSpreadElement() != null || argument.isNamed())
|
||||
: arguments.stream().anyMatch(argument -> argument.getSpreadElement() != null);
|
||||
|
||||
if (hasSpread) {
|
||||
if (hasSpreadOperator) {
|
||||
boolean arrayOfReferences = KotlinBuiltIns.isArray(outType);
|
||||
if (size == 1) {
|
||||
Type arrayType = getArrayType(arrayOfReferences ? AsmTypes.OBJECT_TYPE : elementType);
|
||||
|
||||
Reference in New Issue
Block a user