@@ -26,58 +26,59 @@ public void after(@NotNull List<? extends VFileEvent> events) {
2626 // fixme debug only
2727 DCLogger .info ("MyBulkFileListener.after begins for " + events .size () + " events " + events );
2828 for (Project project : ProjectManager .getInstance ().getOpenProjects ()) {
29+ /*
30+ for (Project project : AnalysisData.getAllCachedProject()) {
31+ RunUtils.runInBackground(
32+ project,
33+ () -> {
34+ */
35+ Set <PsiFile > filesChangedOrCreated =
36+ /*
37+ RunUtils.computeInReadActionInSmartMode(
38+ project,
39+ () ->
40+ */
41+ getFilteredFilesByEventTypes (
42+ project ,
43+ events ,
44+ (psiFile -> DeepCodeUtils .isSupportedFileFormat (psiFile )
45+ // to prevent updating files already done by
46+ // MyPsiTreeChangeAdapter
47+ // fixme: doesn't work, try to use isFromSave or isFromRefresh
48+ // && AnalysisData.isHashChanged(psiFile)
49+ ),
50+ VFileContentChangeEvent .class ,
51+ VFileMoveEvent .class ,
52+ VFileCopyEvent .class ,
53+ VFileCreateEvent .class );
54+ if (!filesChangedOrCreated .isEmpty ()) {
55+ DCLogger .info (filesChangedOrCreated .size () + " files changed: " + filesChangedOrCreated );
56+ if (filesChangedOrCreated .size () > 10 ) {
57+ // if too many files changed then it's easier to do Bulk Mode full rescan
58+ RunUtils .setBulkMode (project );
59+ RunUtils .runInBackground (
60+ project ,
61+ () -> {
62+ // small delay to prevent multiple rescan
63+ RunUtils .rescanProject (project , 100 );
2964/*
30- for (Project project : AnalysisData.getAllCachedProject()) {
31- RunUtils.runInBackground(
32- project,
33- () -> {
34- */
35- Set <PsiFile > filesChangedOrCreated =
36- /*
37- RunUtils.computeInReadActionInSmartMode(
38- project,
39- () ->
65+ AnalysisData.removeFilesFromCache(filesChangedOrCreated);
66+ RunUtils.updateCachedAnalysisResults(project, filesChangedOrCreated);
4067*/
41- getFilteredFilesByEventTypes (
42- project ,
43- events ,
44- (psiFile ->
45- DeepCodeUtils .isSupportedFileFormat (psiFile )
46- // to prevent updating files already done by
47- // MyPsiTreeChangeAdapter
48- // fixme: doesn't work, try to use isFromSave or isFromRefresh
49- //&& AnalysisData.isHashChanged(psiFile)
50- ),
51- VFileContentChangeEvent .class ,
52- VFileMoveEvent .class ,
53- VFileCopyEvent .class ,
54- VFileCreateEvent .class );
55- if (!filesChangedOrCreated .isEmpty ()) {
56- DCLogger .info (
57- filesChangedOrCreated .size () + " files changed: " + filesChangedOrCreated );
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 ,
63- () -> {
64- AnalysisData .removeFilesFromCache (filesChangedOrCreated );
65- RunUtils .updateCachedAnalysisResults (project , filesChangedOrCreated );
66- RunUtils .unsetBulkMode (project );
67- });
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- }
78- }
79- }
80- // });
68+ RunUtils .unsetBulkMode (project );
69+ });
70+ } else {
71+ for (PsiFile psiFile : filesChangedOrCreated ) {
72+ RunUtils .runInBackgroundCancellable (
73+ psiFile ,
74+ () -> {
75+ AnalysisData .removeFilesFromCache (Collections .singleton (psiFile ));
76+ RunUtils .updateCachedAnalysisResults (project , Collections .singleton (psiFile ));
77+ });
78+ }
79+ }
80+ }
81+ // });
8182
8283 Set <PsiFile > gcignoreChangedFiles =
8384 getFilteredFilesByEventTypes (
@@ -92,8 +93,8 @@ public void after(@NotNull List<? extends VFileEvent> events) {
9293 project ,
9394 () -> {
9495 gcignoreChangedFiles .forEach (DeepCodeIgnoreInfoHolder ::update_dcignoreFileContent );
95- // ??? small delay to prevent duplicated delete with MyPsiTreeChangeAdapter
96- RunUtils .rescanProject (project , 0 );
96+ // small delay to prevent multiple rescan
97+ RunUtils .rescanProject (project , 100 );
9798 RunUtils .unsetBulkMode (project );
9899 });
99100 }
@@ -106,21 +107,33 @@ public void after(@NotNull List<? extends VFileEvent> events) {
106107 public void before (@ NotNull List <? extends VFileEvent > events ) {
107108 DCLogger .info ("MyBulkFileListener.before begins for " + events .size () + " events " + events );
108109 for (Project project : ProjectManager .getInstance ().getOpenProjects ()) {
109- // for (Project project : AnalysisData.getAllCachedProject()) {
110+ // for (Project project : AnalysisData.getAllCachedProject()) {
110111 if (project .isDisposed ()) continue ;
111112 Set <PsiFile > filesRemoved =
112113 getFilteredFilesByEventTypes (
113114 project , events , DeepCodeUtils ::isSupportedFileFormat , VFileDeleteEvent .class );
114115 if (!filesRemoved .isEmpty ()) {
115116 DCLogger .info ("Found " + filesRemoved .size () + " files to remove: " + filesRemoved );
116117 RunUtils .setBulkMode (project );
117- RunUtils .runInBackground (
118- project ,
119- () -> {
120- AnalysisData .removeFilesFromCache (filesRemoved );
121- RunUtils .updateCachedAnalysisResults (project , Collections .emptyList (), filesRemoved );
122- RunUtils .unsetBulkMode (project );
123- });
118+ if (filesRemoved .size () > 10 ) {
119+ // if too many files removed then it's easier to do full rescan
120+ RunUtils .runInBackground (
121+ project ,
122+ () -> {
123+ // small delay to prevent multiple rescan
124+ RunUtils .rescanProject (project , 100 );
125+ RunUtils .unsetBulkMode (project );
126+ });
127+ } else {
128+ RunUtils .runInBackground (
129+ project ,
130+ () -> {
131+ AnalysisData .removeFilesFromCache (filesRemoved );
132+ RunUtils .updateCachedAnalysisResults (
133+ project , Collections .emptyList (), filesRemoved );
134+ RunUtils .unsetBulkMode (project );
135+ });
136+ }
124137 }
125138
126139 Set <PsiFile > ignoreFilesToRemove =
@@ -132,8 +145,8 @@ public void before(@NotNull List<? extends VFileEvent> events) {
132145 project ,
133146 () -> {
134147 ignoreFilesToRemove .forEach (DeepCodeIgnoreInfoHolder ::remove_dcignoreFileContent );
135- // ??? small delay to prevent duplicated delete with MyPsiTreeChangeAdapter
136- RunUtils .rescanProject (project , 0 );
148+ // small delay to prevent multiple rescan
149+ RunUtils .rescanProject (project , 100 );
137150 RunUtils .unsetBulkMode (project );
138151 });
139152 }
@@ -148,6 +161,8 @@ private Set<PsiFile> getFilteredFilesByEventTypes(
148161 @ NotNull Class <?>... classesOfEventsToFilter ) {
149162 PsiManager manager = PsiManager .getInstance (project );
150163 return events .stream ()
164+ // to prevent updating files already done by MyPsiTreeChangeAdapter
165+ .filter (VFileEvent ::isFromRefresh )
151166 .filter (event -> PsiTreeUtil .instanceOf (event , classesOfEventsToFilter ))
152167 .map (VFileEvent ::getFile )
153168 .filter (Objects ::nonNull )
0 commit comments