Prohibit star-projections in last parameter of suspend functions
This commit is contained in:
@@ -46,7 +46,7 @@ object SuspendModifierChecker : SimpleDeclarationChecker {
|
||||
val functionDescriptor = descriptor as? FunctionDescriptor ?: return
|
||||
if (!functionDescriptor.isSuspend) return
|
||||
|
||||
val suspendModifierElement = declaration.modifierList?.getModifier(KtTokens.SUSPEND_KEYWORD).sure { "${declaration.text}" }
|
||||
val suspendModifierElement = declaration.modifierList?.getModifier(KtTokens.SUSPEND_KEYWORD).sure { declaration.text }
|
||||
fun report(message: String) {
|
||||
diagnosticHolder.report(Errors.INAPPLICABLE_MODIFIER.on(suspendModifierElement, KtTokens.SUSPEND_KEYWORD, message))
|
||||
}
|
||||
@@ -70,11 +70,16 @@ object SuspendModifierChecker : SimpleDeclarationChecker {
|
||||
}
|
||||
}
|
||||
|
||||
val isValidContinuation = functionDescriptor.valueParameters.lastOrNull()?.type?.isValidContinuation() ?: false
|
||||
val continuationParameterType = functionDescriptor.valueParameters.lastOrNull()?.type
|
||||
val isValidContinuation = continuationParameterType?.isValidContinuation() ?: false
|
||||
if (!isValidContinuation) {
|
||||
report("last parameter of suspend function should have a type of Continuation<T>")
|
||||
return
|
||||
}
|
||||
|
||||
if (continuationParameterType?.arguments?.firstOrNull()?.isStarProjection == true) {
|
||||
report("Continuation<*> is prohibited as a last parameter of suspend function")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,11 @@ class Controller {
|
||||
|
||||
}
|
||||
|
||||
<!INAPPLICABLE_MODIFIER!>suspend<!> fun starProjection(vararg x: Continuation<Any>) {
|
||||
<!INAPPLICABLE_MODIFIER!>suspend<!> fun starProjection(x: Continuation<*>) {
|
||||
|
||||
}
|
||||
|
||||
<!INAPPLICABLE_MODIFIER!>suspend<!> fun varargs(vararg x: Continuation<Any>) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -10,9 +10,10 @@ public suspend fun kotlin.String.wrongExtension(/*0*/ x: kotlin.coroutines.Conti
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public final inline suspend fun inlineFun(/*0*/ x: kotlin.coroutines.Continuation<kotlin.Int>): kotlin.Unit
|
||||
public final suspend fun noParams(): kotlin.Unit
|
||||
public final suspend fun starProjection(/*0*/ vararg x: kotlin.coroutines.Continuation<kotlin.Any> /*kotlin.Array<out kotlin.coroutines.Continuation<kotlin.Any>>*/): kotlin.Unit
|
||||
public final suspend fun starProjection(/*0*/ x: kotlin.coroutines.Continuation<*>): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
public final suspend fun valid(/*0*/ x: kotlin.coroutines.Continuation<kotlin.Int>): kotlin.Unit
|
||||
public final suspend fun varargs(/*0*/ vararg x: kotlin.coroutines.Continuation<kotlin.Any> /*kotlin.Array<out kotlin.coroutines.Continuation<kotlin.Any>>*/): kotlin.Unit
|
||||
public final suspend fun wrongParam(/*0*/ x: kotlin.collections.Collection<kotlin.Int>): kotlin.Unit
|
||||
public final suspend fun kotlin.String.memberExtension(/*0*/ x: kotlin.coroutines.Continuation<kotlin.Int>): kotlin.Unit
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user