Reports forEach loops with missing cancellation checks.

Runs only within the methods with com.intellij.util.concurrency.annotations.RequiresReadLock annotation.

Example:


    for (item in items) {
        ProgressManager.checkCanceled() // should be present in the first line
        ...
    }

In case of nested loops with nothing in between:


    for (item in items) {
        // nothing in between
        for (inner in item.inners) {
            ProgressManager.checkCanceled() // should be present in the first line of the inner loop only
             ...
        }
    }

In blocking context com.intellij.openapi.progress.ProgressManager#checkCanceled should be used, while com.intellij.openapi.progress.CoroutinesKt#checkCancelled should be used in suspending one.

See Background Processes and ProcessCanceledException in IntelliJ Platform Plugin SDK docs for more details.

New in 2023.1