From fc93e7a727252bcdba953bee38848d40b3147aba Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 21 Dec 2017 18:00:42 +0300 Subject: [PATCH] Do not report "redundant suspend" on override / open #KT-21938 Fixed --- .../RedundantSuspendModifierInspection.kt | 6 ++++++ .../redundantSuspendModifier/operators.kt | 21 +++++++++++++++++++ .../redundantSuspend/override.kt | 10 +++++++++ .../LocalInspectionTestGenerated.java | 6 ++++++ 4 files changed, 43 insertions(+) create mode 100644 idea/testData/inspectionsLocal/redundantSuspend/override.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSuspendModifierInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSuspendModifierInspection.kt index 0fb756799b5..53835dd5a20 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSuspendModifierInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSuspendModifierInspection.kt @@ -22,7 +22,9 @@ import com.intellij.codeInspection.ProblemHighlightType import com.intellij.codeInspection.ProblemsHolder import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully +import org.jetbrains.kotlin.idea.core.getModalityFromDescriptor import org.jetbrains.kotlin.idea.highlighter.hasSuspendCalls import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.quickfix.RemoveModifierFix @@ -31,6 +33,7 @@ import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtVisitorVoid import org.jetbrains.kotlin.psi.psiUtil.anyDescendantOfType +import org.jetbrains.kotlin.resolve.BindingContext class RedundantSuspendModifierInspection : AbstractKotlinInspection() { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { @@ -41,8 +44,11 @@ class RedundantSuspendModifierInspection : AbstractKotlinInspection() { val suspendModifier = function.modifierList?.getModifier(KtTokens.SUSPEND_KEYWORD) ?: return if (!function.hasBody()) return + if (function.hasModifier(KtTokens.OVERRIDE_KEYWORD)) return val context = function.analyzeFully() + val descriptor = context[BindingContext.FUNCTION, function] ?: return + if (descriptor.modality == Modality.OPEN) return if (function.anyDescendantOfType { it.hasSuspendCalls(context) }) { return diff --git a/idea/testData/inspections/redundantSuspendModifier/operators.kt b/idea/testData/inspections/redundantSuspendModifier/operators.kt index 405f1f3ea73..053b6f46563 100644 --- a/idea/testData/inspections/redundantSuspendModifier/operators.kt +++ b/idea/testData/inspections/redundantSuspendModifier/operators.kt @@ -40,4 +40,25 @@ class C(val x: Int, val y: Int) { // Not redundant suspend fun foo(c1: C, c2: C): Int { return c1() + c2() +} + +interface C { + // Not redundant + suspend fun foo() +} + +class D : C { + // Not redundant + override suspend fun foo() { + + } +} + +open class E { + // Not redundant + open suspend fun bar() { + + } + // Not redundant + abstract suspend fun baz() } \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/redundantSuspend/override.kt b/idea/testData/inspectionsLocal/redundantSuspend/override.kt new file mode 100644 index 00000000000..ca18b77fcce --- /dev/null +++ b/idea/testData/inspectionsLocal/redundantSuspend/override.kt @@ -0,0 +1,10 @@ +// PROBLEM: none + +interface I { + suspend fun f() +} + +class C : I { + override suspend fun f() { + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index 90b424c59f3..413747d134c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -2885,6 +2885,12 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { doTest(fileName); } + @TestMetadata("override.kt") + public void testOverride() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/redundantSuspend/override.kt"); + doTest(fileName); + } + @TestMetadata("setterDelegate.kt") public void testSetterDelegate() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/redundantSuspend/setterDelegate.kt");