@@ -109,7 +109,7 @@ public void run(@NotNull ProgressIndicator indicator) {
109109 private static final Map <Project , Set <ProgressIndicator >> mapProject2Indicators =
110110 new ConcurrentHashMap <>();
111111
112- private static Set <ProgressIndicator > getRunningIndicators (@ NotNull Project project ) {
112+ private static synchronized Set <ProgressIndicator > getRunningIndicators (@ NotNull Project project ) {
113113 return mapProject2Indicators .computeIfAbsent (project , p -> new HashSet <>());
114114 }
115115
@@ -130,17 +130,28 @@ public static void cancelRunningIndicators(@NotNull Project project) {
130130 private static final Map <VirtualFile , ProgressIndicator > mapFileProcessed2CancellableIndicator =
131131 new ConcurrentHashMap <>();
132132
133+ private static final Map <VirtualFile , Runnable > mapFile2Runnable = new ConcurrentHashMap <>();
134+
133135 public static void runInBackgroundCancellable (
134136 @ NotNull PsiFile psiFile , @ NotNull Runnable runnable ) {
135137 DCLogger .info ("runInBackgroundCancellable requested for: " + psiFile .getName ());
138+ final VirtualFile virtualFile = psiFile .getVirtualFile ();
139+
140+ // To proceed multiple PSI events in a bunch (every 100 milliseconds)
141+ Runnable prevRunnable = mapFile2Runnable .put (virtualFile , runnable );
142+ if (prevRunnable != null ) return ;
143+ DCLogger .info ("new Background task registered for: " + psiFile .getName ());
144+
136145 final Project project = psiFile .getProject ();
137146 ProgressManager .getInstance ()
138147 .run (
139148 new Task .Backgroundable (project , "DeepCode: Analysing Files..." ) {
140149 @ Override
141150 public void run (@ NotNull ProgressIndicator indicator ) {
151+
152+ // To let new event cancel the currently running one
142153 ProgressIndicator prevProgressIndicator =
143- mapFileProcessed2CancellableIndicator .put (psiFile . getVirtualFile () , indicator );
154+ mapFileProcessed2CancellableIndicator .put (virtualFile , indicator );
144155 if (prevProgressIndicator != null
145156 // can't use prevProgressIndicator.isRunning() due to
146157 // https://youtrack.jetbrains.com/issue/IDEA-241055
@@ -160,7 +171,13 @@ && getRunningIndicators(project).contains(prevProgressIndicator)) {
160171 delay (100 );
161172
162173 DCLogger .info ("New Process started for " + psiFile .getName ());
163- runnable .run ();
174+ Runnable actualRunnable = mapFile2Runnable .get (virtualFile );
175+ mapFile2Runnable .remove (virtualFile );
176+ if (actualRunnable != null ) {
177+ actualRunnable .run ();
178+ } else {
179+ DCLogger .warn ("No actual Runnable found for: " + psiFile .getName ());
180+ }
164181 DCLogger .info ("Process ending for " + psiFile .getName ());
165182 }
166183 });
0 commit comments