BlockingMethodInNonBlockingContextInspection: resolve mode switched to partial & coroutine "released" status check

This commit is contained in:
Nikita Katkov
2018-10-19 14:02:45 +03:00
committed by Mikhail Glukhikh
parent 90529dfda4
commit d66619b1c2
@@ -13,10 +13,8 @@ import org.jetbrains.kotlin.builtins.getReceiverTypeFromFunctionType
import org.jetbrains.kotlin.builtins.isBuiltinFunctionalType
import org.jetbrains.kotlin.builtins.isSuspendFunctionType
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall
import org.jetbrains.kotlin.idea.project.getLanguageVersionSettings
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.*
@@ -32,8 +30,7 @@ class CoroutineNonBlockingContextChecker : NonBlockingContextChecker {
override fun isApplicable(file: PsiFile): Boolean {
val languageVersionSettings = file.project.getLanguageVersionSettings()
return languageVersionSettings.supportsFeature(LanguageFeature.Coroutines) &&
languageVersionSettings.languageVersion >= LanguageVersion.KOTLIN_1_3
return languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines)
}
override fun isContextNonBlockingFor(element: PsiElement): Boolean {
@@ -45,7 +42,7 @@ class CoroutineNonBlockingContextChecker : NonBlockingContextChecker {
val containingArgument = PsiTreeUtil.getParentOfType(containingLambda, KtValueArgument::class.java)
if (containingArgument != null) {
val callExpression = PsiTreeUtil.getParentOfType(containingArgument, KtCallExpression::class.java) ?: return false
val call = callExpression.resolveToCall(BodyResolveMode.FULL) ?: return false
val call = callExpression.resolveToCall(BodyResolveMode.PARTIAL) ?: return false
val hasBlockingAnnotation = call.getFirstArgument()?.resolveToCall()
?.resultingDescriptor?.annotations?.hasAnnotation(FqName(BLOCKING_CONTEXT_ANNOTATION))