From 389dcff1255cbdad287eb81cdf19e9b4d2fa0195 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 13 Feb 2020 17:39:46 +0300 Subject: [PATCH] [FIR] Discard argument with spread in place of non-vararg parameter --- .../calls/FirCallArgumentsProcessor.kt | 10 +++++-- .../testData/resolve/spreadOperator.kt | 28 +++++++++++++++++++ .../testData/resolve/spreadOperator.txt | 22 +++++++++++++++ .../fir/FirDiagnosticsTestGenerated.java | 5 ++++ ...DiagnosticsWithLightTreeTestGenerated.java | 5 ++++ .../tests/checkArguments/SpreadVarargs.fir.kt | 10 +++---- 6 files changed, 72 insertions(+), 8 deletions(-) create mode 100644 compiler/fir/resolve/testData/resolve/spreadOperator.kt create mode 100644 compiler/fir/resolve/testData/resolve/spreadOperator.txt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirCallArgumentsProcessor.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirCallArgumentsProcessor.kt index ca9479667ab..5b99e6dfa9c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirCallArgumentsProcessor.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirCallArgumentsProcessor.kt @@ -69,13 +69,17 @@ class FirCallArgumentsProcessor( val currentParameter = currentParameter ?: return MappingStatus.ERROR argumentMap[argument] = currentParameter - if (!currentParameter.isVararg || - argument is FirWrappedArgumentExpression && argument.isSpread - ) { + + val isSpread = argument is FirWrappedArgumentExpression && argument.isSpread + if (!currentParameter.isVararg || isSpread) { usedParameters += currentParameter currentParameterIndex++ } + if (!currentParameter.isVararg && isSpread) { + return MappingStatus.ERROR + } + return MappingStatus.SUCCESS } } diff --git a/compiler/fir/resolve/testData/resolve/spreadOperator.kt b/compiler/fir/resolve/testData/resolve/spreadOperator.kt new file mode 100644 index 00000000000..df9adc970ad --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/spreadOperator.kt @@ -0,0 +1,28 @@ +// FILE: Utils.java + +public class Utils { + public static String[] getStrings() { + return new String[0]; + } +} + +// FILE: Main.kt + +fun myListOf(vararg elements: T): List = null!! +fun myListOf(element: T): List = null!! + +fun takeStrings(list: List) {} + +fun getStrings(): Array = null!! + +fun testFromKotlin() { + val values = getStrings() + val list = myListOf(*values) + takeStrings(list) +} + +fun testFromJava() { + val values = Utils.getStrings() + val list = myListOf(*values) + takeStrings(list) +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/spreadOperator.txt b/compiler/fir/resolve/testData/resolve/spreadOperator.txt new file mode 100644 index 00000000000..499c4159c85 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/spreadOperator.txt @@ -0,0 +1,22 @@ +FILE: Main.kt + public final fun myListOf(vararg elements: R|kotlin/Array|): R|kotlin/collections/List| { + ^myListOf Null(null)!! + } + public final fun myListOf(element: R|T|): R|kotlin/collections/List| { + ^myListOf Null(null)!! + } + public final fun takeStrings(list: R|kotlin/collections/List|): R|kotlin/Unit| { + } + public final fun getStrings(): R|kotlin/Array| { + ^getStrings Null(null)!! + } + public final fun testFromKotlin(): R|kotlin/Unit| { + lval values: R|kotlin/Array| = R|/getStrings|() + lval list: R|kotlin/collections/List| = R|/myListOf|(vararg(*R|/values|)) + R|/takeStrings|(R|/list|) + } + public final fun testFromJava(): R|kotlin/Unit| { + lval values: R|ft!>, kotlin/Array!>?>!| = Q|Utils|.R|/Utils.getStrings|() + lval list: R|kotlin/collections/List!>| = R|/myListOf|!|>(vararg(*R|/values|)) + R|/takeStrings|(R|/list|) + } diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java index b61d2f16a76..b5921c7131e 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java @@ -268,6 +268,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest { runTest("compiler/fir/resolve/testData/resolve/simpleTypeAlias.kt"); } + @TestMetadata("spreadOperator.kt") + public void testSpreadOperator() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/spreadOperator.kt"); + } + @TestMetadata("syntheticsVsNormalProperties.kt") public void testSyntheticsVsNormalProperties() throws Exception { runTest("compiler/fir/resolve/testData/resolve/syntheticsVsNormalProperties.kt"); diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java index df51492ca08..3c53a7d3201 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java @@ -268,6 +268,11 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos runTest("compiler/fir/resolve/testData/resolve/simpleTypeAlias.kt"); } + @TestMetadata("spreadOperator.kt") + public void testSpreadOperator() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/spreadOperator.kt"); + } + @TestMetadata("syntheticsVsNormalProperties.kt") public void testSyntheticsVsNormalProperties() throws Exception { runTest("compiler/fir/resolve/testData/resolve/syntheticsVsNormalProperties.kt"); diff --git a/compiler/testData/diagnostics/tests/checkArguments/SpreadVarargs.fir.kt b/compiler/testData/diagnostics/tests/checkArguments/SpreadVarargs.fir.kt index 6890c03ca24..62252ee2c50 100644 --- a/compiler/testData/diagnostics/tests/checkArguments/SpreadVarargs.fir.kt +++ b/compiler/testData/diagnostics/tests/checkArguments/SpreadVarargs.fir.kt @@ -10,7 +10,7 @@ fun main() { join(1) join(1, "2") join(1, "2", "3") - join(*1, "2") + join(*1, "2") join(1, *"2") join(x = 1, a = "2") join(x = *1, a = *"2") @@ -30,7 +30,7 @@ fun main() { join(a = a, x = 1) joinG(1, "2") - joinG(*1, "2") + joinG(*1, "2") joinG(1, *"2") joinG(x = 1, a = a) joinG(x = 1, a = "2") @@ -43,7 +43,7 @@ fun main() { joinG(a = a, x = 1) joinG(1, "2") - joinG(*1, "2") + joinG(*1, "2") joinG(1, *"2") joinG(x = 1, a = a) joinG(x = 1, a = "2") @@ -57,8 +57,8 @@ fun main() { val x1 = joinT(1, "2") checkSubtype(x1) - val x2 = joinT(*1, "2") - checkSubtype(x2) + val x2 = joinT(*1, "2") + checkSubtype(x2) val x6 = joinT(1, *a) checkSubtype(x6) val x7 = joinT(1, *a, "3")