@ApiStatus.Internal
  @ApiStatus.Experimental
  @Override
  public <T, E extends Throwable> T ignoreDumbMode(@NotNull DumbModeAccessType dumbModeAccessType,
                                                   @NotNull ThrowableComputable<T, E> computable) throws E {
    Application app = ApplicationManager.getApplication();
    Stack<DumbModeAccessType> dumbModeAccessTypeStack = ourDumbModeAccessTypeStack.get();
    boolean preventCaching = dumbModeAccessTypeStack.empty();
    dumbModeAccessTypeStack.push(dumbModeAccessType);
    Disposable disposable = null;
    if (app.isWriteIntentLockAcquired()) {
      disposable = Disposer.newDisposable();
      app.getMessageBus().connect(disposable).subscribe(PsiModificationTracker.TOPIC,
                                                        () -> RecursionManager.dropCurrentMemoizationCache());
    }
    try {
      return preventCaching
             ? ourIgnoranceGuard.computePreventingRecursion(dumbModeAccessType, false, computable)
             : computable.compute();
    }
    finally {
      if (disposable != null) {
        Disposer.dispose(disposable);
      }
      DumbModeAccessType type = dumbModeAccessTypeStack.pop();
      assert dumbModeAccessType == type;
    }
  }
@ApiStatus.Internal
  @ApiStatus.Experimental
  @Override
  public <T, E extends Throwable> T ignoreDumbMode(@NotNull DumbModeAccessType dumbModeAccessType,
                                                   @NotNull ThrowableComputable<T, E> computable)