From c032a02373f82be0ad99bc2b05b698c365f2c04c Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Thu, 5 Jul 2018 23:32:07 +0300 Subject: [PATCH] Prohibit assigning single elements into varargs in named form #KT-20588 Fixed #KT-20589 Fixed --- .../jetbrains/kotlin/diagnostics/Errors.java | 2 + .../rendering/DefaultErrorMessages.java | 2 + .../AssigningNamedArgumentToVarargChecker.kt | 58 +++++++++++++++---- ...hibitAssigningSingleElementsInNamedForm.kt | 20 +++++++ .../checkers/DiagnosticsTestGenerated.java | 5 ++ .../DiagnosticsUsingJavacTestGenerated.java | 5 ++ .../kotlin/config/LanguageVersionSettings.kt | 1 + .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 2 + ...hArrayOfWithSpreadOperatorInFunctionFix.kt | 11 +++- ...laceForbiddenAssignmentWithArrayLiteral.kt | 8 +++ ...rbiddenAssignmentWithArrayLiteral.kt.after | 8 +++ .../replaceForbiddenAssigningIntoArrayCall.kt | 9 +++ ...ceForbiddenAssigningIntoArrayCall.kt.after | 9 +++ .../idea/quickfix/QuickFixTestGenerated.java | 10 ++++ 14 files changed, 138 insertions(+), 12 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/varargs/prohibitAssigningSingleElementsInNamedForm.kt create mode 100644 idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceForbiddenAssignmentWithArrayLiteral.kt create mode 100644 idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceForbiddenAssignmentWithArrayLiteral.kt.after create mode 100644 idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForbiddenAssigningIntoArrayCall.kt create mode 100644 idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForbiddenAssigningIntoArrayCall.kt.after diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index b0bddd25e4e..9d4c3536f39 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -664,7 +664,9 @@ public interface Errors { DiagnosticFactory0 NO_RECEIVER_ALLOWED = DiagnosticFactory0.create(ERROR); DiagnosticFactory1 ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION = DiagnosticFactory1.create(WARNING); + DiagnosticFactory1 ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR = DiagnosticFactory1.create(ERROR); DiagnosticFactory0 ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION = DiagnosticFactory0.create(WARNING); + DiagnosticFactory0 ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR = DiagnosticFactory0.create(ERROR); // Call resolution diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 959d766e540..0caf5efc788 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -780,7 +780,9 @@ public class DefaultErrorMessages { MAP.put(MISSING_RECEIVER, "A receiver of type {0} is required", RENDER_TYPE); MAP.put(NO_RECEIVER_ALLOWED, "No receiver can be passed to this function or property"); MAP.put(ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION, "Assigning single elements to varargs in named form is deprecated", TO_STRING); + MAP.put(ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR, "Assigning single elements to varargs in named form is forbidden", TO_STRING); MAP.put(ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION, "Assigning single elements to varargs in named form is deprecated"); + MAP.put(ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR, "Assigning single elements to varargs in named form is forbidden"); MAP.put(CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS, "Cannot create an instance of an abstract class"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/AssigningNamedArgumentToVarargChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/AssigningNamedArgumentToVarargChecker.kt index 957668cf8fa..faf79b51e32 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/AssigningNamedArgumentToVarargChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/AssigningNamedArgumentToVarargChecker.kt @@ -6,9 +6,13 @@ package org.jetbrains.kotlin.resolve.calls.checkers import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.config.LanguageFeature.AssigningArraysToVarargsInNamedFormInAnnotations +import org.jetbrains.kotlin.config.LanguageFeature.ProhibitAssigningSingleElementsToVarargsInNamedForm import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor +import org.jetbrains.kotlin.diagnostics.DiagnosticFactory import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.diagnostics.Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION +import org.jetbrains.kotlin.diagnostics.Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.ValueArgument import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isArrayOrArrayLiteral @@ -18,6 +22,18 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.descriptorUtil.isParameterOfAnnotation class AssigningNamedArgumentToVarargChecker : CallChecker { + companion object { + private val migrationDiagnosticsForFunction = MigrationDiagnostics( + ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION, + ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR + ) + + private val migrationDiagnosticsForAnnotation = MigrationDiagnostics( + Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION, + Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR + ) + } + override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) { for ((parameterDescriptor, resolvedArgument) in resolvedCall.valueArguments) { for (argument in resolvedArgument.arguments) { @@ -31,7 +47,7 @@ class AssigningNamedArgumentToVarargChecker : CallChecker { parameterDescriptor: ValueParameterDescriptor, context: ResolutionContext<*> ) { - if (!context.languageVersionSettings.supportsFeature(LanguageFeature.AssigningArraysToVarargsInNamedFormInAnnotations)) return + if (!context.languageVersionSettings.supportsFeature(AssigningArraysToVarargsInNamedFormInAnnotations)) return if (!argument.isNamed()) return if (!parameterDescriptor.isVararg) return @@ -50,12 +66,19 @@ class AssigningNamedArgumentToVarargChecker : CallChecker { argumentExpression: KtExpression, context: ResolutionContext<*> ) { + fun report(onlyWarning: Boolean = false) { + reportMigrationDiagnostic(migrationDiagnosticsForAnnotation, context, onlyWarning) { diagnostic -> + context.trace.report(diagnostic.on(argumentExpression)) + } + } + if (isArrayOrArrayLiteral(argument, context.trace)) { if (argument.hasSpread()) { - context.trace.report(Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION.on(argumentExpression)) + // We want to make calls @Foo(value = [A]) and @Foo(value = *[A]) equivalent + report(onlyWarning = true) } } else { - context.trace.report(Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION.on(argumentExpression)) + report() } } @@ -66,14 +89,27 @@ class AssigningNamedArgumentToVarargChecker : CallChecker { parameterDescriptor: ValueParameterDescriptor ) { if (!argument.hasSpread()) { - context.trace.report( - Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION.on( - argumentExpression, - parameterDescriptor.type - ) - ) + reportMigrationDiagnostic(migrationDiagnosticsForFunction, context) { diagnostic -> + context.trace.report(diagnostic.on(argumentExpression, parameterDescriptor.type)) + } } } private fun ValueArgument.hasSpread() = getSpreadElement() != null -} \ No newline at end of file + + private inline fun > reportMigrationDiagnostic( + migrationDiagnostics: MigrationDiagnostics, + context: ResolutionContext<*>, + onlyWarning: Boolean = false, + report: (T) -> Unit + ) { + val (warning, error) = migrationDiagnostics + if (!onlyWarning && context.languageVersionSettings.supportsFeature(ProhibitAssigningSingleElementsToVarargsInNamedForm)) { + report(error) + } else { + report(warning) + } + } +} + +private data class MigrationDiagnostics>(val warning: T, val error: T) \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/varargs/prohibitAssigningSingleElementsInNamedForm.kt b/compiler/testData/diagnostics/tests/varargs/prohibitAssigningSingleElementsInNamedForm.kt new file mode 100644 index 00000000000..7fd796d4dfd --- /dev/null +++ b/compiler/testData/diagnostics/tests/varargs/prohibitAssigningSingleElementsInNamedForm.kt @@ -0,0 +1,20 @@ +// !LANGUAGE: +ProhibitAssigningSingleElementsToVarargsInNamedForm +// !DIAGNOSTICS: -UNUSED_PARAMETER + +annotation class Anno1(vararg val s: String) +annotation class Anno2(vararg val i: Int) + +@Anno1(s = "foo") +@Anno2(i = *intArrayOf(1)) +fun f1() {} + +@Anno1(s = ["foo"]) +@Anno2(i = intArrayOf(1)) +fun f2() {} + +fun foo(vararg ints: Int) {} + +fun test() { + foo(ints = 1) + foo(ints = *intArrayOf(1)) +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 753746243a4..58fbf2abd0e 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -22130,6 +22130,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { runTest("compiler/testData/diagnostics/tests/varargs/NullableTypeForVarargArgument.kt"); } + @TestMetadata("prohibitAssigningSingleElementsInNamedForm.kt") + public void testProhibitAssigningSingleElementsInNamedForm() throws Exception { + runTest("compiler/testData/diagnostics/tests/varargs/prohibitAssigningSingleElementsInNamedForm.kt"); + } + @TestMetadata("UnaryVsVararg.kt") public void testUnaryVsVararg() throws Exception { runTest("compiler/testData/diagnostics/tests/varargs/UnaryVsVararg.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index cee02ebcb7a..f2cab6ef692 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -22130,6 +22130,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/varargs/NullableTypeForVarargArgument.kt"); } + @TestMetadata("prohibitAssigningSingleElementsInNamedForm.kt") + public void testProhibitAssigningSingleElementsInNamedForm() throws Exception { + runTest("compiler/testData/diagnostics/tests/varargs/prohibitAssigningSingleElementsInNamedForm.kt"); + } + @TestMetadata("UnaryVsVararg.kt") public void testUnaryVsVararg() throws Exception { runTest("compiler/testData/diagnostics/tests/varargs/UnaryVsVararg.kt"); diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index c89445be47c..72f4f77e69d 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -77,6 +77,7 @@ enum class LanguageFeature( ProhibitLocalAnnotations(KOTLIN_1_3, kind = BUG_FIX), ProhibitSmartcastsOnLocalDelegatedProperty(KOTLIN_1_3, kind = BUG_FIX), ProhibitOperatorMod(KOTLIN_1_3, kind = BUG_FIX), + ProhibitAssigningSingleElementsToVarargsInNamedForm(KOTLIN_1_3, kind = BUG_FIX), StrictJavaNullabilityAssertions(sinceVersion = null, defaultState = State.DISABLED), ProperIeee754Comparisons(sinceVersion = null, defaultState = State.DISABLED), diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 1a29249ccf2..cfa75ed14d7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -545,7 +545,9 @@ class QuickFixRegistrar : QuickFixContributor { ANNOTATION_USED_AS_ANNOTATION_ARGUMENT.registerFactory(RemoveAtFromAnnotationArgument) ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION.registerFactory(ReplaceWithArrayCallInAnnotationFix) + ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR.registerFactory(ReplaceWithArrayCallInAnnotationFix) ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION.registerFactory(SurroundWithArrayOfWithSpreadOperatorInFunctionFix) + ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR.registerFactory(SurroundWithArrayOfWithSpreadOperatorInFunctionFix) JAVA_MODULE_DOES_NOT_DEPEND_ON_MODULE.registerFactory(KotlinAddRequiredModuleFix) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/SurroundWithArrayOfWithSpreadOperatorInFunctionFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/SurroundWithArrayOfWithSpreadOperatorInFunctionFix.kt index 5ab4096d6b0..6514e684066 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/SurroundWithArrayOfWithSpreadOperatorInFunctionFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/SurroundWithArrayOfWithSpreadOperatorInFunctionFix.kt @@ -50,7 +50,16 @@ class SurroundWithArrayOfWithSpreadOperatorInFunctionFix( companion object : KotlinSingleIntentionActionFactory() { override fun createAction(diagnostic: Diagnostic): KotlinQuickFixAction? { - val actualDiagnostic = Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION.cast(diagnostic) + val actualDiagnostic = when (diagnostic.factory) { + Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION -> + Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION.cast(diagnostic) + + Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR -> + Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR.cast(diagnostic) + + else -> error("Non expected diagnostic: $diagnostic") + } + val parameterType = actualDiagnostic.a val wrapper = PRIMITIVE_TYPE_TO_ARRAY[KotlinBuiltIns.getPrimitiveArrayElementType(parameterType)] ?: ARRAY_OF_FUNCTION diff --git a/idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceForbiddenAssignmentWithArrayLiteral.kt b/idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceForbiddenAssignmentWithArrayLiteral.kt new file mode 100644 index 00000000000..5e5bd854e32 --- /dev/null +++ b/idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceForbiddenAssignmentWithArrayLiteral.kt @@ -0,0 +1,8 @@ +// "Replace with array call" "true" +// COMPILER_ARGUMENTS: -XXLanguage:+ProhibitAssigningSingleElementsToVarargsInNamedForm +// DISABLE-ERRORS + +annotation class Some(vararg val strings: String) + +@Some(strings = "value") +class My diff --git a/idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceForbiddenAssignmentWithArrayLiteral.kt.after b/idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceForbiddenAssignmentWithArrayLiteral.kt.after new file mode 100644 index 00000000000..7860cdf06f9 --- /dev/null +++ b/idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceForbiddenAssignmentWithArrayLiteral.kt.after @@ -0,0 +1,8 @@ +// "Replace with array call" "true" +// COMPILER_ARGUMENTS: -XXLanguage:+ProhibitAssigningSingleElementsToVarargsInNamedForm +// DISABLE-ERRORS + +annotation class Some(vararg val strings: String) + +@Some(strings = ["value"]) +class My diff --git a/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForbiddenAssigningIntoArrayCall.kt b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForbiddenAssigningIntoArrayCall.kt new file mode 100644 index 00000000000..cfe7cbcdff2 --- /dev/null +++ b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForbiddenAssigningIntoArrayCall.kt @@ -0,0 +1,9 @@ +// "Surround with *arrayOf(...)" "true" +// COMPILER_ARGUMENTS: -XXLanguage:+ProhibitAssigningSingleElementsToVarargsInNamedForm +// DISABLE-ERRORS + +fun anyFoo(vararg a: Any) {} + +fun test() { + anyFoo(a = intArrayOf(1)) +} \ No newline at end of file diff --git a/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForbiddenAssigningIntoArrayCall.kt.after b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForbiddenAssigningIntoArrayCall.kt.after new file mode 100644 index 00000000000..54a1d8b0fb1 --- /dev/null +++ b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForbiddenAssigningIntoArrayCall.kt.after @@ -0,0 +1,9 @@ +// "Surround with *arrayOf(...)" "true" +// COMPILER_ARGUMENTS: -XXLanguage:+ProhibitAssigningSingleElementsToVarargsInNamedForm +// DISABLE-ERRORS + +fun anyFoo(vararg a: Any) {} + +fun test() { + anyFoo(a = *arrayOf(intArrayOf(1))) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index d317b3a0f6c..2411a35042c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -9547,6 +9547,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/replaceWithArrayCallInAnnotation/literalWithValues.kt"); } + @TestMetadata("replaceForbiddenAssignmentWithArrayLiteral.kt") + public void testReplaceForbiddenAssignmentWithArrayLiteral() throws Exception { + runTest("idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceForbiddenAssignmentWithArrayLiteral.kt"); + } + @TestMetadata("replaceSingleElementInNamedForm.kt") public void testReplaceSingleElementInNamedForm() throws Exception { runTest("idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceSingleElementInNamedForm.kt"); @@ -10631,6 +10636,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForVarargOfAny.kt"); } + @TestMetadata("replaceForbiddenAssigningIntoArrayCall.kt") + public void testReplaceForbiddenAssigningIntoArrayCall() throws Exception { + runTest("idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForbiddenAssigningIntoArrayCall.kt"); + } + @TestMetadata("replaceToArrayOfPrimitiveTypes.kt") public void testReplaceToArrayOfPrimitiveTypes() throws Exception { runTest("idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceToArrayOfPrimitiveTypes.kt");