From fb16a2fd0800045825e904d8874cf106d88b2dbd Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Tue, 22 Aug 2017 18:19:23 +0200 Subject: [PATCH] replace sequential task with "write" progress --- .../analysis/HighlightControlFlowUtil.java | 9 +++++++ .../src/com/intellij/util/SequentialTask.java | 6 +++++ .../actions/CleanupInspectionIntention.java | 24 ++++++++---------- .../ex/PerformFixesModalTask.java | 25 +++++++++---------- .../codeInspection/ex/QuickFixAction.java | 23 ++++++----------- .../util/SequentialModalProgressTask.java | 2 +- 6 files changed, 45 insertions(+), 44 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java index e7e581ec4d93..6cb8857ffa14 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java @@ -753,6 +753,15 @@ public class HighlightControlFlowUtil { } } effectivelyFinal = notAccessedForWriting(variable, new LocalSearchScope(scope)); + if (effectivelyFinal) { + return ReferencesSearch.search(variable).forEach(ref -> { + PsiElement element = ref.getElement(); + if (element instanceof PsiReferenceExpression && PsiUtil.isAccessedForWriting((PsiExpression)element)) { + return !ControlFlowUtil.isVariableAssignedInLoop((PsiReferenceExpression)element, variable); + } + return true; + }); + } } } return effectivelyFinal; diff --git a/platform/lang-api/src/com/intellij/util/SequentialTask.java b/platform/lang-api/src/com/intellij/util/SequentialTask.java index cf27a4da1d8a..8e71d2d417e5 100644 --- a/platform/lang-api/src/com/intellij/util/SequentialTask.java +++ b/platform/lang-api/src/com/intellij/util/SequentialTask.java @@ -15,6 +15,8 @@ */ package com.intellij.util; +import com.intellij.openapi.progress.ProgressIndicator; + /** * Defines general contract for processing that may be executed by parts, i.e. it remembers the state after every iteration * and allows to resume the processing any time. @@ -41,6 +43,10 @@ public interface SequentialTask { */ boolean iteration(); + default boolean iteration(ProgressIndicator indicator) { + return iteration(); + } + /** * Asks current task to stop the processing (if any). */ diff --git a/platform/lang-impl/src/com/intellij/codeInspection/actions/CleanupInspectionIntention.java b/platform/lang-impl/src/com/intellij/codeInspection/actions/CleanupInspectionIntention.java index be0df6e36fb2..f2df73f8a7de 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/actions/CleanupInspectionIntention.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/actions/CleanupInspectionIntention.java @@ -25,6 +25,8 @@ import com.intellij.codeInspection.*; import com.intellij.codeInspection.ex.InspectionToolWrapper; import com.intellij.codeInspection.ex.LocalInspectionToolWrapper; import com.intellij.codeInspection.ex.PerformFixesModalTask; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.impl.ApplicationImpl; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; @@ -34,7 +36,6 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.util.IncorrectOperationException; -import com.intellij.util.SequentialModalProgressTask; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -97,17 +98,15 @@ public class CleanupInspectionIntention implements IntentionAction, HighPriority @NotNull String presentationText, @NotNull List descriptions, @Nullable Class quickfixClass) { - final SequentialModalProgressTask progressTask = - new SequentialModalProgressTask(project, presentationText, true); + final boolean isBatch = quickfixClass != null && BatchQuickFix.class.isAssignableFrom(quickfixClass); final AbstractPerformFixesTask fixesTask = isBatch ? - new PerformBatchFixesTask(project, descriptions.toArray(ProblemDescriptor.EMPTY_ARRAY), progressTask, quickfixClass) : - new PerformFixesTask(project, descriptions.toArray(ProblemDescriptor.EMPTY_ARRAY), progressTask, quickfixClass); + new PerformBatchFixesTask(project, descriptions.toArray(ProblemDescriptor.EMPTY_ARRAY), quickfixClass) : + new PerformFixesTask(project, descriptions.toArray(ProblemDescriptor.EMPTY_ARRAY), quickfixClass); CommandProcessor.getInstance().executeCommand(project, () -> { CommandProcessor.getInstance().markCurrentCommandAsGlobal(project); - progressTask.setMinIterationTime(200); - progressTask.setTask(fixesTask); - ProgressManager.getInstance().run(progressTask); + ((ApplicationImpl)ApplicationManager.getApplication()) + .runWriteActionWithProgressInDispatchThread(presentationText, project, null, null, fixesTask::doRun); }, presentationText, null); return fixesTask; } @@ -134,9 +133,8 @@ public class CleanupInspectionIntention implements IntentionAction, HighPriority public AbstractPerformFixesTask(@NotNull Project project, @NotNull CommonProblemDescriptor[] descriptors, - @NotNull SequentialModalProgressTask task, @Nullable Class quickfixClass) { - super(project, descriptors, task); + super(project, descriptors); myQuickfixClass = quickfixClass; } @@ -171,9 +169,8 @@ public class CleanupInspectionIntention implements IntentionAction, HighPriority public PerformBatchFixesTask(@NotNull Project project, @NotNull CommonProblemDescriptor[] descriptors, - @NotNull SequentialModalProgressTask task, @NotNull Class quickfixClass) { - super(project, descriptors, task, quickfixClass); + super(project, descriptors, quickfixClass); } @Override @@ -209,9 +206,8 @@ public class CleanupInspectionIntention implements IntentionAction, HighPriority private static class PerformFixesTask extends AbstractPerformFixesTask { public PerformFixesTask(@NotNull Project project, @NotNull CommonProblemDescriptor[] descriptors, - @NotNull SequentialModalProgressTask task, @Nullable Class quickFixClass) { - super(project, descriptors, task, quickFixClass); + super(project, descriptors, quickFixClass); } @Override diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ex/PerformFixesModalTask.java b/platform/lang-impl/src/com/intellij/codeInspection/ex/PerformFixesModalTask.java index 0ddaab43f277..315ac8ffd2dd 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ex/PerformFixesModalTask.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ex/PerformFixesModalTask.java @@ -20,12 +20,10 @@ import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.codeInspection.QuickFix; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.progress.ProgressIndicator; -import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.presentation.java.SymbolPresentationUtil; -import com.intellij.util.SequentialModalProgressTask; import com.intellij.util.SequentialTask; import org.jetbrains.annotations.NotNull; @@ -33,16 +31,13 @@ public abstract class PerformFixesModalTask implements SequentialTask { @NotNull protected final Project myProject; private final CommonProblemDescriptor[] myDescriptors; - private final SequentialModalProgressTask myTask; private final PsiDocumentManager myDocumentManager; private int myCount = 0; public PerformFixesModalTask(@NotNull Project project, - @NotNull CommonProblemDescriptor[] descriptors, - @NotNull SequentialModalProgressTask task) { + @NotNull CommonProblemDescriptor[] descriptors) { myProject = project; myDescriptors = descriptors; - myTask = task; myDocumentManager = PsiDocumentManager.getInstance(myProject); } @@ -57,16 +52,20 @@ public abstract class PerformFixesModalTask implements SequentialTask { @Override public boolean iteration() { - if (DumbService.getInstance(myProject).isDumb()) { - //wait in progress until smart - try { - Thread.sleep(1000); + return true; + } + + public void doRun(ProgressIndicator indicator) { + while (!isDone()) { + if (indicator.isCanceled()) { + break; } - catch (InterruptedException ignore) { } - return false; + iteration(indicator); } + } + + public boolean iteration(ProgressIndicator indicator) { final CommonProblemDescriptor descriptor = myDescriptors[myCount++]; - ProgressIndicator indicator = myTask.getIndicator(); if (indicator != null) { indicator.setFraction((double)myCount / myDescriptors.length); String presentableText = "usages"; diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ex/QuickFixAction.java b/platform/lang-impl/src/com/intellij/codeInspection/ex/QuickFixAction.java index d7635e3530b0..8198831270c0 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ex/QuickFixAction.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ex/QuickFixAction.java @@ -33,6 +33,7 @@ import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.CustomComponentAction; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.application.impl.ApplicationImpl; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; @@ -48,7 +49,6 @@ import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.ui.ClickListener; -import com.intellij.util.SequentialModalProgressTask; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; import gnu.trove.THashSet; @@ -124,7 +124,7 @@ public class QuickFixAction extends AnAction implements CustomComponentAction { Ref descriptors = Ref.create(); Set readOnlyFiles = new THashSet<>(); //TODO revise when jdk9 arrives. Until then this redundant cast is a workaround to compile under jdk9 b169 - if (!ProgressManager.getInstance().runProcessWithProgressSynchronously((Runnable)() -> ReadAction.run(() -> { + if (!ProgressManager.getInstance().runProcessWithProgressSynchronously(() -> ReadAction.run(() -> { final ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); indicator.setText("Checking problem descriptors..."); descriptors.set(tree.getSelectedDescriptors(true, readOnlyFiles, false, false)); @@ -178,11 +178,9 @@ public class QuickFixAction extends AnAction implements CustomComponentAction { assert templatePresentationText != null; CommandProcessor.getInstance().executeCommand(project, () -> { CommandProcessor.getInstance().markCurrentCommandAsGlobal(project); - final SequentialModalProgressTask progressTask = - new SequentialModalProgressTask(project, templatePresentationText, true); - progressTask.setMinIterationTime(200); - progressTask.setTask(new PerformFixesTask(project, descriptors, ignoredElements, progressTask, context)); - ProgressManager.getInstance().run(progressTask); + PerformFixesTask performFixesTask = new PerformFixesTask(project, descriptors, ignoredElements, context); + ((ApplicationImpl)ApplicationManager.getApplication()) + .runWriteActionWithProgressInDispatchThread(templatePresentationText, project, null, null, performFixesTask::doRun); }, templatePresentationText, null); } @@ -248,13 +246,7 @@ public class QuickFixAction extends AnAction implements CustomComponentAction { if (containingFile1 == containingFile2) { int i1 = element1.getTextOffset(); int i2 = element2.getTextOffset(); - if (i1 < i2) { - return 1; - } - if (i1 > i2){ - return -1; - } - return 0; + return Integer.compare(i2, i1); } return containingFile1.getName().compareTo(containingFile2.getName()); } @@ -341,9 +333,8 @@ public class QuickFixAction extends AnAction implements CustomComponentAction { PerformFixesTask(@NotNull Project project, @NotNull CommonProblemDescriptor[] descriptors, @NotNull Set ignoredElements, - @NotNull SequentialModalProgressTask task, @NotNull GlobalInspectionContextImpl context) { - super(project, descriptors, task); + super(project, descriptors); myContext = context; myIgnoredElements = ignoredElements; } diff --git a/platform/lang-impl/src/com/intellij/util/SequentialModalProgressTask.java b/platform/lang-impl/src/com/intellij/util/SequentialModalProgressTask.java index 56c746d1d8c7..c29e4e78d9fa 100644 --- a/platform/lang-impl/src/com/intellij/util/SequentialModalProgressTask.java +++ b/platform/lang-impl/src/com/intellij/util/SequentialModalProgressTask.java @@ -90,7 +90,7 @@ public class SequentialModalProgressTask extends Task.Modal { long start = System.currentTimeMillis(); try { while (!task.isDone() && System.currentTimeMillis() - start < myMinIterationTime) { - task.iteration(); + task.iteration(indicator); } } catch (RuntimeException e) {