Reports loops, forEach-like methods, and ContainerUtil.process() with missing cancellation checks.

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

Example:


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

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

In the case of nested loops with nothing in between:


@RequiresReadLock
fun doSomething() {
  ...
  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