Forbid default inline/crossinline suspend parameters

This commit is contained in:
Ilmir Usmanov
2018-02-20 14:05:03 +03:00
parent 7224b99928
commit 6b7173ba13
4 changed files with 36 additions and 0 deletions
@@ -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"
)
)
}
}
}
}
@@ -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(<!NOT_YET_SUPPORTED_IN_INLINE!>s : suspend () -> String = { "OK" }<!>) {}
suspend inline fun test2(s : () -> String = { "OK" }) {}
suspend inline fun test3(<!NOT_YET_SUPPORTED_IN_INLINE!>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" }) {}
@@ -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");
@@ -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");