From 6b7173ba139218ce3493ddde77cf84d3ddec5ff2 Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Tue, 20 Feb 2018 14:05:03 +0300 Subject: [PATCH] Forbid default inline/crossinline suspend parameters --- .../resolve/inline/InlineAnalyzerExtension.kt | 14 ++++++++++++++ .../tests/inline/defaultLambdaInlineSuspend.kt | 10 ++++++++++ .../kotlin/checkers/DiagnosticsTestGenerated.java | 6 ++++++ .../javac/DiagnosticsUsingJavacTestGenerated.java | 6 ++++++ 4 files changed, 36 insertions(+) create mode 100644 compiler/testData/diagnostics/tests/inline/defaultLambdaInlineSuspend.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt index f6f522735e5..f8aac4af43b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt @@ -18,6 +18,8 @@ package org.jetbrains.kotlin.resolve.inline import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.coroutines.hasSuspendFunctionType +import org.jetbrains.kotlin.coroutines.isSuspendLambda import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.isInlineOnlyOrReifiable import org.jetbrains.kotlin.diagnostics.Errors @@ -109,6 +111,18 @@ class InlineAnalyzerExtension( checkDefaultValue(trace, parameter, ktParameter) } } + // Report unsupported error on inline/crossinline suspend lambdas with default values. + if (functionDescriptor.isSuspend && + InlineUtil.isInlineParameterExceptNullability(parameter) && + parameter.hasSuspendFunctionType + ) { + trace.report( + Errors.NOT_YET_SUPPORTED_IN_INLINE.on( + ktParameter, + "Suspend functional parameters with default values" + ) + ) + } } } } diff --git a/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineSuspend.kt b/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineSuspend.kt new file mode 100644 index 00000000000..85372fb5dee --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineSuspend.kt @@ -0,0 +1,10 @@ +// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE -NOTHING_TO_INLINE +// SKIP_TXT + +suspend inline fun test1(s : suspend () -> String = { "OK" }) {} +suspend inline fun test2(s : () -> String = { "OK" }) {} +suspend inline fun test3(crossinline s : suspend () -> String = { "OK" }) {} +suspend inline fun test4(crossinline s : () -> String = { "OK" }) {} +suspend inline fun test5(noinline s : suspend () -> String = { "OK" }) {} +suspend inline fun test6(noinline s : () -> String = { "OK" }) {} + diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 0d16e7fbef4..cb324234de9 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -11558,6 +11558,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("defaultLambdaInlineSuspend.kt") + public void testDefaultLambdaInlineSuspend() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/defaultLambdaInlineSuspend.kt"); + doTest(fileName); + } + @TestMetadata("defaultLambdaInlining.kt") public void testDefaultLambdaInlining() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/defaultLambdaInlining.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index e62cd005a7c..d3572ca970c 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -11558,6 +11558,12 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing doTest(fileName); } + @TestMetadata("defaultLambdaInlineSuspend.kt") + public void testDefaultLambdaInlineSuspend() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/defaultLambdaInlineSuspend.kt"); + doTest(fileName); + } + @TestMetadata("defaultLambdaInlining.kt") public void testDefaultLambdaInlining() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/defaultLambdaInlining.kt");