diff --git a/java/java-impl/src/com/intellij/codeInspection/inferNullity/InferNullityAnnotationsAction.java b/java/java-impl/src/com/intellij/codeInspection/inferNullity/InferNullityAnnotationsAction.java index 8b6c9bcd595c..361c3916e021 100644 --- a/java/java-impl/src/com/intellij/codeInspection/inferNullity/InferNullityAnnotationsAction.java +++ b/java/java-impl/src/com/intellij/codeInspection/inferNullity/InferNullityAnnotationsAction.java @@ -19,6 +19,7 @@ import com.intellij.analysis.AnalysisScope; import com.intellij.analysis.BaseAnalysisAction; import com.intellij.analysis.BaseAnalysisActionDialog; import com.intellij.codeInsight.AnnotationUtil; +import com.intellij.codeInsight.FileModificationService; import com.intellij.codeInsight.NullableNotNullManager; import com.intellij.codeInsight.daemon.QuickFixBundle; import com.intellij.codeInsight.daemon.impl.quickfix.LocateLibraryDialog; @@ -59,14 +60,12 @@ import com.intellij.usages.*; import com.intellij.util.Function; import com.intellij.util.Processor; import com.intellij.util.SequentialModalProgressTask; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import javax.swing.*; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; public class InferNullityAnnotationsAction extends BaseAnalysisAction { @NonNls private static final String INFER_NULLITY_ANNOTATIONS = "Infer Nullity Annotations"; @@ -185,8 +184,6 @@ public class InferNullityAnnotationsAction extends BaseAnalysisAction { } return; } - if (scope.checkScopeWritable(project)) return; - PsiDocumentManager.getInstance(project).commitAllDocuments(); final UsageInfo[] usageInfos = findUsages(project, scope); if (usageInfos == null) return; @@ -258,6 +255,16 @@ public class InferNullityAnnotationsAction extends BaseAnalysisAction { protected void run(@NotNull Result result) throws Throwable { final UsageInfo[] infos = computable.compute(); if (infos.length > 0) { + + final Set elements = new LinkedHashSet(); + for (UsageInfo info : infos) { + final PsiElement element = info.getElement(); + if (element != null) { + ContainerUtil.addIfNotNull(elements, element.getContainingFile()); + } + } + if (!FileModificationService.getInstance().preparePsiElementsForWrite(elements)) return; + final SequentialModalProgressTask progressTask = new SequentialModalProgressTask(project, INFER_NULLITY_ANNOTATIONS, false); progressTask.setMinIterationTime(200); progressTask.setTask(new AnnotateTask(project, progressTask, infos)); diff --git a/platform/analysis-api/src/com/intellij/analysis/AnalysisScope.java b/platform/analysis-api/src/com/intellij/analysis/AnalysisScope.java index f7c4ca1bf274..9f55e9337cde 100644 --- a/platform/analysis-api/src/com/intellij/analysis/AnalysisScope.java +++ b/platform/analysis-api/src/com/intellij/analysis/AnalysisScope.java @@ -597,6 +597,10 @@ public class AnalysisScope { return myFilesSet.size(); } + /** + * scope elements should be checked only when needed + */ + @Deprecated public boolean checkScopeWritable(@NotNull Project project) { if (myFilesSet == null) initFilesSet(); return !FileModificationService.getInstance().prepareVirtualFilesForWrite(project, myFilesSet); diff --git a/plugins/copyright/src/com/maddyhome/idea/copyright/actions/UpdateCopyrightAction.java b/plugins/copyright/src/com/maddyhome/idea/copyright/actions/UpdateCopyrightAction.java index eb879a1e52e9..0e1e1107d896 100644 --- a/plugins/copyright/src/com/maddyhome/idea/copyright/actions/UpdateCopyrightAction.java +++ b/plugins/copyright/src/com/maddyhome/idea/copyright/actions/UpdateCopyrightAction.java @@ -19,17 +19,20 @@ package com.maddyhome.idea.copyright.actions; import com.intellij.analysis.AnalysisScope; import com.intellij.analysis.BaseAnalysisAction; import com.intellij.analysis.BaseAnalysisActionDialog; +import com.intellij.codeInsight.FileModificationService; import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.VerticalFlowLayout; +import com.intellij.openapi.util.EmptyRunnable; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.ui.TitledSeparator; @@ -42,8 +45,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.util.ArrayList; -import java.util.List; +import java.util.*; public class UpdateCopyrightAction extends BaseAnalysisAction { public static final String UPDATE_EXISTING_COPYRIGHTS = "update.existing.copyrights"; @@ -130,8 +132,7 @@ public class UpdateCopyrightAction extends BaseAnalysisAction { @Override protected void analyze(@NotNull final Project project, @NotNull final AnalysisScope scope) { PropertiesComponent.getInstance().setValue(UPDATE_EXISTING_COPYRIGHTS, String.valueOf(myUpdateExistingCopyrightsCb.isSelected())); - if (scope.checkScopeWritable(project)) return; - final List preparations = new ArrayList(); + final Map preparations = new LinkedHashMap(); Task.Backgroundable task = new Task.Backgroundable(project, "Prepare Copyright...", true) { @Override public void run(@NotNull final ProgressIndicator indicator) { @@ -141,7 +142,12 @@ public class UpdateCopyrightAction extends BaseAnalysisAction { if (indicator.isCanceled()) { return; } - preparations.add(new UpdateCopyrightProcessor(project, ModuleUtilCore.findModuleForPsiElement(file), file).preprocessFile(file, myUpdateExistingCopyrightsCb.isSelected())); + final Module module = ModuleUtilCore.findModuleForPsiElement(file); + final UpdateCopyrightProcessor processor = new UpdateCopyrightProcessor(project, module, file); + final Runnable runnable = processor.preprocessFile(file, myUpdateExistingCopyrightsCb.isSelected()); + if (runnable != EmptyRunnable.getInstance()) { + preparations.put(file, runnable); + } } }); } @@ -149,6 +155,7 @@ public class UpdateCopyrightAction extends BaseAnalysisAction { @Override public void onSuccess() { if (!preparations.isEmpty()) { + if (!FileModificationService.getInstance().preparePsiElementsForWrite(preparations.keySet())) return; final SequentialModalProgressTask progressTask = new SequentialModalProgressTask(project, UpdateCopyrightProcessor.TITLE, true); progressTask.setMinIterationTime(200); progressTask.setTask(new UpdateCopyrightSequentialTask(preparations, progressTask)); @@ -173,14 +180,14 @@ public class UpdateCopyrightAction extends BaseAnalysisAction { private static class UpdateCopyrightSequentialTask implements SequentialTask { private final int mySize; - private final List myRunnables; + private final Iterator myRunnables; private final SequentialModalProgressTask myProgressTask; private int myIdx = 0; - private UpdateCopyrightSequentialTask(List runnables, SequentialModalProgressTask progressTask) { - myRunnables = runnables; + private UpdateCopyrightSequentialTask(Map runnables, SequentialModalProgressTask progressTask) { + myRunnables = runnables.values().iterator(); myProgressTask = progressTask; - mySize = myRunnables.size(); + mySize = runnables.size(); } @Override @@ -197,7 +204,8 @@ public class UpdateCopyrightAction extends BaseAnalysisAction { if (indicator != null) { indicator.setFraction((double) myIdx/mySize); } - myRunnables.get(myIdx++).run(); + myRunnables.next().run(); + myIdx++; return true; } diff --git a/plugins/copyright/src/com/maddyhome/idea/copyright/actions/UpdateCopyrightProcessor.java b/plugins/copyright/src/com/maddyhome/idea/copyright/actions/UpdateCopyrightProcessor.java index c9d7e4871dc3..23b037cc343f 100644 --- a/plugins/copyright/src/com/maddyhome/idea/copyright/actions/UpdateCopyrightProcessor.java +++ b/plugins/copyright/src/com/maddyhome/idea/copyright/actions/UpdateCopyrightProcessor.java @@ -88,6 +88,8 @@ public class UpdateCopyrightProcessor extends AbstractFileProcessor if (update == null) return EmptyRunnable.getInstance(); update.prepare(); + if (update instanceof UpdatePsiFileCopyright && !((UpdatePsiFileCopyright)update).hasUpdates()) return EmptyRunnable.getInstance(); + return new Runnable() { public void run() { diff --git a/plugins/copyright/src/com/maddyhome/idea/copyright/psi/UpdatePsiFileCopyright.java b/plugins/copyright/src/com/maddyhome/idea/copyright/psi/UpdatePsiFileCopyright.java index d34152f870cd..7f91d8770eeb 100644 --- a/plugins/copyright/src/com/maddyhome/idea/copyright/psi/UpdatePsiFileCopyright.java +++ b/plugins/copyright/src/com/maddyhome/idea/copyright/psi/UpdatePsiFileCopyright.java @@ -351,6 +351,10 @@ public abstract class UpdatePsiFileCopyright extends AbstractUpdateCopyright { }.execute(); } + public boolean hasUpdates() { + return !actions.isEmpty(); + } + private static class CommentRange { public CommentRange(PsiElement first, PsiElement last) { this.first = first;