From eaeaf3c8a315938b4c4afbee7ac4f398510df3c2 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Mon, 1 Jun 2020 00:46:18 +0300 Subject: [PATCH] Add compatibility warning for suspend conversions --- ...irOldFrontendDiagnosticsTestGenerated.java | 5 +++ .../components/suspendConversionUtils.kt | 3 ++ .../suspendConversionCompatibility.fir.kt | 28 +++++++++++++++ .../suspendConversionCompatibility.kt | 28 +++++++++++++++ .../suspendConversionCompatibility.txt | 36 +++++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 5 +++ .../DiagnosticsUsingJavacTestGenerated.java | 5 +++ 7 files changed, 110 insertions(+) create mode 100644 compiler/testData/diagnostics/tests/suspendConversion/suspendConversionCompatibility.fir.kt create mode 100644 compiler/testData/diagnostics/tests/suspendConversion/suspendConversionCompatibility.kt create mode 100644 compiler/testData/diagnostics/tests/suspendConversion/suspendConversionCompatibility.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 d6cf9f90587..e5d838c9646 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("suspendConversionCompatibility.kt") + public void testSuspendConversionCompatibility() throws Exception { + runTest("compiler/testData/diagnostics/tests/suspendConversion/suspendConversionCompatibility.kt"); + } + @TestMetadata("suspendConversionDisabled.kt") public void testSuspendConversionDisabled() throws Exception { runTest("compiler/testData/diagnostics/tests/suspendConversion/suspendConversionDisabled.kt"); diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/suspendConversionUtils.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/suspendConversionUtils.kt index f76ad514c84..4956899a9b0 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/suspendConversionUtils.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/suspendConversionUtils.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.resolve.calls.components import org.jetbrains.kotlin.builtins.* import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.ParameterDescriptor +import org.jetbrains.kotlin.resolve.calls.inference.model.LowerPriorityToPreserveCompatibility import org.jetbrains.kotlin.resolve.calls.model.* import org.jetbrains.kotlin.types.UnwrappedType @@ -53,6 +54,8 @@ object SuspendTypeConversions : ParameterTypeConversion { candidate.resolvedCall.registerArgumentWithSuspendConversion(argument, nonSuspendParameterType) + candidate.addDiagnostic(LowerPriorityToPreserveCompatibility) + return nonSuspendParameterType } } diff --git a/compiler/testData/diagnostics/tests/suspendConversion/suspendConversionCompatibility.fir.kt b/compiler/testData/diagnostics/tests/suspendConversion/suspendConversionCompatibility.fir.kt new file mode 100644 index 00000000000..b2dec0ce14f --- /dev/null +++ b/compiler/testData/diagnostics/tests/suspendConversion/suspendConversionCompatibility.fir.kt @@ -0,0 +1,28 @@ +// !LANGUAGE: +SuspendConversion +// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_EXPRESSION + +object Test1 { + fun foo(f: () -> Unit) {} + + object Scope { + fun foo(f: suspend () -> Unit) {} + + fun test(g: () -> Unit) { + foo(g) + } + } +} + +object Test2 { + fun foo(f: suspend () -> T): T = TODO() + suspend fun bar(): Int = 0 + + object Scope { + fun bar(): String = "" + + fun test() { + val result = foo(::bar) + result + } + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/suspendConversion/suspendConversionCompatibility.kt b/compiler/testData/diagnostics/tests/suspendConversion/suspendConversionCompatibility.kt new file mode 100644 index 00000000000..d19968690a6 --- /dev/null +++ b/compiler/testData/diagnostics/tests/suspendConversion/suspendConversionCompatibility.kt @@ -0,0 +1,28 @@ +// !LANGUAGE: +SuspendConversion +// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_EXPRESSION + +object Test1 { + fun foo(f: () -> Unit) {} + + object Scope { + fun foo(f: suspend () -> Unit) {} + + fun test(g: () -> Unit) { + foo(g) + } + } +} + +object Test2 { + fun foo(f: suspend () -> T): T = TODO() + suspend fun bar(): Int = 0 + + object Scope { + fun bar(): String = "" + + fun test() { + val result = foo(::bar) + result + } + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/suspendConversion/suspendConversionCompatibility.txt b/compiler/testData/diagnostics/tests/suspendConversion/suspendConversionCompatibility.txt new file mode 100644 index 00000000000..c298cc48bbd --- /dev/null +++ b/compiler/testData/diagnostics/tests/suspendConversion/suspendConversionCompatibility.txt @@ -0,0 +1,36 @@ +package + +public object Test1 { + private constructor Test1() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun foo(/*0*/ f: () -> kotlin.Unit): kotlin.Unit + 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 open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun foo(/*0*/ f: suspend () -> kotlin.Unit): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final fun test(/*0*/ g: () -> kotlin.Unit): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + +public object Test2 { + private constructor Test2() + public final suspend fun bar(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun foo(/*0*/ f: suspend () -> T): T + 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(): kotlin.String + 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 fun test(): kotlin.Unit + 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 f9bd7827178..fca10f8f94c 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("suspendConversionCompatibility.kt") + public void testSuspendConversionCompatibility() throws Exception { + runTest("compiler/testData/diagnostics/tests/suspendConversion/suspendConversionCompatibility.kt"); + } + @TestMetadata("suspendConversionDisabled.kt") public void testSuspendConversionDisabled() throws Exception { runTest("compiler/testData/diagnostics/tests/suspendConversion/suspendConversionDisabled.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 069e6fb4eb5..d57498c7aeb 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("suspendConversionCompatibility.kt") + public void testSuspendConversionCompatibility() throws Exception { + runTest("compiler/testData/diagnostics/tests/suspendConversion/suspendConversionCompatibility.kt"); + } + @TestMetadata("suspendConversionDisabled.kt") public void testSuspendConversionDisabled() throws Exception { runTest("compiler/testData/diagnostics/tests/suspendConversion/suspendConversionDisabled.kt");