From d9c50f0fda855df2944126bca877bed4a8594c87 Mon Sep 17 00:00:00 2001 From: Victor Petukhov Date: Tue, 28 Sep 2021 17:50:24 +0300 Subject: [PATCH] Report `NON_VARARG_SPREAD` on missed cases ^KT-48162 Fixed --- ...CompilerTestFE10TestdataTestGenerated.java | 6 +++++ ...irOldFrontendDiagnosticsTestGenerated.java | 6 +++++ ...DiagnosticsWithLightTreeTestGenerated.java | 6 +++++ .../jetbrains/kotlin/diagnostics/Errors.java | 2 +- .../DiagnosticReporterByTrackingStrategy.kt | 16 +++++++++++--- .../ValueArgumentsToParametersMapper.java | 2 +- .../tests/checkArguments/SpreadVarargs.kt | 14 ++++++------ .../collectionLiteralsWithVarargs.kt | 2 +- .../varargs/NullableTypeForVarargArgument.kt | 4 ++-- .../diagnostics/tests/varargs/kt48162.fir.kt | 22 +++++++++++++++++++ .../diagnostics/tests/varargs/kt48162.kt | 22 +++++++++++++++++++ .../diagnostics/tests/varargs/kt48162.txt | 16 ++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 +++++ .../kotlin/config/LanguageVersionSettings.kt | 1 + 14 files changed, 110 insertions(+), 15 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/varargs/kt48162.fir.kt create mode 100644 compiler/testData/diagnostics/tests/varargs/kt48162.kt create mode 100644 compiler/testData/diagnostics/tests/varargs/kt48162.txt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 877892ff7f3..19c48a6b5ba 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -31641,6 +31641,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/varargs/kt422.kt"); } + @Test + @TestMetadata("kt48162.kt") + public void testKt48162() throws Exception { + runTest("compiler/testData/diagnostics/tests/varargs/kt48162.kt"); + } + @Test @TestMetadata("MoreSpecificVarargsOfEqualLength.kt") public void testMoreSpecificVarargsOfEqualLength() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index c37c3a0a383..41ede92fb9e 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -31689,6 +31689,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/varargs/kt422.kt"); } + @Test + @TestMetadata("kt48162.kt") + public void testKt48162() throws Exception { + runTest("compiler/testData/diagnostics/tests/varargs/kt48162.kt"); + } + @Test @TestMetadata("MoreSpecificVarargsOfEqualLength.kt") public void testMoreSpecificVarargsOfEqualLength() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 7e745a00569..caf0cd02a7a 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -31689,6 +31689,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/varargs/kt422.kt"); } + @Test + @TestMetadata("kt48162.kt") + public void testKt48162() throws Exception { + runTest("compiler/testData/diagnostics/tests/varargs/kt48162.kt"); + } + @Test @TestMetadata("MoreSpecificVarargsOfEqualLength.kt") public void testMoreSpecificVarargsOfEqualLength() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index ec54deaa0e5..a502cd5e763 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -755,7 +755,7 @@ public interface Errors { } DiagnosticFactory0 VARARG_OUTSIDE_PARENTHESES = DiagnosticFactory0.create(ERROR); - DiagnosticFactory0 NON_VARARG_SPREAD = DiagnosticFactory0.create(ERROR); + DiagnosticFactoryForDeprecation0 NON_VARARG_SPREAD = DiagnosticFactoryForDeprecation0.create(LanguageFeature.ReportNonVarargSpreadOnGenericCalls); DiagnosticFactory0 SPREAD_OF_NULLABLE = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 SPREAD_OF_LAMBDA_OR_CALLABLE_REFERENCE = DiagnosticFactory0.create(ERROR); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt index 25fafe60fd2..9efaebd50b3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt @@ -280,9 +280,19 @@ class DiagnosticReporterByTrackingStrategy( override fun onCallArgumentSpread(callArgument: KotlinCallArgument, diagnostic: KotlinCallDiagnostic) { when (diagnostic.javaClass) { NonVarargSpread::class.java -> { - val spreadElement = callArgument.safeAs()?.valueArgument?.getSpreadElement() - if (spreadElement != null) { - trace.report(NON_VARARG_SPREAD.on(spreadElement)) + val castedPsiCallArgument = callArgument.safeAs() + val castedCallArgument = callArgument.safeAs() + + if (castedCallArgument != null) { + val spreadElement = castedCallArgument.valueArgument.getSpreadElement() + if (spreadElement != null) { + trace.report(NON_VARARG_SPREAD.onError(spreadElement)) + } + } else if (castedPsiCallArgument != null) { + val spreadElement = castedPsiCallArgument.valueArgument.getSpreadElement() + if (spreadElement != null) { + trace.report(NON_VARARG_SPREAD.on(context.languageVersionSettings, spreadElement)) + } } } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ValueArgumentsToParametersMapper.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ValueArgumentsToParametersMapper.java index e67d4144b51..9b459443739 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ValueArgumentsToParametersMapper.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ValueArgumentsToParametersMapper.java @@ -349,7 +349,7 @@ public class ValueArgumentsToParametersMapper { else { LeafPsiElement spread = valueArgument.getSpreadElement(); if (spread != null) { - candidateCall.getTrace().report(NON_VARARG_SPREAD.on(spread)); + candidateCall.getTrace().report(NON_VARARG_SPREAD.onError(spread)); setStatus(WEAK_ERROR); } ResolvedValueArgument argument = new ExpressionValueArgument(valueArgument); diff --git a/compiler/testData/diagnostics/tests/checkArguments/SpreadVarargs.kt b/compiler/testData/diagnostics/tests/checkArguments/SpreadVarargs.kt index 66d6e41d1a5..0e5d90d3bf0 100644 --- a/compiler/testData/diagnostics/tests/checkArguments/SpreadVarargs.kt +++ b/compiler/testData/diagnostics/tests/checkArguments/SpreadVarargs.kt @@ -9,10 +9,10 @@ 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") + join(x = *1, a = *"2") join(x = 1, a = a) join(x = 1, a = b) join(1, *a) @@ -29,11 +29,11 @@ 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") - joinG(x = *1, a = *"2") + joinG(x = *1, a = *"2") joinG(1, *a) joinG(1, *a, "3") joinG(1, "4", *a, "3") @@ -42,11 +42,11 @@ 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") - joinG(x = *1, a = *"2") + joinG(x = *1, a = *"2") joinG(1, *a) joinG(1, *a, "3") joinG(1, "4", *a, "3") @@ -56,7 +56,7 @@ fun main() { val x1 = joinT(1, "2") checkSubtype(x1) - val x2 = joinT(*1, "2") + val x2 = joinT(*1, "2") checkSubtype(x2) val x6 = joinT(1, *a) checkSubtype(x6) diff --git a/compiler/testData/diagnostics/tests/collectionLiterals/collectionLiteralsWithVarargs.kt b/compiler/testData/diagnostics/tests/collectionLiterals/collectionLiteralsWithVarargs.kt index a19abc9c0bc..ce2729b36e9 100644 --- a/compiler/testData/diagnostics/tests/collectionLiterals/collectionLiteralsWithVarargs.kt +++ b/compiler/testData/diagnostics/tests/collectionLiterals/collectionLiteralsWithVarargs.kt @@ -33,7 +33,7 @@ fun test6() {} annotation class AnnArray(val a: Array) -@AnnArray(*["/"]) +@AnnArray(*["/"]) fun testArray() {} @Ann1([""]) diff --git a/compiler/testData/diagnostics/tests/varargs/NullableTypeForVarargArgument.kt b/compiler/testData/diagnostics/tests/varargs/NullableTypeForVarargArgument.kt index dbdde446817..9de5e43bf06 100644 --- a/compiler/testData/diagnostics/tests/varargs/NullableTypeForVarargArgument.kt +++ b/compiler/testData/diagnostics/tests/varargs/NullableTypeForVarargArgument.kt @@ -31,7 +31,7 @@ fun getArr(): Array? = null fun f() { A().foo(1, *args) bar(2, *args) - baz(*args) + baz(*args) } fun g(args: Array?) { @@ -55,7 +55,7 @@ fun h(b: B) { fun k() { A().foo(1, *getArr()) bar(2, *getArr()) - baz(*getArr()) + baz(*getArr()) } fun invokeTest(goodArgs: Array) { diff --git a/compiler/testData/diagnostics/tests/varargs/kt48162.fir.kt b/compiler/testData/diagnostics/tests/varargs/kt48162.fir.kt new file mode 100644 index 00000000000..e00e31751c4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/varargs/kt48162.fir.kt @@ -0,0 +1,22 @@ +// !DIAGNOSTICS: -UNCHECKED_CAST + +fun Collection.toArray(): Array = this as Array +fun Collection.toArray2(): Array = this as Array +fun toArray3(x: Collection): Array = x as Array + +class Foo { + operator fun plus(x: Foo): Array { + return this + x + } +} + +fun use(arg: Array, s: Collection, x: Foo) { + arr(*arg) + arr(*s.toArray()) + arr(*s.toArray2()) + arr(*toArray3(s)) + arr(*x + x) + arr(*(x + x)) +} + +fun arr(x: Array) {} diff --git a/compiler/testData/diagnostics/tests/varargs/kt48162.kt b/compiler/testData/diagnostics/tests/varargs/kt48162.kt new file mode 100644 index 00000000000..88b956c4fda --- /dev/null +++ b/compiler/testData/diagnostics/tests/varargs/kt48162.kt @@ -0,0 +1,22 @@ +// !DIAGNOSTICS: -UNCHECKED_CAST + +fun Collection.toArray(): Array = this as Array +fun Collection.toArray2(): Array = this as Array +fun toArray3(x: Collection): Array = x as Array + +class Foo { + operator fun plus(x: Foo): Array { + return this + x + } +} + +fun use(arg: Array, s: Collection, x: Foo) { + arr(*arg) + arr(*s.toArray()) + arr(*s.toArray2()) + arr(*toArray3(s)) + arr(*x + x) + arr(*(x + x)) +} + +fun arr(x: Array) {} diff --git a/compiler/testData/diagnostics/tests/varargs/kt48162.txt b/compiler/testData/diagnostics/tests/varargs/kt48162.txt new file mode 100644 index 00000000000..b05576bd2a5 --- /dev/null +++ b/compiler/testData/diagnostics/tests/varargs/kt48162.txt @@ -0,0 +1,16 @@ +package + +public fun arr(/*0*/ x: kotlin.Array): kotlin.Unit +public fun toArray3(/*0*/ x: kotlin.collections.Collection): kotlin.Array +public fun use(/*0*/ arg: kotlin.Array, /*1*/ s: kotlin.collections.Collection, /*2*/ x: Foo): kotlin.Unit +public fun kotlin.collections.Collection.toArray(): kotlin.Array +public fun kotlin.collections.Collection.toArray2(): kotlin.Array + +public final class Foo { + public constructor Foo() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final operator fun plus(/*0*/ x: Foo): kotlin.Array + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 0ee82249fc0..bde4f78692a 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -31785,6 +31785,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/varargs/kt422.kt"); } + @Test + @TestMetadata("kt48162.kt") + public void testKt48162() throws Exception { + runTest("compiler/testData/diagnostics/tests/varargs/kt48162.kt"); + } + @Test @TestMetadata("MoreSpecificVarargsOfEqualLength.kt") public void testMoreSpecificVarargsOfEqualLength() throws Exception { diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index a328978e02c..b5fdeab9764 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -227,6 +227,7 @@ enum class LanguageFeature( ProhibitInvalidCharsInNativeIdentifiers(KOTLIN_1_7, kind = BUG_FIX), DefinitelyNotNullTypeParameters(KOTLIN_1_7), DefinitelyNonNullableTypes(KOTLIN_1_7), + ReportNonVarargSpreadOnGenericCalls(KOTLIN_1_7, kind = BUG_FIX), ProhibitSimplificationOfNonTrivialConstBooleanExpressions(KOTLIN_1_7), SafeCallsAreAlwaysNullable(KOTLIN_1_7), StopPropagatingDeprecationThroughOverrides(KOTLIN_1_7),