diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirArgumentsToParametersMapper.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirArgumentsToParametersMapper.kt index 4de2a1285cd..b1dc13ded26 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirArgumentsToParametersMapper.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirArgumentsToParametersMapper.kt @@ -262,19 +262,27 @@ private class FirCallArgumentsProcessor( return } - if (lastParameter.isVararg) { - addDiagnostic(VarargArgumentOutsideParentheses(externalArgument, lastParameter)) - return + if (function.origin != FirDeclarationOrigin.DynamicScope) { + if (lastParameter.isVararg) { + addDiagnostic(VarargArgumentOutsideParentheses(externalArgument, lastParameter)) + return + } + + val previousOccurrence = result[lastParameter] + if (previousOccurrence != null) { + addDiagnostic(TooManyArguments(externalArgument, function)) + return + } + + result[lastParameter] = ResolvedCallArgument.SimpleArgument(externalArgument) + } else { + val existing = result[lastParameter] + if (existing == null) { + result[lastParameter] = ResolvedCallArgument.SimpleArgument(externalArgument) + } else { + result[lastParameter] = ResolvedCallArgument.VarargArgument(existing.arguments + externalArgument) + } } - - val previousOccurrence = result[lastParameter] - if (previousOccurrence != null) { - addDiagnostic(TooManyArguments(externalArgument, function)) - return - } - - - result[lastParameter] = ResolvedCallArgument.SimpleArgument(externalArgument) } fun processExcessLambdaArguments(excessLambdaArguments: List) { @@ -312,7 +320,7 @@ private class FirCallArgumentsProcessor( private fun completeVarargPositionArguments() { assert(state == State.VARARG_POSITION) { "Incorrect state: $state" } val parameter = parameters[currentPositionedParameterIndex] - result.put(parameter, ResolvedCallArgument.VarargArgument(varargArguments!!)) + result[parameter] = ResolvedCallArgument.VarargArgument(varargArguments!!) } private fun addVarargArgument(argument: FirExpression) { diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/conventions.fir.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/conventions.fir.kt index 9a7527cf1d7..ae2872bfe52 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/conventions.fir.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/conventions.fir.kt @@ -31,7 +31,7 @@ fun test(d: dynamic) { d() d(1) d(name = 1) - d {} + d {} class C { val plus: dynamic = null diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/dynamicCallsWithLambdas.fir.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/dynamicCallsWithLambdas.fir.kt index dcf1109eb91..3170ff580ba 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/dynamicCallsWithLambdas.fir.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/dynamicCallsWithLambdas.fir.kt @@ -2,19 +2,19 @@ // !CHECK_TYPE fun test(d: dynamic) { - d.foo {} + d.foo {} - d.foo { it } + d.foo { it } - d.foo { x -> } + d.foo { x -> } - d.foo { x: Int -> "" } + d.foo { x: Int -> "" } - d.foo { x, y -> "" } + d.foo { x, y -> "" } - d.foo { x: String, y: Int -> "" } + d.foo { x: String, y: Int -> "" } - d.foo { x, y: Int -> "" } + d.foo { x, y: Int -> "" } d.foo({}) diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/spreadOperator.fir.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/spreadOperator.fir.kt deleted file mode 100644 index 7e7a1bf2a89..00000000000 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/spreadOperator.fir.kt +++ /dev/null @@ -1,22 +0,0 @@ -fun test(d: dynamic) { - val a = arrayOf(1, 2, 3) - - d.foo(*d) - d.foo(*a) - d.foo(1, "2", *a) - d.foo(1, *a) { } - d.foo(*a) { "" } - d.foo(*a, *a) - d.foo(*a, *a) { "" } - d.foo(*a, 1, { "" }, *a) - d.foo(*a, 1) - d.foo(*a, *a, { "" }) - - bar(d) - bar(d, d) - bar(*d) - bar(*d, *d) - bar(*d, 23, *d) -} - -fun bar(vararg x: Int): Unit = TODO("$x") diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/spreadOperator.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/spreadOperator.kt index 2be0f9c449d..a4906ffb962 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/spreadOperator.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/spreadOperator.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun test(d: dynamic) { val a = arrayOf(1, 2, 3)