diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java index ff1219ab92c6..c93050aa25a3 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java @@ -26,6 +26,7 @@ package com.intellij.codeInspection.dataFlow; import com.intellij.codeInspection.dataFlow.value.*; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProgressManager; import com.intellij.psi.PsiType; import com.intellij.psi.PsiVariable; import com.intellij.psi.util.TypeConversionUtil; @@ -191,10 +192,10 @@ public class DfaMemoryStateImpl implements DfaMemoryState { SortedIntSet aClass = myEqClasses.get(aClassIndex); if (aClass != null) { buf.append("("); - int[] values = aClass.toNativeArray(); - for (int i = 0; i < values.length; i++) { + + for (int i = 0; i < aClass.size(); i++) { if (i > 0) buf.append(", "); - int value = values[i]; + int value = aClass.get(i); DfaValue dfaValue = myFactory.getValue(value); buf.append(dfaValue); } @@ -413,16 +414,19 @@ public class DfaMemoryStateImpl implements DfaMemoryState { } } - c1.add(c2.toNativeArray()); - long[] c2Array = c2Pairs.toNativeArray(); - myDistinctClasses.removeAll(c2Array); + for (int i = 0; i < c2.size(); i++) { + int c = c2.get(i); + c1.add(c); + } + + for (int i = 0; i < c2Pairs.size(); i++) { + long c = c2Pairs.get(i); + myDistinctClasses.remove(c); + myDistinctClasses.add(createPair(c1Index, low(c) == c2Index ? high(c) : low(c))); + } myEqClasses.set(c2Index, null); myStateSize--; - for (long l : c2Array) { - myDistinctClasses.add(createPair(c1Index, low(l) == c2Index ? high(l) : low(l))); - } - return true; } @@ -577,9 +581,7 @@ public class DfaMemoryStateImpl implements DfaMemoryState { ){ dfaLeft = myFactory.getBoxedFactory().createUnboxed(dfaLeft); dfaRight = myFactory.getBoxedFactory().createUnboxed(dfaRight); - if (dfaLeft != null && dfaRight != null) { - result &= applyRelation(dfaLeft, dfaRight, isNegated); - } + result &= applyRelation(dfaLeft, dfaRight, isNegated); } else if (TypeConversionUtil.isPrimitiveAndNotNull(psiVariable.getType())){ dfaLeft = myFactory.getBoxedFactory().createBoxed(dfaLeft); @@ -675,21 +677,27 @@ public class DfaMemoryStateImpl implements DfaMemoryState { } public void flushVariable(@NotNull DfaVariableValue variable) { - int id = variable.getID(); - for (int varClassIndex = 0; varClassIndex < myEqClasses.size(); varClassIndex++) { - SortedIntSet varClass = myEqClasses.get(varClassIndex); + final int id = variable.getID(); + int size = myEqClasses.size(); + int interruptCount = 0; + for (int varClassIndex = 0; varClassIndex < size; varClassIndex++) { + final SortedIntSet varClass = myEqClasses.get(varClassIndex); if (varClass == null) continue; - int[] cls = varClass.toNativeArray(); - for (int i = 0; i < cls.length; i++) { - int cl = cls[i]; + + for (int i = 0; i < varClass.size(); i++) { + if ((++interruptCount & 0xf) == 0) { + ProgressManager.getInstance().checkCanceled(); + } + int cl = varClass.get(i); DfaValue value = myFactory.getValue(cl); - if (value != null && id == value.getID() - || value instanceof DfaBoxedValue && ((DfaBoxedValue)value).getWrappedValue().getID() == id - || value instanceof DfaUnboxedValue && ((DfaUnboxedValue)value).getVariable().getID() == id) { + if (value != null && id == value.getID() || + value instanceof DfaBoxedValue && ((DfaBoxedValue)value).getWrappedValue().getID() == id || + value instanceof DfaUnboxedValue && ((DfaUnboxedValue)value).getVariable().getID() == id) { varClass.remove(i); break; } } + if (varClass.isEmpty()) { myEqClasses.set(varClassIndex, null); myStateSize--; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java index c6ed79d3d028..bacee4bdeede 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java @@ -38,9 +38,9 @@ import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.keymap.Keymap; import com.intellij.openapi.keymap.KeymapManager; import com.intellij.openapi.keymap.KeymapUtil; -import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.progress.util.ProgressWrapper; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.util.IconLoader; @@ -189,38 +189,38 @@ public class LocalInspectionsPass extends ProgressableTextEditorHighlightingPass setProgressLimit(1L * tools.size() * elements.length); final LocalInspectionToolSession session = new LocalInspectionToolSession(myFile, myStartOffset, myEndOffset); + final ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); + LOG.assertTrue(indicator != null); JobUtil.invokeConcurrentlyUnderMyProgress(tools, new Processor() { public boolean process(final LocalInspectionTool tool) { final ProgressManager progressManager = ProgressManager.getInstance(); - try { - progressManager.checkCanceled(); + progressManager.checkCanceled(); + ProgressIndicator localIndicator = progressManager.getProgressIndicator(); - ApplicationManager.getApplication().assertReadAccessAllowed(); + ProgressIndicator original = ((ProgressWrapper)localIndicator).getOriginalProgressIndicator(); + LOG.assertTrue(original == indicator, original); - ProblemsHolder holder = new ProblemsHolder(iManager, myFile); - progressManager.checkCanceled(); - PsiElementVisitor elementVisitor = tool.buildVisitor(holder, isOnTheFly); - //noinspection ConstantConditions - if(elementVisitor == null) { - LOG.error("Tool " + tool + " must not return null from the buildVisitor() method"); - } - tool.inspectionStarted(session); - for (PsiElement element : elements) { - progressManager.checkCanceled(); - element.accept(elementVisitor); - } - tool.inspectionFinished(session); - advanceProgress(elements.length); + ApplicationManager.getApplication().assertReadAccessAllowed(); - if (holder.hasResults()) { - appendDescriptors(holder.getResults(), tool, ignoreSuppressed); - } - return true; + ProblemsHolder holder = new ProblemsHolder(iManager, myFile); + PsiElementVisitor elementVisitor = tool.buildVisitor(holder, isOnTheFly); + //noinspection ConstantConditions + if(elementVisitor == null) { + LOG.error("Tool " + tool + " must not return null from the buildVisitor() method"); } - catch (ProcessCanceledException e) { - return false; + tool.inspectionStarted(session); + for (PsiElement element : elements) { + progressManager.checkCanceled(); + element.accept(elementVisitor); } + tool.inspectionFinished(session); + advanceProgress(elements.length); + + if (holder.hasResults()) { + appendDescriptors(holder.getResults(), tool, ignoreSuppressed); + } + return true; } }, "Inspection tools"); diff --git a/platform/lang-impl/src/com/intellij/concurrency/JobUtil.java b/platform/lang-impl/src/com/intellij/concurrency/JobUtil.java index 94a2944adbf8..92e46f954181 100644 --- a/platform/lang-impl/src/com/intellij/concurrency/JobUtil.java +++ b/platform/lang-impl/src/com/intellij/concurrency/JobUtil.java @@ -66,9 +66,11 @@ public class JobUtil { job.scheduleAndWaitForResults(); } catch (RuntimeException e) { + job.cancel(); throw e; } catch (Throwable throwable) { + job.cancel(); LOG.error(throwable); } return !job.isCanceled(); diff --git a/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressWrapper.java b/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressWrapper.java index 8f6918cbd190..25a4e729a398 100644 --- a/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressWrapper.java +++ b/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressWrapper.java @@ -37,6 +37,10 @@ public class ProgressWrapper extends ProgressIndicatorBase { return myOriginal.isCanceled(); } + public ProgressIndicator getOriginalProgressIndicator() { + return myOriginal; + } + @Nullable public static ProgressWrapper wrap(@Nullable ProgressIndicator indicator) { return indicator == null ? null : new ProgressWrapper(indicator);