From f19581dc4d7dcbe6ef28fe38748047cc8a2a6ce1 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 15 Dec 2016 16:36:49 +0300 Subject: [PATCH] Suspend lambdas can't have value parameters (UNSUPPORTED in M04). --- .../src/org/jetbrains/kotlin/resolve/TypeResolver.kt | 3 +++ .../tests/coroutines/inference/withParameter.kt | 2 +- .../tests/coroutines/inference/withUninferredParameter.kt | 2 +- .../diagnostics/tests/coroutines/lambdaExpectedType.kt | 2 +- .../tests/coroutines/suspendFunctionType/inference1.kt | 2 +- .../tests/coroutines/suspendFunctionType/inference2.kt | 2 +- .../suspendFunctionType/lambdaInValInitializer.kt | 2 +- .../suspendFunctionType/modifierApplicability.kt | 8 ++++---- .../suspendFunctionType/modifierApplicability.txt | 2 +- .../coroutines/suspendFunctionType/noValueParameters.kt | 4 ++++ .../coroutines/suspendFunctionType/noValueParameters.txt | 6 ++++++ .../kotlin/checkers/DiagnosticsTestGenerated.java | 6 ++++++ 12 files changed, 30 insertions(+), 11 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/noValueParameters.kt create mode 100644 compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/noValueParameters.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt index 5a8400f6cc9..1019b524af3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt @@ -220,6 +220,9 @@ class TypeResolver( val receiverTypeRef = type.receiverTypeReference val receiverType = if (receiverTypeRef == null) null else resolveType(c.noBareTypes(), receiverTypeRef) + if (hasSuspendModifier && type.parameters.isNotEmpty()) { + c.trace.report(UNSUPPORTED.on(type, "suspend function type with value parameters")) + } val parameterDescriptors = resolveParametersOfFunctionType(type.parameters) val returnTypeRef = type.returnTypeReference diff --git a/compiler/testData/diagnostics/tests/coroutines/inference/withParameter.kt b/compiler/testData/diagnostics/tests/coroutines/inference/withParameter.kt index ce737158005..f6e5f5a572c 100644 --- a/compiler/testData/diagnostics/tests/coroutines/inference/withParameter.kt +++ b/compiler/testData/diagnostics/tests/coroutines/inference/withParameter.kt @@ -4,7 +4,7 @@ class GenericController { suspend fun yield(t: T) {} } -fun generate(p1: P1, p2: List, g: suspend GenericController.(P1, P2) -> R): Four = TODO() +fun generate(p1: P1, p2: List, g: suspend GenericController.(P1, P2) -> R): Four = TODO() val test1 = generate(1, listOf("")) { p1, p2 -> yield(p1) diff --git a/compiler/testData/diagnostics/tests/coroutines/inference/withUninferredParameter.kt b/compiler/testData/diagnostics/tests/coroutines/inference/withUninferredParameter.kt index 716c9a30460..4fd04bc62aa 100644 --- a/compiler/testData/diagnostics/tests/coroutines/inference/withUninferredParameter.kt +++ b/compiler/testData/diagnostics/tests/coroutines/inference/withUninferredParameter.kt @@ -4,7 +4,7 @@ class GenericController { suspend fun yield(t: T) {} } -fun generate(g: suspend GenericController.(S) -> Unit): S = TODO() +fun generate(g: suspend GenericController.(S) -> Unit): S = TODO() val test1 = generate { yield(4) diff --git a/compiler/testData/diagnostics/tests/coroutines/lambdaExpectedType.kt b/compiler/testData/diagnostics/tests/coroutines/lambdaExpectedType.kt index 089e83bf94a..14e7f8fd107 100644 --- a/compiler/testData/diagnostics/tests/coroutines/lambdaExpectedType.kt +++ b/compiler/testData/diagnostics/tests/coroutines/lambdaExpectedType.kt @@ -12,7 +12,7 @@ fun manyArgumentsBuilder( c3: suspend () -> Int ):T = null!! -fun severalParamsInLambda(c: suspend (String, Int) -> Unit) {} +fun severalParamsInLambda(c: suspend (String, Int) -> Unit) {} fun foo() { builder({ 1 }) diff --git a/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/inference1.kt b/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/inference1.kt index 8ba65a2825b..afe468b8ff1 100644 --- a/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/inference1.kt +++ b/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/inference1.kt @@ -1,6 +1,6 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER -fun withS(x: T, sfn: suspend (T) -> Unit) = x +fun withS(x: T, sfn: suspend (T) -> Unit) = x val test1 = withS(100) {} diff --git a/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/inference2.kt b/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/inference2.kt index fd9954a43b6..f52af7785ab 100644 --- a/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/inference2.kt +++ b/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/inference2.kt @@ -1,5 +1,5 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER -fun withS2(x: T1, sfn1: suspend (T1) -> T2, sfn2: suspend (T2) -> Unit): T2 = null!! +fun withS2(x: T1, sfn1: suspend (T1) -> T2, sfn2: suspend (T2) -> Unit): T2 = null!! val test1 = withS2(100, { it.toLong().toString() }, { it.length }) \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/lambdaInValInitializer.kt b/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/lambdaInValInitializer.kt index e892e54f7cb..d1342e3b041 100644 --- a/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/lambdaInValInitializer.kt +++ b/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/lambdaInValInitializer.kt @@ -2,5 +2,5 @@ typealias SuspendFn = suspend () -> Unit val test1: suspend () -> Unit = {} val test2: suspend Any.() -> Unit = {} -val test3: suspend Any.(Int) -> Int = { k: Int -> k + 1 } +val test3: suspend Any.(Int) -> Int = { k: Int -> k + 1 } val test4: SuspendFn = {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/modifierApplicability.kt b/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/modifierApplicability.kt index 4ac9140a271..332b15577b7 100644 --- a/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/modifierApplicability.kt +++ b/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/modifierApplicability.kt @@ -5,14 +5,14 @@ interface SAM { } typealias Test1 = suspend () -> Unit -typealias Test2 = suspend Int.(String) -> Unit +typealias Test2 = suspend Int.() -> Unit typealias Test3 = suspend Function0 typealias Test4 = suspend Action typealias Test5 = List Unit> typealias Test6 = suspend List<() -> Unit> typealias Test7 = suspend SAM typealias Test8 = suspend SuspendFunction0 -typealias Test9 = suspend (() -> Unit) -> Unit -typealias Test10 = suspend (suspend () -> Unit) -> Unit +typealias Test9 = suspend (() -> Unit) -> Unit +typealias Test10 = suspend (suspend () -> Unit) -> Unit typealias Test11 = suspend () -> (suspend () -> Unit) -typealias Test12 = suspend (suspend (() -> Unit)) -> Unit \ No newline at end of file +typealias Test12 = suspend (suspend (() -> Unit)) -> Unit \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/modifierApplicability.txt b/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/modifierApplicability.txt index 4953131d852..22cd55f87a0 100644 --- a/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/modifierApplicability.txt +++ b/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/modifierApplicability.txt @@ -11,7 +11,7 @@ public typealias Test1 = suspend () -> kotlin.Unit public typealias Test10 = suspend (suspend () -> kotlin.Unit) -> kotlin.Unit public typealias Test11 = suspend () -> suspend () -> kotlin.Unit public typealias Test12 = suspend (suspend () -> kotlin.Unit) -> kotlin.Unit -public typealias Test2 = suspend kotlin.Int.(kotlin.String) -> kotlin.Unit +public typealias Test2 = suspend kotlin.Int.() -> kotlin.Unit public typealias Test3 = () -> kotlin.Unit public typealias Test4 = Action public typealias Test5 = kotlin.collections.List kotlin.Unit> diff --git a/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/noValueParameters.kt b/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/noValueParameters.kt new file mode 100644 index 00000000000..f4a200c1be4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/noValueParameters.kt @@ -0,0 +1,4 @@ +typealias Test1 = suspend (Int) -> Unit +typealias Test2 = suspend Int.(Int) -> Unit +typealias Test3 = List(Int) -> Unit> +typealias Test4 = ListInt.(Int) -> Unit> \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/noValueParameters.txt b/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/noValueParameters.txt new file mode 100644 index 00000000000..39f51d09604 --- /dev/null +++ b/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/noValueParameters.txt @@ -0,0 +1,6 @@ +package + +public typealias Test1 = suspend (kotlin.Int) -> kotlin.Unit +public typealias Test2 = suspend kotlin.Int.(kotlin.Int) -> kotlin.Unit +public typealias Test3 = kotlin.collections.List kotlin.Unit> +public typealias Test4 = kotlin.collections.List kotlin.Unit> diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 8a17fca3a8c..0c3e09ec3e6 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -4518,6 +4518,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("noValueParameters.kt") + public void testNoValueParameters() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/noValueParameters.kt"); + doTest(fileName); + } + @TestMetadata("suspendFunctionNIsUnresolved.kt") public void testSuspendFunctionNIsUnresolved() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/suspendFunctionNIsUnresolved.kt");