Report corresponding diagnostic on suspend lambda

This commit is contained in:
Mikhail Zarechenskiy
2016-12-15 15:06:21 +03:00
committed by Stanislav Erokhin
parent b88c8ea2e7
commit 4b892b1c9c
5 changed files with 10 additions and 5 deletions
@@ -37,6 +37,7 @@ import org.jetbrains.kotlin.psi.debugText.getDebugText
import org.jetbrains.kotlin.resolve.PossiblyBareType.bare
import org.jetbrains.kotlin.resolve.PossiblyBareType.type
import org.jetbrains.kotlin.resolve.bindingContextUtil.recordScope
import org.jetbrains.kotlin.resolve.calls.checkers.checkCoroutinesFeature
import org.jetbrains.kotlin.resolve.calls.tasks.DynamicCallableDescriptors
import org.jetbrains.kotlin.resolve.descriptorUtil.findImplicitOuterClassArguments
import org.jetbrains.kotlin.resolve.scopes.LazyScopeAdapter
@@ -179,8 +180,12 @@ class TypeResolver(
var result: PossiblyBareType? = null
val hasSuspendModifier = modifiers?.hasModifier(KtTokens.SUSPEND_KEYWORD) ?: false
val suspendModifier = modifiers?.getModifier(KtTokens.SUSPEND_KEYWORD)
if (hasSuspendModifier && typeElement !is KtFunctionType) {
c.trace.report(Errors.WRONG_MODIFIER_TARGET.on(modifiers!!.getModifier(KtTokens.SUSPEND_KEYWORD)!!, KtTokens.SUSPEND_KEYWORD, "non-functional type"))
c.trace.report(Errors.WRONG_MODIFIER_TARGET.on(suspendModifier!!, KtTokens.SUSPEND_KEYWORD, "non-functional type"))
}
else if (hasSuspendModifier) {
checkCoroutinesFeature(languageVersionSettings, c.trace, suspendModifier!!)
}
typeElement?.accept(object : KtVisitorVoid() {
@@ -96,7 +96,7 @@ object BuilderFunctionsCallChecker : CallChecker {
}
}
private fun checkCoroutinesFeature(languageVersionSettings: LanguageVersionSettings, diagnosticHolder: DiagnosticSink, reportOn: PsiElement) {
fun checkCoroutinesFeature(languageVersionSettings: LanguageVersionSettings, diagnosticHolder: DiagnosticSink, reportOn: PsiElement) {
if (!languageVersionSettings.supportsFeature(LanguageFeature.Coroutines)) {
diagnosticHolder.report(Errors.UNSUPPORTED_FEATURE.on(reportOn, LanguageFeature.Coroutines))
}
@@ -3,7 +3,7 @@
<!EXPERIMENTAL_FEATURE_ERROR!>suspend<!> fun suspendHere(): String = "OK"
fun builder(c: suspend () -> Unit) {
fun builder(c: <!EXPERIMENTAL_FEATURE_ERROR!>suspend<!> () -> Unit) {
}
@@ -3,7 +3,7 @@
<!EXPERIMENTAL_FEATURE_WARNING!>suspend<!> fun suspendHere(): String = "OK"
fun builder(c: suspend () -> Unit) {
fun builder(c: <!EXPERIMENTAL_FEATURE_WARNING!>suspend<!> () -> Unit) {
}
@@ -3,7 +3,7 @@
<!UNSUPPORTED_FEATURE!>suspend<!> fun suspendHere(): String = "OK"
fun builder(c: suspend () -> Unit) {
fun builder(c: <!UNSUPPORTED_FEATURE!>suspend<!> () -> Unit) {
}