11package ai .deepcode .jbplugin .core ;
22
33import com .intellij .openapi .project .Project ;
4+ import com .intellij .openapi .project .ProjectManager ;
45import com .intellij .openapi .vfs .newvfs .BulkFileListener ;
5- import com .intellij .openapi .vfs .newvfs .events .VFileContentChangeEvent ;
6- import com .intellij .openapi .vfs .newvfs .events .VFileCreateEvent ;
7- import com .intellij .openapi .vfs .newvfs .events .VFileDeleteEvent ;
8- import com .intellij .openapi .vfs .newvfs .events .VFileEvent ;
6+ import com .intellij .openapi .vfs .newvfs .events .*;
97import com .intellij .psi .PsiFile ;
108import com .intellij .psi .PsiManager ;
119import com .intellij .psi .util .PsiTreeUtil ;
@@ -26,15 +24,20 @@ public class MyBulkFileListener implements BulkFileListener {
2624 @ Override
2725 public void after (@ NotNull List <? extends VFileEvent > events ) {
2826 // fixme debug only
29- DCLogger .info ("MyBulkFileListener.after begins for: " + events );
27+ DCLogger .info ("MyBulkFileListener.after begins for " + events .size () + " events " + events );
28+ for (Project project : ProjectManager .getInstance ().getOpenProjects ()) {
29+ /*
3030 for (Project project : AnalysisData.getAllCachedProject()) {
3131 RunUtils.runInBackground(
3232 project,
3333 () -> {
34+ */
3435 Set <PsiFile > filesChangedOrCreated =
36+ /*
3537 RunUtils.computeInReadActionInSmartMode(
3638 project,
3739 () ->
40+ */
3841 getFilteredFilesByEventTypes (
3942 project ,
4043 events ,
@@ -43,23 +46,38 @@ public void after(@NotNull List<? extends VFileEvent> events) {
4346 // to prevent updating files already done by
4447 // MyPsiTreeChangeAdapter
4548 // fixme: doesn't work, try to use isFromSave or isFromRefresh
46- && AnalysisData .isHashChanged (psiFile )),
49+ //&& AnalysisData.isHashChanged(psiFile)
50+ ),
4751 VFileContentChangeEvent .class ,
48- // fixme doen't work for copy-past file ( VFileMoveEvent ?)
49- VFileCreateEvent .class ));
52+ VFileMoveEvent .class ,
53+ VFileCopyEvent .class ,
54+ VFileCreateEvent .class );
5055 if (!filesChangedOrCreated .isEmpty ()) {
5156 DCLogger .info (
5257 filesChangedOrCreated .size () + " files changed: " + filesChangedOrCreated );
53- for (PsiFile psiFile : filesChangedOrCreated ) {
54- RunUtils .runInBackgroundCancellable (
55- psiFile ,
58+ if (filesChangedOrCreated .size () > 10 ) {
59+ // if too many files changed then it's easier to do full rescan
60+ RunUtils .setBulkMode (project );
61+ RunUtils .runInBackground (
62+ project ,
5663 () -> {
57- AnalysisData .removeFilesFromCache (Collections .singleton (psiFile ));
58- RunUtils .asyncAnalyseAndUpdatePanel (project , Collections .singleton (psiFile ));
64+ AnalysisData .removeFilesFromCache (filesChangedOrCreated );
65+ RunUtils .updateCachedAnalysisResults (project , filesChangedOrCreated );
66+ RunUtils .unsetBulkMode (project );
5967 });
68+ } else {
69+ for (PsiFile psiFile : filesChangedOrCreated ) {
70+ RunUtils .runInBackgroundCancellable (
71+ psiFile ,
72+ () -> {
73+ AnalysisData .removeFilesFromCache (Collections .singleton (psiFile ));
74+ RunUtils .updateCachedAnalysisResults (
75+ project , Collections .singleton (psiFile ));
76+ });
77+ }
6078 }
6179 }
62- });
80+ // });
6381
6482 Set <PsiFile > gcignoreChangedFiles =
6583 getFilteredFilesByEventTypes (
@@ -69,50 +87,58 @@ public void after(@NotNull List<? extends VFileEvent> events) {
6987 VFileContentChangeEvent .class ,
7088 VFileCreateEvent .class );
7189 if (!gcignoreChangedFiles .isEmpty ()) {
90+ RunUtils .setBulkMode (project );
7291 RunUtils .runInBackground (
7392 project ,
7493 () -> {
7594 gcignoreChangedFiles .forEach (DeepCodeIgnoreInfoHolder ::update_dcignoreFileContent );
76- // small delay to prevent duplicated delete with MyPsiTreeChangeAdapter
77- RunUtils .rescanProject (project , 100 );
95+ // ??? small delay to prevent duplicated delete with MyPsiTreeChangeAdapter
96+ RunUtils .rescanProject (project , 0 );
97+ RunUtils .unsetBulkMode (project );
7898 });
7999 }
80100 }
81101 // fixme debug only
82- DCLogger .info ("MyBulkFileListener.after ends for: " + events );
102+ DCLogger .info ("MyBulkFileListener.after ends" );
83103 }
84104
85105 @ Override
86106 public void before (@ NotNull List <? extends VFileEvent > events ) {
87- DCLogger .info ("MyBulkFileListener.before begins for: " + events );
88- for (Project project : AnalysisData .getAllCachedProject ()) {
107+ DCLogger .info ("MyBulkFileListener.before begins for " + events .size () + " events " + events );
108+ for (Project project : ProjectManager .getInstance ().getOpenProjects ()) {
109+ //for (Project project : AnalysisData.getAllCachedProject()) {
89110 if (project .isDisposed ()) continue ;
90111 Set <PsiFile > filesRemoved =
91112 getFilteredFilesByEventTypes (
92113 project , events , DeepCodeUtils ::isSupportedFileFormat , VFileDeleteEvent .class );
93114 if (!filesRemoved .isEmpty ()) {
115+ DCLogger .info ("Found " + filesRemoved .size () + " files to remove: " + filesRemoved );
116+ RunUtils .setBulkMode (project );
94117 RunUtils .runInBackground (
95118 project ,
96119 () -> {
97120 AnalysisData .removeFilesFromCache (filesRemoved );
98- RunUtils .asyncAnalyseAndUpdatePanel (project , Collections .emptyList (), filesRemoved );
121+ RunUtils .updateCachedAnalysisResults (project , Collections .emptyList (), filesRemoved );
122+ RunUtils .unsetBulkMode (project );
99123 });
100124 }
101125
102126 Set <PsiFile > ignoreFilesToRemove =
103127 getFilteredFilesByEventTypes (
104128 project , events , DeepCodeIgnoreInfoHolder ::is_ignoreFile , VFileDeleteEvent .class );
105129 if (!ignoreFilesToRemove .isEmpty ()) {
130+ RunUtils .setBulkMode (project );
106131 RunUtils .runInBackground (
107132 project ,
108133 () -> {
109134 ignoreFilesToRemove .forEach (DeepCodeIgnoreInfoHolder ::remove_dcignoreFileContent );
110- // small delay to prevent duplicated delete with MyPsiTreeChangeAdapter
111- RunUtils .rescanProject (project , 100 );
135+ // ??? small delay to prevent duplicated delete with MyPsiTreeChangeAdapter
136+ RunUtils .rescanProject (project , 0 );
137+ RunUtils .unsetBulkMode (project );
112138 });
113139 }
114140 }
115- DCLogger .info ("MyBulkFileListener.before ends for: " + events );
141+ DCLogger .info ("MyBulkFileListener.before ends" );
116142 }
117143
118144 private Set <PsiFile > getFilteredFilesByEventTypes (
0 commit comments