Forbid default inline/crossinline suspend parameters
This commit is contained in:
@@ -18,6 +18,8 @@ package org.jetbrains.kotlin.resolve.inline
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.config.LanguageFeature
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
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.*
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.isInlineOnlyOrReifiable
|
import org.jetbrains.kotlin.descriptors.annotations.isInlineOnlyOrReifiable
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
import org.jetbrains.kotlin.diagnostics.Errors
|
||||||
@@ -109,6 +111,18 @@ class InlineAnalyzerExtension(
|
|||||||
checkDefaultValue(trace, parameter, ktParameter)
|
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);
|
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")
|
@TestMetadata("defaultLambdaInlining.kt")
|
||||||
public void testDefaultLambdaInlining() throws Exception {
|
public void testDefaultLambdaInlining() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/defaultLambdaInlining.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/defaultLambdaInlining.kt");
|
||||||
|
|||||||
Generated
+6
@@ -11558,6 +11558,12 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("defaultLambdaInlining.kt")
|
||||||
public void testDefaultLambdaInlining() throws Exception {
|
public void testDefaultLambdaInlining() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/defaultLambdaInlining.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/defaultLambdaInlining.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user