From 04b18c8a36165ecea57f215a8b1d567a61a45f43 Mon Sep 17 00:00:00 2001 From: Elena Lyulina Date: Mon, 29 May 2023 19:42:09 +0200 Subject: [PATCH] IDEA-309523 add more test, fix inspection message, fix hierarchical annotation check GitOrigin-RevId: 5bf28e687272eb39f9207989f9ef04a26acb2f27 --- .../messages/DevKitBundle.properties | 2 +- .../CancellationCheckInLoopsInspection.kt | 4 +- ...ancellationCheckPresentNotInFirstLine.java | 37 ++++++++++++++++++ .../DoWhileLoops.java | 12 +++--- .../ForEachLoops.java | 12 +++--- .../cancellationCheckInLoops/ForLoops.java | 12 +++--- .../cancellationCheckInLoops/NestedLoops.java | 4 +- .../RunCondition.java | 2 +- .../RunConditionOnSuperMethod.java | 25 ++++++++++++ .../cancellationCheckInLoops/WhileLoops.java | 12 +++--- .../BlockDoWhileLoop.java | 2 +- .../BlockForEachLoop.java | 2 +- .../BlockForLoop.java | 2 +- .../BlockWhileLoop.java | 2 +- .../EmptyDoWhileLoop.java | 2 +- .../EmptyForEachLoop.java | 2 +- .../EmptyForLoop.java | 2 +- .../EmptyWhileLoop.java | 2 +- .../NoBodyForEachLoop.java | 2 +- .../NoBodyForLoop.java | 2 +- .../NoBodyWhileLoop.java | 2 +- .../SingleLineDoWhileLoop.java | 2 +- .../SingleLineForEachLoop.java | 2 +- .../SingleLineForLoop.java | 2 +- .../SingleLineWhileLoop.java | 2 +- .../CancellationCheckInLoopsInspectionTest.kt | 8 ++++ .../CancellationCheckPresentNotInFirstLine.kt | 38 +++++++++++++++++++ .../cancellationCheckInLoops/DoWhileLoops.kt | 12 +++--- .../cancellationCheckInLoops/ForEachLoops.kt | 12 +++--- .../cancellationCheckInLoops/NestedLoops.kt | 4 +- .../PresentCancellationCheck.kt | 4 +- .../cancellationCheckInLoops/RunCondition.kt | 20 ++++++++++ .../RunConditionOnSuperMethod.kt | 23 +++++++++++ .../SuspendingContext.kt | 4 +- .../cancellationCheckInLoops/WhileLoops.kt | 12 +++--- .../BlockDoWhileLoop.kt | 2 +- .../BlockForEachLoop.kt | 2 +- .../BlockWhileLoop.kt | 2 +- .../EmptyDoWhileLoop.kt | 2 +- .../EmptyForEachLoop.kt | 2 +- .../EmptyWhileLoop.kt | 2 +- .../NoBodyForEachLoop.kt | 2 +- .../NoBodyWhileLoop.kt | 2 +- .../SingleLineDoWhileLoop.kt | 2 +- .../SingleLineForEachLoop.kt | 2 +- .../SingleLineWhileLoop.kt | 2 +- .../SuspendingDoWhileLoop.kt | 2 +- .../SuspendingForEachLoop.kt | 2 +- .../SuspendingWhileLoop.kt | 2 +- ...tCancellationCheckInLoopsInspectionTest.kt | 12 ++++++ 50 files changed, 246 insertions(+), 83 deletions(-) create mode 100644 plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/CancellationCheckPresentNotInFirstLine.java create mode 100644 plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/RunConditionOnSuperMethod.java create mode 100644 plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/CancellationCheckPresentNotInFirstLine.kt create mode 100644 plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/RunCondition.kt create mode 100644 plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/RunConditionOnSuperMethod.kt diff --git a/plugins/devkit/devkit-core/resources/messages/DevKitBundle.properties b/plugins/devkit/devkit-core/resources/messages/DevKitBundle.properties index 7c488f67e2e5..f0564bd5c300 100644 --- a/plugins/devkit/devkit-core/resources/messages/DevKitBundle.properties +++ b/plugins/devkit/devkit-core/resources/messages/DevKitBundle.properties @@ -654,7 +654,7 @@ inspection.extension.registered.as.service.message=A class must not be registere inspection.extension.registered.as.component.message=A class must not be registered as both an extension and a component inspection.cancellation.check.in.loops.display.name=Cancellation check in loops -inspection.cancellation.check.in.loops.message=Cancellation check ''{0}'' should be placed in the first line +inspection.cancellation.check.in.loops.message=Cancellation check ''{0}'' should be the first statement in a loop body inspection.insert.cancellation.check.fix.message=Insert cancellation check inspections.application.service.as.static.final.field.display.name=Application service assigned to a static final field/property diff --git a/plugins/devkit/devkit-core/src/inspections/CancellationCheckInLoopsInspection.kt b/plugins/devkit/devkit-core/src/inspections/CancellationCheckInLoopsInspection.kt index e8f9f50fa32e..07afcef28fc3 100644 --- a/plugins/devkit/devkit-core/src/inspections/CancellationCheckInLoopsInspection.kt +++ b/plugins/devkit/devkit-core/src/inspections/CancellationCheckInLoopsInspection.kt @@ -1,6 +1,7 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.idea.devkit.inspections +import com.intellij.codeInsight.AnnotationUtil import com.intellij.codeInspection.ProblemsHolder import com.intellij.psi.PsiElementVisitor import com.intellij.uast.UastHintedVisitorAdapter @@ -77,8 +78,7 @@ class CancellationCheckInLoopsInspection : DevKitUastInspectionBase() { */ private fun shouldBeRunOn(uElement: UElement): Boolean { val containingMethod = uElement.getParentOfType() ?: return false - val superMethods = containingMethod.javaPsi.findSuperMethods() - return superMethods.plus(containingMethod).any { it.hasAnnotation(RequiresReadLock::class.java.canonicalName) } + return AnnotationUtil.isAnnotated(containingMethod.javaPsi, RequiresReadLock::class.java.canonicalName, AnnotationUtil.CHECK_HIERARCHY) } private val ULoopExpression.bodyExpressions: List diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/CancellationCheckPresentNotInFirstLine.java b/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/CancellationCheckPresentNotInFirstLine.java new file mode 100644 index 000000000000..7bdfe661ea20 --- /dev/null +++ b/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/CancellationCheckPresentNotInFirstLine.java @@ -0,0 +1,37 @@ +package inspections.cancellationCheckInLoops; + +import com.intellij.util.concurrency.annotations.RequiresReadLock; +import com.intellij.openapi.progress.ProgressManager; + +import static inspections.cancellationCheckInLoops.Foo.doSomething; + + +class Clazz { + + @RequiresReadLock + public static void foo() { + String[] items = {""}; + for (String item : items) { + doSomething(); + ProgressManager.checkCanceled(); + } + + for (int i = 0; i < 5; i++) { + doSomething(); + ProgressManager.checkCanceled(); + } + + int i = 0; + while (i < 5) { + doSomething(); + ProgressManager.checkCanceled(); + i++; + } + + do { + doSomething(); + i++; + ProgressManager.checkCanceled(); + } while (i < 10); + } +} \ No newline at end of file diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/DoWhileLoops.java b/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/DoWhileLoops.java index 2fb21612ba3e..d38a08e44fdd 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/DoWhileLoops.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/DoWhileLoops.java @@ -13,9 +13,9 @@ class Clazz { int j = 0; do { // nested loops with something in between - do { + do { doSomething(); - do { + do { doSomething(); i++; } while (i < 10); @@ -23,20 +23,20 @@ class Clazz { } while (i < 5); // nested loops with a block in between - do { + do { if (i != 3) { //empty loop - do { + do { } while (j > 5); } i++; } while (i < 15); // single-line loop - do System.out.println(i); while (i < 20); + do System.out.println(i); while (i < 20); // no body loop - do; while(i < 0); + do; while(i < 0); i++; } while (i < 100); diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/ForEachLoops.java b/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/ForEachLoops.java index 4090132d1ab7..944aae43c1cb 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/ForEachLoops.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/ForEachLoops.java @@ -14,27 +14,27 @@ class Clazz { for (String item : items) { // nested loops with something in between - for (String item2 : items) { + for (String item2 : items) { doSomething(); - for (String item3 : items) { + for (String item3 : items) { doSomething(); } } // nested loops with a block in between - for (String item4 : items) { + for (String item4 : items) { if (item != "") { //empty loop - for (String item5 : items) { + for (String item5 : items) { } } } // single-line loop - for (String item6: items) System.out.println(item); + for (String item6: items) System.out.println(item); // no body loop - for(String item5 : items); + for(String item5 : items); } } } \ No newline at end of file diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/ForLoops.java b/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/ForLoops.java index 1de9537c1b93..ac557c2d470d 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/ForLoops.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/ForLoops.java @@ -12,27 +12,27 @@ class Clazz { for (int i = 0; i < 5; i++) { // nested loops with something in between - for (int j = 0; j < 5; j++) { + for (int j = 0; j < 5; j++) { doSomething(); - for (int k = 0; k < 5; k++) { + for (int k = 0; k < 5; k++) { doSomething(); } } // nested loops with a block in between - for (int j = 0; j < 5; j++) { + for (int j = 0; j < 5; j++) { if (j != 3) { //empty loop - for (int k = 0; k < 5; k++) { + for (int k = 0; k < 5; k++) { } } } // single-line loop - for (int j = 0; j < 5; j++) System.out.println(j); + for (int j = 0; j < 5; j++) System.out.println(j); // no body loop - for (int y = 0; y < 10; y++); + for (int y = 0; y < 10; y++); } } } \ No newline at end of file diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/NestedLoops.java b/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/NestedLoops.java index 6ce130fe78ea..e52369dc9550 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/NestedLoops.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/NestedLoops.java @@ -15,7 +15,7 @@ class Clazz { while (j < 100) { for (int i = 0; i < 5; i++) { for (String item : items) { - do { + do { doSomething(); j++; } while (j < 5); @@ -25,7 +25,7 @@ class Clazz { } // single line nested loops - for (int i = 0; i < 5; i++) for (String item : items) { + for (int i = 0; i < 5; i++) for (String item : items) { doSomething(); } } diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/RunCondition.java b/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/RunCondition.java index 59ad675c87ca..302bc358e18a 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/RunCondition.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/RunCondition.java @@ -15,7 +15,7 @@ class Bar { @RequiresReadLock public void barReadLock() { String[] items = {""}; - for (String item : items) { + for (String item : items) { doSomething(); } } diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/RunConditionOnSuperMethod.java b/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/RunConditionOnSuperMethod.java new file mode 100644 index 000000000000..1a90903748fa --- /dev/null +++ b/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/RunConditionOnSuperMethod.java @@ -0,0 +1,25 @@ +package inspections.cancellationCheckInLoops; + +import com.intellij.util.concurrency.annotations.RequiresReadLock; + +import static inspections.cancellationCheckInLoops.Foo.doSomething; + +abstract class Bar { + + @RequiresReadLock + public abstract void bar(); + +} + + +class BarImpl extends Bar { + + @Override + public void bar() { + String[] items = {""}; + for (String item : items) { + doSomething(); + } + } + +} \ No newline at end of file diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/WhileLoops.java b/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/WhileLoops.java index de8038d0f264..bf70721c61e1 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/WhileLoops.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/cancellationCheckInLoops/WhileLoops.java @@ -13,9 +13,9 @@ class Clazz { int j = 0; while (i < 100) { // nested loops with something in between - while (i < 5) { + while (i < 5) { doSomething(); - while (i < 10) { + while (i < 10) { doSomething(); i++; } @@ -23,20 +23,20 @@ class Clazz { } // nested loops with a block in between - while (i < 15) { + while (i < 15) { if (i != 3) { //empty loop - while (j > 5) { + while (j > 5) { } } i++; } // single-line loop - while (i < 20) System.out.println(i); + while (i < 20) System.out.println(i); // no body loop - while(i < 0); + while(i < 0); i++; } diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/BlockDoWhileLoop.java b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/BlockDoWhileLoop.java index 7b29c71c7353..73abc68a75d4 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/BlockDoWhileLoop.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/BlockDoWhileLoop.java @@ -10,7 +10,7 @@ class Clazz { @RequiresReadLock public static void foo() { int i = 0; - do { + do { doSomething(); i++; } diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/BlockForEachLoop.java b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/BlockForEachLoop.java index b4e4b5f25e28..8f10c4c9218b 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/BlockForEachLoop.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/BlockForEachLoop.java @@ -11,7 +11,7 @@ class Clazz { public static void foo() { String[] items = {""}; - for (String item : items) { + for (String item : items) { doSomething(); } } diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/BlockForLoop.java b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/BlockForLoop.java index f76a15411355..a920f6dee39b 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/BlockForLoop.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/BlockForLoop.java @@ -9,7 +9,7 @@ class Clazz { @RequiresReadLock public static void foo() { - for (int i = 0; i < 5; i++) { + for (int i = 0; i < 5; i++) { doSomething(); } } diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/BlockWhileLoop.java b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/BlockWhileLoop.java index 1ef27ba2053e..4b9a896899f8 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/BlockWhileLoop.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/BlockWhileLoop.java @@ -10,7 +10,7 @@ class Clazz { @RequiresReadLock public static void foo() { int i = 0; - while (i < 5) { + while (i < 5) { doSomething(); i++; } diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/EmptyDoWhileLoop.java b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/EmptyDoWhileLoop.java index 90c0ffa3f06c..92806b1348ee 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/EmptyDoWhileLoop.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/EmptyDoWhileLoop.java @@ -8,7 +8,7 @@ class Clazz { @RequiresReadLock public static void foo() { int i = 0; - do { + do { // check comments } while (i < 100); diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/EmptyForEachLoop.java b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/EmptyForEachLoop.java index 821df6fa4839..5042ca6ce8e1 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/EmptyForEachLoop.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/EmptyForEachLoop.java @@ -9,7 +9,7 @@ class Clazz { public static void foo() { String[] items = {""}; - for (String item : items) { + for (String item : items) { // check comments } } diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/EmptyForLoop.java b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/EmptyForLoop.java index 455cccb71e33..d9aeaa743a7f 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/EmptyForLoop.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/EmptyForLoop.java @@ -7,7 +7,7 @@ class Clazz { @RequiresReadLock public static void foo() { - for (int i = 0; i < 5; i++) { + for (int i = 0; i < 5; i++) { // check comments } } diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/EmptyWhileLoop.java b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/EmptyWhileLoop.java index 55cfc003e740..6ad84ae190ad 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/EmptyWhileLoop.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/EmptyWhileLoop.java @@ -10,7 +10,7 @@ class Clazz { @RequiresReadLock public static void foo() { int i = 0; - while (i < 5) { + while (i < 5) { // check comments } } diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/NoBodyForEachLoop.java b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/NoBodyForEachLoop.java index d701a9fe7405..0593d0f9d64e 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/NoBodyForEachLoop.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/NoBodyForEachLoop.java @@ -11,6 +11,6 @@ class Clazz { public static void foo() { String[] items = {""}; - for (String item : items); + for (String item : items); } } \ No newline at end of file diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/NoBodyForLoop.java b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/NoBodyForLoop.java index 07c7da1ffcd5..2b222ed97a3a 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/NoBodyForLoop.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/NoBodyForLoop.java @@ -9,6 +9,6 @@ class Clazz { @RequiresReadLock public static void foo() { - for (int i = 0; i < 5; i++); + for (int i = 0; i < 5; i++); } } \ No newline at end of file diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/NoBodyWhileLoop.java b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/NoBodyWhileLoop.java index 9c2e30861692..e191cf8893f8 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/NoBodyWhileLoop.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/NoBodyWhileLoop.java @@ -10,6 +10,6 @@ class Clazz { @RequiresReadLock public static void foo() { int i = 0; - while (i < 5); + while (i < 5); } } \ No newline at end of file diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/SingleLineDoWhileLoop.java b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/SingleLineDoWhileLoop.java index 76e17ebab520..de5376bd5a2f 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/SingleLineDoWhileLoop.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/SingleLineDoWhileLoop.java @@ -10,7 +10,7 @@ class Clazz { @RequiresReadLock public static void foo() { int i = 0; - do i++; + do i++; while (i < 100); } } \ No newline at end of file diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/SingleLineForEachLoop.java b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/SingleLineForEachLoop.java index c61d209378f5..6b69791c7d2d 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/SingleLineForEachLoop.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/SingleLineForEachLoop.java @@ -11,6 +11,6 @@ class Clazz { public static void foo() { String[] items = {""}; - for (String item : items) doSomething(); + for (String item : items) doSomething(); } } \ No newline at end of file diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/SingleLineForLoop.java b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/SingleLineForLoop.java index 621af3ecfcc5..cd76bf7404a8 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/SingleLineForLoop.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/SingleLineForLoop.java @@ -9,6 +9,6 @@ class Clazz { @RequiresReadLock public static void foo() { - for (int i = 0; i < 5; i++) doSomething(); + for (int i = 0; i < 5; i++) doSomething(); } } \ No newline at end of file diff --git a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/SingleLineWhileLoop.java b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/SingleLineWhileLoop.java index b6d87cbdeaa6..661c73470d9c 100644 --- a/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/SingleLineWhileLoop.java +++ b/plugins/devkit/devkit-java-tests/testData/inspections/insertCancellationCheckFix/SingleLineWhileLoop.java @@ -10,6 +10,6 @@ class Clazz { @RequiresReadLock public static void foo() { int i = 0; - while (i < 5) i++; + while (i < 5) i++; } } \ No newline at end of file diff --git a/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/inspections/CancellationCheckInLoopsInspectionTest.kt b/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/inspections/CancellationCheckInLoopsInspectionTest.kt index f4585c129299..7290942e4fb8 100644 --- a/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/inspections/CancellationCheckInLoopsInspectionTest.kt +++ b/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/inspections/CancellationCheckInLoopsInspectionTest.kt @@ -15,10 +15,18 @@ class CancellationCheckInLoopsInspectionTest : CancellationCheckInLoopsInspectio doTest() } + fun testRunConditionOnSuperMethod() { + doTest() + } + fun testPresentCancellationCheck() { doTest() } + fun testCancellationCheckPresentNotInFirstLine() { + doTest() + } + fun testForEachLoops() { doTest() } diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/CancellationCheckPresentNotInFirstLine.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/CancellationCheckPresentNotInFirstLine.kt new file mode 100644 index 000000000000..e2f9686fcbeb --- /dev/null +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/CancellationCheckPresentNotInFirstLine.kt @@ -0,0 +1,38 @@ +package inspections.cancellationCheckInLoops + +import com.intellij.openapi.progress.ProgressManager +import com.intellij.openapi.progress.checkCancelled +import com.intellij.util.concurrency.annotations.RequiresReadLock + +import inspections.cancellationCheckInLoops.Foo.doSomething + + + +@RequiresReadLock +fun main() { + for (i in 1..10) { + doSomething() + ProgressManager.checkCanceled() + } + + var i = 0; + while (i < 5) { + doSomething() + i++ + ProgressManager.checkCanceled() + } + + do { + doSomething() + ProgressManager.checkCanceled() + i++ + } while (i < 10) +} + +@RequiresReadLock +suspend fun foo() { + for (i in 1..10) { + doSomething() + checkCancelled() + } +} \ No newline at end of file diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/DoWhileLoops.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/DoWhileLoops.kt index 81727a06236c..c2130e9bcb0c 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/DoWhileLoops.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/DoWhileLoops.kt @@ -10,9 +10,9 @@ fun main() { var i = 0 do { // nested loops with something in between - do { + do { doSomething() - do { + do { doSomething() i++ } while (i < 20) @@ -20,22 +20,22 @@ fun main() { } while (i < 10) // sibling loop - do { + do { doSomething() i++ } while (i < 30) // nested loops with a block in between - do { + do { if (i < 5) { // empty loop - do { + do { } while (i < 3) } } while (i < 40) // single-line loop - do doSomething() while (i < 50) + do doSomething() while (i < 50) i++ } while (i < 100) } \ No newline at end of file diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/ForEachLoops.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/ForEachLoops.kt index 0d0b8142ea76..5b3af4381f4e 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/ForEachLoops.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/ForEachLoops.kt @@ -9,28 +9,28 @@ import inspections.cancellationCheckInLoops.Foo.doSomething fun main() { for (i in 1..10) { // nested loops with something in between - for (j in 1..10) { + for (j in 1..10) { doSomething() - for (k in 1..10) { + for (k in 1..10) { doSomething() } } // sibling loop - for (j in 1..10) { + for (j in 1..10) { doSomething() } // nested loops with a block in between - for (j in 1..10) { + for (j in 1..10) { if (i < 5) { // empty loop - for (k in 1..10) { + for (k in 1..10) { } } } // single-line loop - for (j in 1..10) doSomething() + for (j in 1..10) doSomething() } } \ No newline at end of file diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/NestedLoops.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/NestedLoops.kt index 4274c92b21b3..8704402edca0 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/NestedLoops.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/NestedLoops.kt @@ -11,7 +11,7 @@ fun main() { // nested loops of different kinds for (i in 1..10) { while (j < 5) { - do { + do { doSomething() j++ } while (j < 3) @@ -20,7 +20,7 @@ fun main() { } // single line nested loops - for (i in 1..10) while (j < 5) { + for (i in 1..10) while (j < 5) { doSomething() j++ } diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/PresentCancellationCheck.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/PresentCancellationCheck.kt index 2350e27d1a9c..1e48a9eb2476 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/PresentCancellationCheck.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/PresentCancellationCheck.kt @@ -25,13 +25,13 @@ fun main() { @RequiresReadLock suspend fun foo() { - // right cancellaiton check + // right cancellation check for (i in 1..10) { checkCancelled() } // wrong cancellation check - for (i in 1..10) { + for (i in 1..10) { ProgressManager.checkCanceled() } } \ No newline at end of file diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/RunCondition.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/RunCondition.kt new file mode 100644 index 000000000000..3abbf0d7b7b8 --- /dev/null +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/RunCondition.kt @@ -0,0 +1,20 @@ +package inspections.cancellationCheckInLoops + +import com.intellij.util.concurrency.annotations.RequiresReadLock + +import inspections.cancellationCheckInLoops.Foo.doSomething + + +fun foo() { + for (i in 1..10) { + doSomething() + } +} + + +@RequiresReadLock +fun bar() { + for (i in 1..10) { + doSomething() + } +} \ No newline at end of file diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/RunConditionOnSuperMethod.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/RunConditionOnSuperMethod.kt new file mode 100644 index 000000000000..3d45ec8fcbd5 --- /dev/null +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/RunConditionOnSuperMethod.kt @@ -0,0 +1,23 @@ +package inspections.cancellationCheckInLoops + +import com.intellij.util.concurrency.annotations.RequiresReadLock + +import inspections.cancellationCheckInLoops.Foo.doSomething + + +abstract class Bar { + + @RequiresReadLock + abstract fun bar() + +} + +class BarImpl : Bar() { + + override fun bar() { + for (i in 1..10) { + doSomething() + } + } + +} \ No newline at end of file diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/SuspendingContext.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/SuspendingContext.kt index 7d9d08139b92..a8b4bf71a972 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/SuspendingContext.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/SuspendingContext.kt @@ -9,7 +9,7 @@ fun withSuspendLambda(l: suspend () -> Any) { } @RequiresReadLock suspend fun mySuspendFun() { - for (i in 1..10) { + for (i in 1..10) { doSomething() } } @@ -17,7 +17,7 @@ suspend fun mySuspendFun() { @RequiresReadLock fun main() { withSuspendLambda { - for (i in 1..10) { + for (i in 1..10) { doSomething() } } diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/WhileLoops.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/WhileLoops.kt index 3fbc9d53ebc5..1f0a05b2e6f6 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/WhileLoops.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/cancellationCheckInLoops/WhileLoops.kt @@ -10,9 +10,9 @@ fun main() { var i = 0 while (i < 100) { // nested loops with something in between - while (i < 10) { + while (i < 10) { doSomething() - while (i < 20) { + while (i < 20) { doSomething() i++ } @@ -20,22 +20,22 @@ fun main() { } // sibling loop - while (i < 30) { + while (i < 30) { doSomething() i++ } // nested loops with a block in between - while (i < 40) { + while (i < 40) { if (i < 5) { // empty loop - while (i < 3) { + while (i < 3) { } } } // single-line loop - while (i < 50) doSomething() + while (i < 50) doSomething() i++ } } \ No newline at end of file diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/BlockDoWhileLoop.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/BlockDoWhileLoop.kt index b5fb32f6e66e..aed1061af36c 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/BlockDoWhileLoop.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/BlockDoWhileLoop.kt @@ -8,7 +8,7 @@ import inspections.cancellationCheckInLoops.Foo.doSomething @RequiresReadLock fun main() { var i = 0 - do { + do { // comments doSomething() i++ diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/BlockForEachLoop.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/BlockForEachLoop.kt index e6db3746b536..958824c5bf1a 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/BlockForEachLoop.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/BlockForEachLoop.kt @@ -7,7 +7,7 @@ import inspections.cancellationCheckInLoops.Foo.doSomething @RequiresReadLock fun main() { - for (i in 1..10) { + for (i in 1..10) { // comments doSomething() } diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/BlockWhileLoop.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/BlockWhileLoop.kt index eefdf6d87f83..62c7f13d9682 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/BlockWhileLoop.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/BlockWhileLoop.kt @@ -8,7 +8,7 @@ import inspections.cancellationCheckInLoops.Foo.doSomething @RequiresReadLock fun main() { var i = 0 - while (i < 10) { + while (i < 10) { // comments doSomething() i++ diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/EmptyDoWhileLoop.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/EmptyDoWhileLoop.kt index df4863384a31..775ace69adb2 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/EmptyDoWhileLoop.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/EmptyDoWhileLoop.kt @@ -6,7 +6,7 @@ import com.intellij.util.concurrency.annotations.RequiresReadLock @RequiresReadLock fun main() { var i = 0 - do { + do { // comments } while (i < 10) } \ No newline at end of file diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/EmptyForEachLoop.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/EmptyForEachLoop.kt index 09ddba08ceec..8dc2dd72d9e2 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/EmptyForEachLoop.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/EmptyForEachLoop.kt @@ -5,7 +5,7 @@ import com.intellij.util.concurrency.annotations.RequiresReadLock @RequiresReadLock fun main() { - for (i in 1..10) { + for (i in 1..10) { // comments } } \ No newline at end of file diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/EmptyWhileLoop.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/EmptyWhileLoop.kt index e513c3cd081e..4cc2f2eae287 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/EmptyWhileLoop.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/EmptyWhileLoop.kt @@ -6,7 +6,7 @@ import com.intellij.util.concurrency.annotations.RequiresReadLock @RequiresReadLock fun main() { var i = 0 - while (i < 10) { + while (i < 10) { // comments } } \ No newline at end of file diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/NoBodyForEachLoop.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/NoBodyForEachLoop.kt index 1dda17ad99e8..f8f35d8a7097 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/NoBodyForEachLoop.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/NoBodyForEachLoop.kt @@ -5,5 +5,5 @@ import com.intellij.util.concurrency.annotations.RequiresReadLock @RequiresReadLock fun main() { - for (i in 1..10); // comments + for (i in 1..10); // comments } \ No newline at end of file diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/NoBodyWhileLoop.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/NoBodyWhileLoop.kt index 534132c4bf99..26bc7f010e6f 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/NoBodyWhileLoop.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/NoBodyWhileLoop.kt @@ -6,5 +6,5 @@ import com.intellij.util.concurrency.annotations.RequiresReadLock @RequiresReadLock fun main() { var i = 0 - while (i < 10); + while (i < 10); } \ No newline at end of file diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SingleLineDoWhileLoop.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SingleLineDoWhileLoop.kt index 254abd7c2f55..32b05c0d88b7 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SingleLineDoWhileLoop.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SingleLineDoWhileLoop.kt @@ -6,5 +6,5 @@ import com.intellij.util.concurrency.annotations.RequiresReadLock @RequiresReadLock fun main() { var i = 0 - do i++ while (i < 10) // comments + do i++ while (i < 10) // comments } \ No newline at end of file diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SingleLineForEachLoop.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SingleLineForEachLoop.kt index fca8ce663bad..079f5077262e 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SingleLineForEachLoop.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SingleLineForEachLoop.kt @@ -7,5 +7,5 @@ import inspections.cancellationCheckInLoops.Foo.doSomething @RequiresReadLock fun main() { - for (i in 1..10) doSomething() // comments + for (i in 1..10) doSomething() // comments } \ No newline at end of file diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SingleLineWhileLoop.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SingleLineWhileLoop.kt index c92c09ee688c..495f99e03515 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SingleLineWhileLoop.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SingleLineWhileLoop.kt @@ -5,5 +5,5 @@ import com.intellij.util.concurrency.annotations.RequiresReadLock @RequiresReadLock fun main() { var i = 0 - while (i < 10) i++ // comments + while (i < 10) i++ // comments } \ No newline at end of file diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SuspendingDoWhileLoop.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SuspendingDoWhileLoop.kt index 6080317b8e26..47a202882c6a 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SuspendingDoWhileLoop.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SuspendingDoWhileLoop.kt @@ -8,7 +8,7 @@ import inspections.cancellationCheckInLoops.Foo.doSomething @RequiresReadLock suspend fun main() { var i = 0 - do { + do { // comments doSomething() i++ diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SuspendingForEachLoop.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SuspendingForEachLoop.kt index d95811cfbe7b..974cf8850f5f 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SuspendingForEachLoop.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SuspendingForEachLoop.kt @@ -7,7 +7,7 @@ import inspections.cancellationCheckInLoops.Foo.doSomething @RequiresReadLock suspend fun main() { - for (i in 1..10) { + for (i in 1..10) { // comments doSomething() } diff --git a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SuspendingWhileLoop.kt b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SuspendingWhileLoop.kt index e653e5f1ec19..a6fc9416075d 100644 --- a/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SuspendingWhileLoop.kt +++ b/plugins/devkit/devkit-kotlin-tests/testData/inspections/insertCancellationCheckFix/SuspendingWhileLoop.kt @@ -8,7 +8,7 @@ import inspections.cancellationCheckInLoops.Foo.doSomething @RequiresReadLock suspend fun main() { var i = 0 - while (i < 10) { + while (i < 10) { // comments doSomething() i++ diff --git a/plugins/devkit/devkit-kotlin-tests/testSrc/org/jetbrains/idea/devkit/kotlin/inspections/KtCancellationCheckInLoopsInspectionTest.kt b/plugins/devkit/devkit-kotlin-tests/testSrc/org/jetbrains/idea/devkit/kotlin/inspections/KtCancellationCheckInLoopsInspectionTest.kt index 319aa987c5bd..9bc450bdc27a 100644 --- a/plugins/devkit/devkit-kotlin-tests/testSrc/org/jetbrains/idea/devkit/kotlin/inspections/KtCancellationCheckInLoopsInspectionTest.kt +++ b/plugins/devkit/devkit-kotlin-tests/testSrc/org/jetbrains/idea/devkit/kotlin/inspections/KtCancellationCheckInLoopsInspectionTest.kt @@ -25,6 +25,14 @@ class KtCancellationCheckInLoopsInspectionTest : CancellationCheckInLoopsInspect """.trimIndent()) } + fun testRunCondition() { + doTest() + } + + fun testRunConditionOnSuperMethod() { + doTest() + } + fun testSuspendingContext() { doTest() } @@ -33,6 +41,10 @@ class KtCancellationCheckInLoopsInspectionTest : CancellationCheckInLoopsInspect doTest() } + fun testCancellationCheckPresentNotInFirstLine() { + doTest() + } + fun testForEachLoops() { doTest() }