copyright/infer nullity: check read-only status only for files to be changed

This commit is contained in:
Anna Kozlova
2014-11-14 20:17:03 +01:00
parent 6f70b84812
commit c1b2da19a8
5 changed files with 41 additions and 16 deletions
@@ -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<PsiElement> elements = new LinkedHashSet<PsiElement>();
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));
@@ -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);
@@ -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<Runnable> preparations = new ArrayList<Runnable>();
final Map<PsiFile, Runnable> preparations = new LinkedHashMap<PsiFile, Runnable>();
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<Runnable> myRunnables;
private final Iterator<Runnable> myRunnables;
private final SequentialModalProgressTask myProgressTask;
private int myIdx = 0;
private UpdateCopyrightSequentialTask(List<Runnable> runnables, SequentialModalProgressTask progressTask) {
myRunnables = runnables;
private UpdateCopyrightSequentialTask(Map<PsiFile, Runnable> 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;
}
@@ -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()
{
@@ -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;