From 599f520fd8e9f749739628f02b7a48ceac68173b Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Mon, 1 Jun 2020 02:45:29 +0300 Subject: [PATCH] Add compatibility warning for chained sam->suspend-conversion --- ...irOldFrontendDiagnosticsTestGenerated.java | 5 +++ .../calls/components/typeConversions.kt | 15 ++++--- ...FunSuspendConversionForSimpleExpression.kt | 2 +- ...spendAndFunConversionInDisabledMode.fir.kt | 31 ++++++++++++++ .../suspendAndFunConversionInDisabledMode.kt | 30 +++++++++++++ .../suspendAndFunConversionInDisabledMode.txt | 42 +++++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 5 +++ .../DiagnosticsUsingJavacTestGenerated.java | 5 +++ 8 files changed, 126 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.fir.kt create mode 100644 compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.kt create mode 100644 compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.txt diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java index f60f4b5466b..8bd899a7965 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java @@ -23207,6 +23207,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte runTest("compiler/testData/diagnostics/tests/suspendConversion/severalConversionsInOneCall.kt"); } + @TestMetadata("suspendAndFunConversionInDisabledMode.kt") + public void testSuspendAndFunConversionInDisabledMode() throws Exception { + runTest("compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.kt"); + } + @TestMetadata("suspendConversionCompatibility.kt") public void testSuspendConversionCompatibility() throws Exception { runTest("compiler/testData/diagnostics/tests/suspendConversion/suspendConversionCompatibility.kt"); diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/typeConversions.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/typeConversions.kt index 3943aba87d2..0bd5d6be55a 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/typeConversions.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/typeConversions.kt @@ -38,17 +38,16 @@ object TypeConversions { val samConversionData = performConversionBeforeSubtyping( candidate, argument, candidateParameter, candidateExpectedType, SamTypeConversions ) - val suspendConversionData = if (samConversionData.convertedType == null) { - performConversionBeforeSubtyping(candidate, argument, candidateParameter, candidateExpectedType, SuspendTypeConversions) - } else { - null - } + + val suspendConversionData = performConversionBeforeSubtyping( + candidate, argument, candidateParameter, samConversionData.convertedType ?: candidateExpectedType, SuspendTypeConversions + ) return ConversionData( - convertedType = samConversionData.convertedType ?: suspendConversionData?.convertedType, - wasConversion = samConversionData.wasConversion || suspendConversionData?.wasConversion == true, + convertedType = suspendConversionData.convertedType ?: samConversionData.convertedType, + wasConversion = samConversionData.wasConversion || suspendConversionData.wasConversion, conversionDefinitelyNotNeeded = samConversionData.conversionDefinitelyNotNeeded && - (suspendConversionData == null || suspendConversionData.conversionDefinitelyNotNeeded) + suspendConversionData.conversionDefinitelyNotNeeded ) } diff --git a/compiler/testData/diagnostics/tests/suspendConversion/chainedFunSuspendConversionForSimpleExpression.kt b/compiler/testData/diagnostics/tests/suspendConversion/chainedFunSuspendConversionForSimpleExpression.kt index 8edb7b0a344..e26d3fcaf19 100644 --- a/compiler/testData/diagnostics/tests/suspendConversion/chainedFunSuspendConversionForSimpleExpression.kt +++ b/compiler/testData/diagnostics/tests/suspendConversion/chainedFunSuspendConversionForSimpleExpression.kt @@ -9,5 +9,5 @@ fun foo(s: SuspendRunnable) {} fun test(f: () -> Unit) { foo { } - foo(f) + foo(f) } diff --git a/compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.fir.kt b/compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.fir.kt new file mode 100644 index 00000000000..c1c9afa394e --- /dev/null +++ b/compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.fir.kt @@ -0,0 +1,31 @@ +// !LANGUAGE: -SuspendConversion +// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_EXPRESSION + +fun interface SuspendRunnable { + suspend fun run() +} + +object Test1 { + fun call(r: () -> Unit) {} + + object Scope { + fun call(r: SuspendRunnable) {} + + fun bar(f: () -> Unit) { + call(f) + } + } +} + +object Test2 { + fun call(r: Runnable) {} + + object Scope { + fun call(r: SuspendRunnable) {} + + fun bar(f: () -> Unit) { + call(f) + } + } +} + diff --git a/compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.kt b/compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.kt new file mode 100644 index 00000000000..79accbd9af4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.kt @@ -0,0 +1,30 @@ +// !LANGUAGE: -SuspendConversion +// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_EXPRESSION + +fun interface SuspendRunnable { + suspend fun run() +} + +object Test1 { + fun call(r: () -> Unit) {} + + object Scope { + fun call(r: SuspendRunnable) {} + + fun bar(f: () -> Unit) { + call(f) + } + } +} + +object Test2 { + fun call(r: Runnable) {} + + object Scope { + fun call(r: SuspendRunnable) {} + + fun bar(f: () -> Unit) { + call(f) + } + } +} diff --git a/compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.txt b/compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.txt new file mode 100644 index 00000000000..2e7066b7f5b --- /dev/null +++ b/compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.txt @@ -0,0 +1,42 @@ +package + +public fun interface SuspendRunnable { + 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 abstract suspend fun run(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public object Test1 { + private constructor Test1() + public final fun call(/*0*/ r: () -> kotlin.Unit): kotlin.Unit + 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 open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public object Scope { + private constructor Scope() + public final fun bar(/*0*/ f: () -> kotlin.Unit): kotlin.Unit + public final fun call(/*0*/ r: SuspendRunnable): kotlin.Unit + 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 open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + +public object Test2 { + private constructor Test2() + public final fun call(/*0*/ r: java.lang.Runnable): kotlin.Unit + 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 open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public object Scope { + private constructor Scope() + public final fun bar(/*0*/ f: () -> kotlin.Unit): kotlin.Unit + public final fun call(/*0*/ r: SuspendRunnable): kotlin.Unit + 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 open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index bf00191d066..be196460113 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -23289,6 +23289,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTestWithFirVali runTest("compiler/testData/diagnostics/tests/suspendConversion/severalConversionsInOneCall.kt"); } + @TestMetadata("suspendAndFunConversionInDisabledMode.kt") + public void testSuspendAndFunConversionInDisabledMode() throws Exception { + runTest("compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.kt"); + } + @TestMetadata("suspendConversionCompatibility.kt") public void testSuspendConversionCompatibility() throws Exception { runTest("compiler/testData/diagnostics/tests/suspendConversion/suspendConversionCompatibility.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 3cb3939c27a..03cf192925e 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -23209,6 +23209,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/suspendConversion/severalConversionsInOneCall.kt"); } + @TestMetadata("suspendAndFunConversionInDisabledMode.kt") + public void testSuspendAndFunConversionInDisabledMode() throws Exception { + runTest("compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.kt"); + } + @TestMetadata("suspendConversionCompatibility.kt") public void testSuspendConversionCompatibility() throws Exception { runTest("compiler/testData/diagnostics/tests/suspendConversion/suspendConversionCompatibility.kt");