mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
don't queue "reindexRefreshedFiles" dumb mode task if it's already enqueued for this project
This commit is contained in:
@@ -20,9 +20,32 @@ import com.intellij.openapi.progress.ProgressIndicator;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* A task that should be executed in IDE dumb mode, via {@link DumbService#queueTask(DumbModeTask)}.
|
||||
*
|
||||
* @author peter
|
||||
*/
|
||||
public abstract class DumbModeTask implements Disposable {
|
||||
private final Object myEquivalenceObject;
|
||||
|
||||
public DumbModeTask() {
|
||||
myEquivalenceObject = this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param equivalenceObject see {@link #getEquivalenceObject()}
|
||||
*/
|
||||
public DumbModeTask(@NotNull Object equivalenceObject) {
|
||||
myEquivalenceObject = equivalenceObject;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return an object whose {@link Object#equals(Object)} determines task equivalence. If several equivalent tasks are queued
|
||||
* for dumb mode execution at once, only one of them will be executed. By default the task object itself is returned.
|
||||
*/
|
||||
@NotNull
|
||||
public final Object getEquivalenceObject() {
|
||||
return myEquivalenceObject;
|
||||
}
|
||||
|
||||
public abstract void performInDumbMode(@NotNull ProgressIndicator indicator);
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
package com.intellij.util.indexing;
|
||||
|
||||
import com.intellij.ide.IdeBundle;
|
||||
import com.intellij.ide.caches.FileContent;
|
||||
import com.intellij.ide.startup.StartupManagerEx;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.application.TransactionGuard;
|
||||
@@ -38,7 +37,6 @@ import com.intellij.openapi.startup.StartupManager;
|
||||
import com.intellij.openapi.vfs.VfsUtilCore;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.vfs.VirtualFileVisitor;
|
||||
import com.intellij.util.Consumer;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -141,7 +139,7 @@ public class FileBasedIndexProjectHandler extends AbstractProjectComponent imple
|
||||
return null;
|
||||
}
|
||||
|
||||
return new DumbModeTask() {
|
||||
return new DumbModeTask(project.getComponent(FileBasedIndexProjectHandler.class)) {
|
||||
@Override
|
||||
public void performInDumbMode(@NotNull ProgressIndicator indicator) {
|
||||
final Collection<VirtualFile> files = index.getFilesToUpdate(project);
|
||||
|
||||
@@ -46,7 +46,9 @@ import org.jetbrains.annotations.TestOnly;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
public class DumbServiceImpl extends DumbService implements Disposable, ModificationTracker {
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.project.DumbServiceImpl");
|
||||
@@ -64,6 +66,7 @@ public class DumbServiceImpl extends DumbService implements Disposable, Modifica
|
||||
private boolean myUpdateFinishedQueued;
|
||||
private final DumbModeListener myPublisher;
|
||||
private long myModificationCount;
|
||||
private final Set<Object> myQueuedEquivalences = new HashSet<>();
|
||||
private final Queue<DumbModeTask> myUpdatesQueue = new Queue<>(5);
|
||||
|
||||
/**
|
||||
@@ -99,6 +102,7 @@ public class DumbServiceImpl extends DumbService implements Disposable, Modifica
|
||||
public void dispose() {
|
||||
ApplicationManager.getApplication().assertIsDispatchThread();
|
||||
myUpdatesQueue.clear();
|
||||
myQueuedEquivalences.clear();
|
||||
myRunWhenSmartQueue.clear();
|
||||
for (DumbModeTask task : new ArrayList<>(myProgresses.keySet())) {
|
||||
cancelTask(task);
|
||||
@@ -190,6 +194,11 @@ public class DumbServiceImpl extends DumbService implements Disposable, Modifica
|
||||
return;
|
||||
}
|
||||
|
||||
if (!myQueuedEquivalences.add(task.getEquivalenceObject())) {
|
||||
Disposer.dispose(task);
|
||||
return;
|
||||
}
|
||||
|
||||
final DumbModePermission permission = schedulerPermission != null ? schedulerPermission : getEdtPermission();
|
||||
|
||||
myProgresses.put(task, new ProgressIndicatorBase());
|
||||
@@ -493,6 +502,7 @@ public class DumbServiceImpl extends DumbService implements Disposable, Modifica
|
||||
}
|
||||
|
||||
DumbModeTask queuedTask = myUpdatesQueue.pullFirst();
|
||||
myQueuedEquivalences.remove(queuedTask.getEquivalenceObject());
|
||||
ProgressIndicatorEx indicator = myProgresses.get(queuedTask);
|
||||
if (indicator.isCanceled()) {
|
||||
Disposer.dispose(queuedTask);
|
||||
|
||||
Reference in New Issue
Block a user