From 100905b9178bc2c45a6797cb9d479bc35b61493c Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Mon, 27 Dec 2010 16:13:35 +0300 Subject: [PATCH 1/8] Minor code optimization: use CollectionFactory.newSet(). --- .../lang/completion/GroovyCompletionUtil.java | 52 ++++--------------- 1 file changed, 9 insertions(+), 43 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java index 1f5848706e6a..7e59f69189ce 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java @@ -467,50 +467,16 @@ public class GroovyCompletionUtil { return TailType.insertChar(editor, offset, ')'); } - private static final Set COLLECTION_METHOD_NAMES = new HashSet(); - public static final Set OPERATOR_METHOD_NAMES = new HashSet(); - static { - COLLECTION_METHOD_NAMES.add("each"); - COLLECTION_METHOD_NAMES.add("eachWithIndex"); - COLLECTION_METHOD_NAMES.add("any"); - COLLECTION_METHOD_NAMES.add("every"); - COLLECTION_METHOD_NAMES.add("reverseEach"); - COLLECTION_METHOD_NAMES.add("collect"); - COLLECTION_METHOD_NAMES.add("collectAll"); - COLLECTION_METHOD_NAMES.add("find"); - COLLECTION_METHOD_NAMES.add("findAll"); - COLLECTION_METHOD_NAMES.add("retainAll"); - COLLECTION_METHOD_NAMES.add("removeAll"); - COLLECTION_METHOD_NAMES.add("split"); - COLLECTION_METHOD_NAMES.add("groupBy"); - COLLECTION_METHOD_NAMES.add("groupEntriesBy"); - COLLECTION_METHOD_NAMES.add("findLastIndexOf"); - COLLECTION_METHOD_NAMES.add("findIndexValues"); - COLLECTION_METHOD_NAMES.add("findIndexOf"); - - OPERATOR_METHOD_NAMES.add("plus"); - OPERATOR_METHOD_NAMES.add("minus"); - OPERATOR_METHOD_NAMES.add("multiply"); - OPERATOR_METHOD_NAMES.add("power"); - OPERATOR_METHOD_NAMES.add("div"); - OPERATOR_METHOD_NAMES.add("mod"); - OPERATOR_METHOD_NAMES.add("or"); - OPERATOR_METHOD_NAMES.add("and"); - OPERATOR_METHOD_NAMES.add("xor"); - OPERATOR_METHOD_NAMES.add("next"); - OPERATOR_METHOD_NAMES.add("previous"); - OPERATOR_METHOD_NAMES.add("getAt"); - OPERATOR_METHOD_NAMES.add("putAt"); - OPERATOR_METHOD_NAMES.add("leftShift"); - OPERATOR_METHOD_NAMES.add("rightShift"); - OPERATOR_METHOD_NAMES.add("isCase"); - OPERATOR_METHOD_NAMES.add("bitwiseNegate"); - OPERATOR_METHOD_NAMES.add("negative"); - OPERATOR_METHOD_NAMES.add("positive"); - } - - + private static final Set COLLECTION_METHOD_NAMES = CollectionFactory.newSet( + "each", "eachWithIndex", "any", "every", "reverseEach", "collect", "collectAll", "find", "findAll", "retainAll", "removeAll", "split", + "groupBy", "groupEntriesBy", "findLastIndexOf", "findIndexValues", "findIndexOf" + ); + public static final Set OPERATOR_METHOD_NAMES = CollectionFactory.newSet( + "plus", "minus", "multiply", "power", "div", "mod", "or", "and", "xor", "next", "previous", "getAt", "putAt", "leftShift", "rightShift", + "isCase", "bitwiseNegate", "negative", "positive" + ); + public static boolean skipDefGroovyMethod(GrGdkMethod gdkMethod, PsiSubstitutor substitutor, @Nullable PsiType type) { if (type == null) return false; String name = gdkMethod.getStaticMethod().getName(); From 0c106d02e319eb1e4e3a8cb269413175b33ef265 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Mon, 27 Dec 2010 16:20:39 +0300 Subject: [PATCH 2/8] Minor optimization of NonCodeMembersContributor. --- .../resolve/NonCodeMembersContributor.java | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/NonCodeMembersContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/NonCodeMembersContributor.java index 9fbe132b6955..f51989cd6f73 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/NonCodeMembersContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/NonCodeMembersContributor.java @@ -17,7 +17,6 @@ package org.jetbrains.plugins.groovy.lang.resolve; import com.intellij.openapi.extensions.ExtensionPointName; -import com.intellij.openapi.util.Ref; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiType; import com.intellij.psi.ResolveState; @@ -41,25 +40,33 @@ public abstract class NonCodeMembersContributor { PsiScopeProcessor processor, final GroovyPsiElement place, final ResolveState state) { - final Ref result = Ref.create(true); - final PsiScopeProcessor wrapper = new DelegatingScopeProcessor(processor) { - @Override - public boolean execute(PsiElement element, ResolveState state) { - if (!result.get()) { - return false; - } - final boolean wantMore = super.execute(element, state); - result.set(wantMore); - return wantMore; - } - }; + + MyDelegatingScopeProcessor delegatingProcessor = new MyDelegatingScopeProcessor(processor); + for (final NonCodeMembersContributor contributor : EP_NAME.getExtensions()) { - contributor.processDynamicElements(qualifierType, wrapper, place, state); - if (!result.get()) { + contributor.processDynamicElements(qualifierType, delegatingProcessor, place, state); + if (!delegatingProcessor.wantMore) { return false; } } return true; } + private static class MyDelegatingScopeProcessor extends DelegatingScopeProcessor { + public boolean wantMore = true; + + public MyDelegatingScopeProcessor(PsiScopeProcessor delegate) { + super(delegate); + } + + @Override + public boolean execute(PsiElement element, ResolveState state) { + if (!wantMore) { + return false; + } + wantMore = super.execute(element, state); + return wantMore; + } + } + } From baffc4c4bbd602986edbeb22e3b034b7feea5378 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 23 Dec 2010 15:51:56 +0300 Subject: [PATCH 3/8] assertion text --- .../com/intellij/psi/impl/PsiImplUtil.java | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/PsiImplUtil.java b/java/java-impl/src/com/intellij/psi/impl/PsiImplUtil.java index 1194e65945a6..7de349f9f2e5 100644 --- a/java/java-impl/src/com/intellij/psi/impl/PsiImplUtil.java +++ b/java/java-impl/src/com/intellij/psi/impl/PsiImplUtil.java @@ -128,12 +128,26 @@ public class PsiImplUtil { public static int getParameterIndex(@NotNull PsiParameter parameter, @NotNull PsiParameterList parameterList) { PsiParameter[] parameters = parameterList.getParameters(); + String name = parameter.getName(); + PsiParameter suspect = null; for (int i = 0; i < parameters.length; i++) { - if (parameter.equals(parameters[i])) return i; + PsiParameter paramInList = parameters[i]; + if (parameter.equals(paramInList)) return i; + if (name.equals(paramInList.getName())) { + suspect = paramInList; + } } - LOG.error("Parameter " + parameter + " not found among parameters: " + Arrays.asList(parameters)+ - ". parameterList' parent: "+parameterList.getParent()+"; parameter.getParent()==paramList: "+(parameter.getParent()==parameterList) - +"; "+parameterList.getClass() + "; parameter.isValid()="+parameter.isValid()+"; parameterList.isValid()= "+parameterList.isValid()); + String message = parameter + " not found among parameters: " + Arrays.asList(parameters) + "." + + " parameterList' parent: " + parameterList.getParent() + ";" + + " parameter.getParent()==paramList: " + (parameter.getParent() == parameterList) + ";" + + " " + parameterList.getClass() + ";" + + " parameter.isValid()=" + parameter.isValid() + ";" + + " parameterList.isValid()= " + parameterList.isValid() + ";" + + " parameter stub: "+(parameter instanceof StubBasedPsiElement ? ((StubBasedPsiElement)parameter).getStub() : "---") + ";" + + " suspect stub: "+(suspect instanceof StubBasedPsiElement ? ((StubBasedPsiElement)suspect).getStub() : suspect == null ? "-null-" : "---"+suspect.getClass()) + ";" + + "." + ; + LOG.error(message); return -1; } From e50fdab0e431c1e489c422b5091d94768355210d Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 23 Dec 2010 16:49:53 +0300 Subject: [PATCH 4/8] performance --- .../src/com/intellij/psi/impl/source/tree/TreeUtil.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/TreeUtil.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/TreeUtil.java index 173aed12cb63..3e4eda145434 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/TreeUtil.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/TreeUtil.java @@ -180,7 +180,7 @@ public class TreeUtil { } public static Pair findTopmostSiblingParents(ASTNode one, ASTNode two) { - if (one == two) return (Pair)Pair.create(null, null); + if (one == two) return Pair.create(null, null); LinkedList oneParents = new LinkedList(); LinkedList twoParents = new LinkedList(); @@ -199,11 +199,11 @@ public class TreeUtil { } while (one == two && one != null); - return new Pair(one, two); + return new Pair(one, two); } public static void clearCaches(@NotNull final TreeElement tree) { - tree.acceptTree(new RecursiveTreeElementWalkingVisitor() { + tree.acceptTree(new RecursiveTreeElementWalkingVisitor(false) { @Override protected void visitNode(final TreeElement element) { element.clearCaches(); From fb2c2fce5c0ce1d5ab2ed512dad359509f81d65c Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 27 Dec 2010 11:05:39 +0300 Subject: [PATCH 5/8] cleanup --- .../daemon/impl/DaemonListeners.java | 24 ++++----------- .../intellij/ide/todo/TodoConfiguration.java | 22 +++++++++----- .../src/com/intellij/ide/todo/TodoView.java | 7 +---- .../todo/configurable/TodoConfigurable.java | 19 ++++++------ .../application/impl/LaterInvocator.java | 29 +++++++++++-------- .../editor/ex/EditorEventMulticasterEx.java | 20 +++++++------ .../editor/impl/EditorFactoryImpl.java | 18 ++++++------ .../event/EditorEventMulticasterImpl.java | 21 +++++++++----- .../com/intellij/util/EventDispatcher.java | 13 +++++---- .../maven/utils/MavenMergingUpdateQueue.java | 14 ++++----- 10 files changed, 93 insertions(+), 94 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java index f47c0f942784..cfd6d91d0a49 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java @@ -82,17 +82,11 @@ import java.util.List; class DaemonListeners implements Disposable { private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.daemon.impl.DaemonListeners"); - private final EditorColorsListener myEditorColorsListener = new MyEditorColorsListener(); - private final PropertyChangeListener myTodoListener = new MyTodoListener(); - private final Project myProject; private final DaemonCodeAnalyzerImpl myDaemonCodeAnalyzer; - private final ModalityStateListener myModalityStateListener; private boolean myEscPressed; - private final ErrorStripeHandler myErrorStripeHandler; - private volatile boolean cutOperationJustHappened; private final EditorTracker myEditorTracker; @@ -208,9 +202,9 @@ class DaemonListeners implements Disposable { CommandProcessor.getInstance().addCommandListener(new MyCommandListener(), this); ApplicationListener applicationListener = new MyApplicationListener(); ApplicationManager.getApplication().addApplicationListener(applicationListener, this); - EditorColorsManager.getInstance().addEditorColorsListener(myEditorColorsListener); + EditorColorsManager.getInstance().addEditorColorsListener(new MyEditorColorsListener(),this); InspectionProfileManager.getInstance().addProfileChangeListener(new MyProfileChangeListener(), this); - TodoConfiguration.getInstance().addPropertyChangeListener(myTodoListener); + TodoConfiguration.getInstance().addPropertyChangeListener(new MyTodoListener(), this); ActionManagerEx.getInstanceEx().addAnActionListener(new MyAnActionListener(), this); VirtualFileManager.getInstance().addVirtualFileListener(new VirtualFileAdapter() { public void propertyChanged(VirtualFilePropertyEvent event) { @@ -242,8 +236,7 @@ class DaemonListeners implements Disposable { } }, this); - myErrorStripeHandler = new ErrorStripeHandler(myProject); - ((EditorEventMulticasterEx)eventMulticaster).addErrorStripeListener(myErrorStripeHandler); + ((EditorEventMulticasterEx)eventMulticaster).addErrorStripeListener(new ErrorStripeHandler(myProject), this); final NamedScopesHolder[] holders = NamedScopesHolder.getAllNamedScopeHolders(project); NamedScopesHolder.ScopeListener scopeListener = new NamedScopesHolder.ScopeListener() { @@ -255,7 +248,7 @@ class DaemonListeners implements Disposable { holder.addScopeListener(scopeListener); } - myModalityStateListener = new ModalityStateListener() { + ModalityStateListener modalityStateListener = new ModalityStateListener() { public void beforeModalityStateChanged(boolean entering) { // before showing dialog we are in non-modal context yet, and before closing dialog we are still in modal context boolean inModalContext = LaterInvocator.isInModalContext(); @@ -263,7 +256,7 @@ class DaemonListeners implements Disposable { myDaemonCodeAnalyzer.setUpdateByTimerEnabled(inModalContext); } }; - LaterInvocator.addModalityStateListener(myModalityStateListener); + LaterInvocator.addModalityStateListener(modalityStateListener,this); } static boolean isUnderIgnoredAction(Object action) { @@ -281,13 +274,6 @@ class DaemonListeners implements Disposable { } public void dispose() { - EditorEventMulticaster eventMulticaster = EditorFactory.getInstance().getEventMulticaster(); - - EditorColorsManager.getInstance().removeEditorColorsListener(myEditorColorsListener); - TodoConfiguration.getInstance().removePropertyChangeListener(myTodoListener); - - ((EditorEventMulticasterEx)eventMulticaster).removeErrorStripeListener(myErrorStripeHandler); - LaterInvocator.removeModalityStateListener(myModalityStateListener); } boolean canChangeFileSilently(PsiFileSystemItem file) { diff --git a/platform/lang-impl/src/com/intellij/ide/todo/TodoConfiguration.java b/platform/lang-impl/src/com/intellij/ide/todo/TodoConfiguration.java index 8bb5e7e4f698..3c0a2dedfa1e 100644 --- a/platform/lang-impl/src/com/intellij/ide/todo/TodoConfiguration.java +++ b/platform/lang-impl/src/com/intellij/ide/todo/TodoConfiguration.java @@ -16,6 +16,7 @@ package com.intellij.ide.todo; +import com.intellij.openapi.Disposable; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.util.InvalidDataException; @@ -55,7 +56,7 @@ public class TodoConfiguration implements ApplicationComponent, JDOMExternalizab /** * Invoked by reflection */ - TodoConfiguration(MessageBus messageBus) { + TodoConfiguration(@NotNull MessageBus messageBus) { myMessageBus = messageBus; resetToDefaultTodoPatterns(); } @@ -89,19 +90,21 @@ public class TodoConfiguration implements ApplicationComponent, JDOMExternalizab public void disposeComponent() { } + @NotNull public TodoPattern[] getTodoPatterns() { return myTodoPatterns; } - @NotNull public IndexPattern[] getIndexPatterns() { + @NotNull + public IndexPattern[] getIndexPatterns() { return myIndexPatterns; } - public void setTodoPatterns(TodoPattern[] todoPatterns) { + public void setTodoPatterns(@NotNull TodoPattern[] todoPatterns) { doSetTodoPatterns(todoPatterns, true); } - private void doSetTodoPatterns(TodoPattern[] todoPatterns, final boolean shouldNotifyIndices) { + private void doSetTodoPatterns(@NotNull TodoPattern[] todoPatterns, final boolean shouldNotifyIndices) { TodoPattern[] oldTodoPatterns = myTodoPatterns; IndexPattern[] oldIndexPatterns = myIndexPatterns; @@ -138,21 +141,24 @@ public class TodoConfiguration implements ApplicationComponent, JDOMExternalizab /** * @return all TodoFilters. */ + @NotNull public TodoFilter[] getTodoFilters() { return myTodoFilters; } - public void setTodoFilters(TodoFilter[] filters) { + public void setTodoFilters(@NotNull TodoFilter[] filters) { TodoFilter[] oldFilters = myTodoFilters; myTodoFilters = filters; myPropertyChangeMulticaster.getMulticaster().propertyChange(new PropertyChangeEvent(this, PROP_TODO_FILTERS, oldFilters, filters)); } - public void addPropertyChangeListener(PropertyChangeListener listener) { + public void addPropertyChangeListener(@NotNull PropertyChangeListener listener) { myPropertyChangeMulticaster.addListener(listener); } - - public void removePropertyChangeListener(PropertyChangeListener listener) { + public void addPropertyChangeListener(@NotNull PropertyChangeListener listener, @NotNull Disposable parentDisposable) { + myPropertyChangeMulticaster.addListener(listener,parentDisposable); + } + public void removePropertyChangeListener(@NotNull PropertyChangeListener listener) { myPropertyChangeMulticaster.removeListener(listener); } diff --git a/platform/lang-impl/src/com/intellij/ide/todo/TodoView.java b/platform/lang-impl/src/com/intellij/ide/todo/TodoView.java index 373a61a1dd93..31f5028634f6 100644 --- a/platform/lang-impl/src/com/intellij/ide/todo/TodoView.java +++ b/platform/lang-impl/src/com/intellij/ide/todo/TodoView.java @@ -94,12 +94,7 @@ public class TodoView implements PersistentStateComponent, Disposable { myVCSManager.addVcsListener(myVcsListener); final MyPropertyChangeListener myPropertyChangeListener = new MyPropertyChangeListener(); - TodoConfiguration.getInstance().addPropertyChangeListener(myPropertyChangeListener); - Disposer.register(this, new Disposable() { - public void dispose() { - TodoConfiguration.getInstance().removePropertyChangeListener(myPropertyChangeListener); - } - }); + TodoConfiguration.getInstance().addPropertyChangeListener(myPropertyChangeListener,this); MessageBusConnection connection = myProject.getMessageBus().connect(this); connection.subscribe(AppTopics.FILE_TYPES, new MyFileTypeListener()); diff --git a/platform/lang-impl/src/com/intellij/ide/todo/configurable/TodoConfigurable.java b/platform/lang-impl/src/com/intellij/ide/todo/configurable/TodoConfigurable.java index 5d49aba6c3e2..1dda57ca6f99 100644 --- a/platform/lang-impl/src/com/intellij/ide/todo/configurable/TodoConfigurable.java +++ b/platform/lang-impl/src/com/intellij/ide/todo/configurable/TodoConfigurable.java @@ -32,6 +32,7 @@ import com.intellij.ui.TableUtil; import com.intellij.ui.table.JBTable; import com.intellij.util.ui.Table; import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -85,8 +86,7 @@ public class TodoConfigurable extends BaseConfigurable implements SearchableConf if (initialPatterns.length != myPatterns.size()) { return true; } - for (int i = 0; i < initialPatterns.length; i++) { - TodoPattern initialPattern = initialPatterns[i]; + for (TodoPattern initialPattern : initialPatterns) { if (!myPatterns.contains(initialPattern)) { return true; } @@ -100,8 +100,7 @@ public class TodoConfigurable extends BaseConfigurable implements SearchableConf if (initialFilters.length != myFilters.size()) { return true; } - for (int i = 0; i < initialFilters.length; i++) { - TodoFilter initialFilter = initialFilters[i]; + for (TodoFilter initialFilter : initialFilters) { if (!myFilters.contains(initialFilter)) { return true; } @@ -391,7 +390,7 @@ public class TodoConfigurable extends BaseConfigurable implements SearchableConf } TodoPattern sourcePattern = myPatterns.get(selectedIndex); TodoPattern pattern = sourcePattern.clone(); - PatternDialog dialog = new PatternDialog(TodoConfigurable.this.myPanel, pattern); + PatternDialog dialog = new PatternDialog(myPanel, pattern); dialog.setTitle(IdeBundle.message("title.edit.todo.pattern")); dialog.show(); if (!dialog.isOK()) { @@ -459,6 +458,7 @@ public class TodoConfigurable extends BaseConfigurable implements SearchableConf return IdeBundle.message("title.todo"); } + @NotNull public String getHelpTopic() { return "preferences.toDoOptions"; } @@ -472,15 +472,15 @@ public class TodoConfigurable extends BaseConfigurable implements SearchableConf myPatterns.clear(); TodoConfiguration todoConfiguration = TodoConfiguration.getInstance(); TodoPattern[] patterns = todoConfiguration.getTodoPatterns(); - for (int i = 0; i < patterns.length; i++) { - myPatterns.add(patterns[i].clone()); + for (TodoPattern pattern : patterns) { + myPatterns.add(pattern.clone()); } myPatternsModel.fireTableDataChanged(); // Filters myFilters.clear(); TodoFilter[] filters = todoConfiguration.getTodoFilters(); - for (int i = 0; i < filters.length; i++) { - myFilters.add(filters[i].clone()); + for (TodoFilter filter : filters) { + myFilters.add(filter.clone()); } myFiltersModel.fireTableDataChanged(); // @@ -506,6 +506,7 @@ public class TodoConfigurable extends BaseConfigurable implements SearchableConf } } + @NotNull public String getId() { return getHelpTopic(); } diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java index 20cde5319e85..70390c10d3f6 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java @@ -16,6 +16,7 @@ package com.intellij.openapi.application.impl; import com.intellij.ide.IdeEventQueue; +import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.ModalityStateListener; @@ -84,15 +85,18 @@ public class LaterInvocator { private static final ArrayList ourForcedFlushQueue = new ArrayList(); - public static void addModalityStateListener(ModalityStateListener listener){ + public static void addModalityStateListener(@NotNull ModalityStateListener listener){ ourModalityStateMulticaster.addListener(listener); } + public static void addModalityStateListener(@NotNull ModalityStateListener listener, @NotNull Disposable parentDisposable){ + ourModalityStateMulticaster.addListener(listener,parentDisposable); + } - public static void removeModalityStateListener(ModalityStateListener listener){ + public static void removeModalityStateListener(@NotNull ModalityStateListener listener){ ourModalityStateMulticaster.removeListener(listener); } - static ModalityStateEx modalityStateForWindow(Window window){ + static ModalityStateEx modalityStateForWindow(@NotNull Window window){ int index = ourModalEntities.indexOf(window); if (index < 0){ Window owner = window.getOwner(); @@ -120,20 +124,20 @@ public class LaterInvocator { return new ModalityStateEx(result.toArray()); } - public static ActionCallback invokeLater(Runnable runnable) { + public static ActionCallback invokeLater(@NotNull Runnable runnable) { return invokeLater(runnable, Conditions.FALSE); } - public static ActionCallback invokeLater(Runnable runnable, @NotNull Condition expired) { + public static ActionCallback invokeLater(@NotNull Runnable runnable, @NotNull Condition expired) { ModalityState modalityState = ModalityState.defaultModalityState(); return invokeLater(runnable, modalityState, expired); } - public static ActionCallback invokeLater(Runnable runnable, @NotNull ModalityState modalityState) { + public static ActionCallback invokeLater(@NotNull Runnable runnable, @NotNull ModalityState modalityState) { return invokeLater(runnable, modalityState, Conditions.FALSE); } - public static ActionCallback invokeLater(Runnable runnable, @NotNull ModalityState modalityState, @NotNull Condition expired) { + public static ActionCallback invokeLater(@NotNull Runnable runnable, @NotNull ModalityState modalityState, @NotNull Condition expired) { final ActionCallback callback = new ActionCallback(); synchronized (LOCK) { ourQueue.add(new RunnableInfo(runnable, modalityState, expired, callback)); @@ -144,7 +148,7 @@ public class LaterInvocator { - public static void invokeAndWait(final Runnable runnable, @NotNull ModalityState modalityState) { + public static void invokeAndWait(@NotNull final Runnable runnable, @NotNull ModalityState modalityState) { LOG.assertTrue(!isDispatchThread()); final Semaphore semaphore = new Semaphore(); @@ -168,7 +172,7 @@ public class LaterInvocator { semaphore.waitFor(); } - public static void enterModal(Object modalEntity) { + public static void enterModal(@NotNull Object modalEntity) { if (!IS_TEST_MODE) { LOG.assertTrue(isDispatchThread(), "enterModal() should be invoked in event-dispatch thread"); } @@ -184,7 +188,7 @@ public class LaterInvocator { ourModalEntities.add(modalEntity); } - public static void leaveModal(Object modalEntity) { + public static void leaveModal(@NotNull Object modalEntity) { if (!IS_TEST_MODE) { LOG.assertTrue(isDispatchThread(), "leaveModal() should be invoked in event-dispatch thread"); } @@ -204,7 +208,7 @@ public class LaterInvocator { requestFlush(); } - private static void cleanupQueueForModal(final Object modalEntity) { + private static void cleanupQueueForModal(@NotNull final Object modalEntity) { synchronized (LOCK) { for (Iterator iterator = ourQueue.iterator(); iterator.hasNext();) { RunnableInfo runnableInfo = iterator.next(); @@ -233,6 +237,7 @@ public class LaterInvocator { requestFlush(); } + @NotNull public static Object[] getCurrentModalEntities() { if (!IS_TEST_MODE) { ApplicationManager.getApplication().assertIsDispatchThread(); @@ -300,7 +305,7 @@ public class LaterInvocator { private static final AtomicBoolean FLUSHER_SCHEDULED = new AtomicBoolean(false); private static final Object RUN_LOCK = new Object(); - static class FlushQueue implements Runnable { + private static class FlushQueue implements Runnable { private RunnableInfo myLastInfo; public void run() { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorEventMulticasterEx.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorEventMulticasterEx.java index b3da73fa9d02..047241620a1d 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorEventMulticasterEx.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorEventMulticasterEx.java @@ -15,21 +15,23 @@ */ package com.intellij.openapi.editor.ex; +import com.intellij.openapi.Disposable; import com.intellij.openapi.editor.event.EditorEventMulticaster; -import com.intellij.openapi.editor.event.DocumentListener; +import org.jetbrains.annotations.NotNull; import java.beans.PropertyChangeListener; public interface EditorEventMulticasterEx extends EditorEventMulticaster{ - void addErrorStripeListener(ErrorStripeListener listener); - void removeErrorStripeListener(ErrorStripeListener listener); + void addErrorStripeListener(@NotNull ErrorStripeListener listener); + void addErrorStripeListener(@NotNull ErrorStripeListener listener, @NotNull Disposable parentDisposable); + void removeErrorStripeListener(@NotNull ErrorStripeListener listener); - void addEditReadOnlyListener(EditReadOnlyListener listener); - void removeEditReadOnlyListener(EditReadOnlyListener listener); + void addEditReadOnlyListener(@NotNull EditReadOnlyListener listener); + void removeEditReadOnlyListener(@NotNull EditReadOnlyListener listener); - void addPropertyChangeListener(PropertyChangeListener listener); - void removePropertyChangeListener(PropertyChangeListener listener); + void addPropertyChangeListener(@NotNull PropertyChangeListener listener); + void removePropertyChangeListener(@NotNull PropertyChangeListener listener); - void addFocusChangeListner(FocusChangeListener listener); - void removeFocusChangeListner(FocusChangeListener listener); + void addFocusChangeListner(@NotNull FocusChangeListener listener); + void removeFocusChangeListner(@NotNull FocusChangeListener listener); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFactoryImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFactoryImpl.java index 5a7cf84cf03c..b0ddae33a4aa 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFactoryImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFactoryImpl.java @@ -17,6 +17,7 @@ package com.intellij.openapi.editor.impl; import com.intellij.injected.editor.DocumentWindow; import com.intellij.openapi.Disposable; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityStateListener; import com.intellij.openapi.application.impl.LaterInvocator; import com.intellij.openapi.diagnostic.Logger; @@ -51,13 +52,6 @@ public class EditorFactoryImpl extends EditorFactory { private final EventDispatcher myEditorFactoryEventDispatcher = EventDispatcher.create(EditorFactoryListener.class); private final ArrayList myEditors = new ArrayList(); private static final Key EDITOR_CREATOR = new Key("Editor creator"); - private final ModalityStateListener myModalityStateListener = new ModalityStateListener() { - public void beforeModalityStateChanged(boolean entering) { - for (Editor editor : myEditors) { - ((EditorImpl)editor).beforeModalityStateChanged(); - } - } - }; public EditorFactoryImpl(ProjectManager projectManager) { projectManager.addProjectManagerListener(new ProjectManagerAdapter() { @@ -77,7 +71,14 @@ public class EditorFactoryImpl extends EditorFactory { } public void initComponent() { - LaterInvocator.addModalityStateListener(myModalityStateListener); + ModalityStateListener myModalityStateListener = new ModalityStateListener() { + public void beforeModalityStateChanged(boolean entering) { + for (Editor editor : myEditors) { + ((EditorImpl)editor).beforeModalityStateChanged(); + } + } + }; + LaterInvocator.addModalityStateListener(myModalityStateListener, ApplicationManager.getApplication()); } public void validateEditorsAreReleased(Project project) { @@ -100,7 +101,6 @@ public class EditorFactoryImpl extends EditorFactory { } public void disposeComponent() { - LaterInvocator.removeModalityStateListener(myModalityStateListener); } @NotNull diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/event/EditorEventMulticasterImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/event/EditorEventMulticasterImpl.java index 7e4ce756bba1..0f9352dcb474 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/event/EditorEventMulticasterImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/event/EditorEventMulticasterImpl.java @@ -134,11 +134,16 @@ public class EditorEventMulticasterImpl implements EditorEventMulticasterEx { mySelectionMulticaster.removeListener(listener); } - public void addErrorStripeListener(ErrorStripeListener listener) { + public void addErrorStripeListener(@NotNull ErrorStripeListener listener) { myErrorStripeMulticaster.addListener(listener); } - public void removeErrorStripeListener(ErrorStripeListener listener) { + @Override + public void addErrorStripeListener(@NotNull ErrorStripeListener listener, @NotNull Disposable parentDisposable) { + myErrorStripeMulticaster.addListener(listener, parentDisposable); + } + + public void removeErrorStripeListener(@NotNull ErrorStripeListener listener) { myErrorStripeMulticaster.removeListener(listener); } @@ -150,27 +155,27 @@ public class EditorEventMulticasterImpl implements EditorEventMulticasterEx { myVisibleAreaMulticaster.removeListener(listener); } - public void addEditReadOnlyListener(EditReadOnlyListener listener) { + public void addEditReadOnlyListener(@NotNull EditReadOnlyListener listener) { myEditReadOnlyMulticaster.addListener(listener); } - public void removeEditReadOnlyListener(EditReadOnlyListener listener) { + public void removeEditReadOnlyListener(@NotNull EditReadOnlyListener listener) { myEditReadOnlyMulticaster.removeListener(listener); } - public void addPropertyChangeListener(PropertyChangeListener listener) { + public void addPropertyChangeListener(@NotNull PropertyChangeListener listener) { myPropertyChangeMulticaster.addListener(listener); } - public void removePropertyChangeListener(PropertyChangeListener listener) { + public void removePropertyChangeListener(@NotNull PropertyChangeListener listener) { myPropertyChangeMulticaster.removeListener(listener); } - public void addFocusChangeListner(FocusChangeListener listener) { + public void addFocusChangeListner(@NotNull FocusChangeListener listener) { myFocusChangeListenerMulticaster.addListener(listener); } - public void removeFocusChangeListner(FocusChangeListener listener) { + public void removeFocusChangeListner(@NotNull FocusChangeListener listener) { myFocusChangeListenerMulticaster.removeListener(listener); } diff --git a/platform/util/src/com/intellij/util/EventDispatcher.java b/platform/util/src/com/intellij/util/EventDispatcher.java index a09e67dea290..03aa542a246d 100644 --- a/platform/util/src/com/intellij/util/EventDispatcher.java +++ b/platform/util/src/com/intellij/util/EventDispatcher.java @@ -20,6 +20,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Disposer; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; @@ -37,11 +38,11 @@ public class EventDispatcher { private final List myListeners = ContainerUtil.createEmptyCOWList(); - public static EventDispatcher create(Class listenerClass) { + public static EventDispatcher create(@NotNull Class listenerClass) { return new EventDispatcher(listenerClass); } - private EventDispatcher(Class listenerClass) { + private EventDispatcher(@NotNull Class listenerClass) { InvocationHandler handler = new InvocationHandler() { @NonNls public Object invoke(Object proxy, final Method method, final Object[] args) throws Throwable { if (method.getDeclaringClass().getName().equals("java.lang.Object")) { @@ -75,6 +76,7 @@ public class EventDispatcher { ); } + @NotNull public T getMulticaster() { return myMulticaster; } @@ -102,11 +104,11 @@ public class EventDispatcher { } } - public void addListener(T listener) { + public void addListener(@NotNull T listener) { myListeners.add(listener); } - public void addListener(final T listener, Disposable parentDisposable) { + public void addListener(@NotNull final T listener, @NotNull Disposable parentDisposable) { addListener(listener); Disposer.register(parentDisposable, new Disposable() { public void dispose() { @@ -115,7 +117,7 @@ public class EventDispatcher { }); } - public void removeListener(T listener) { + public void removeListener(@NotNull T listener) { myListeners.remove(listener); } @@ -123,6 +125,7 @@ public class EventDispatcher { return !myListeners.isEmpty(); } + @NotNull public List getListeners() { return myListeners; } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenMergingUpdateQueue.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenMergingUpdateQueue.java index e553c7c2abfb..b1eaf4d53765 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenMergingUpdateQueue.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenMergingUpdateQueue.java @@ -16,9 +16,11 @@ package org.jetbrains.idea.maven.utils; import com.intellij.openapi.Disposable; -import com.intellij.openapi.application.*; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityStateListener; +import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.application.Result; import com.intellij.openapi.application.impl.LaterInvocator; -import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.editor.event.*; import com.intellij.openapi.project.DumbService; @@ -26,7 +28,6 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootEvent; import com.intellij.openapi.roots.ModuleRootListener; import com.intellij.openapi.roots.ProjectRootManager; -import com.intellij.openapi.util.Disposer; import com.intellij.util.messages.MessageBusConnection; import com.intellij.util.ui.update.MergingUpdateQueue; import com.intellij.util.ui.update.Update; @@ -140,15 +141,10 @@ public class MavenMergingUpdateQueue extends MergingUpdateQueue { } } }; - LaterInvocator.addModalityStateListener(listener); + LaterInvocator.addModalityStateListener(listener,MavenMergingUpdateQueue.this); if (MavenUtil.isInModalContext()) { suspend(); } - Disposer.register(MavenMergingUpdateQueue.this, new Disposable() { - public void dispose() { - LaterInvocator.removeModalityStateListener(listener); - } - }); } }); } From f3a1eae5df39e31cddd4b270a3d0b45d670a1b0c Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 27 Dec 2010 11:50:50 +0300 Subject: [PATCH 6/8] do not calc parameter name --- .../src/com/intellij/psi/impl/PsiImplUtil.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/PsiImplUtil.java b/java/java-impl/src/com/intellij/psi/impl/PsiImplUtil.java index 7de349f9f2e5..f0236b173a65 100644 --- a/java/java-impl/src/com/intellij/psi/impl/PsiImplUtil.java +++ b/java/java-impl/src/com/intellij/psi/impl/PsiImplUtil.java @@ -128,13 +128,18 @@ public class PsiImplUtil { public static int getParameterIndex(@NotNull PsiParameter parameter, @NotNull PsiParameterList parameterList) { PsiParameter[] parameters = parameterList.getParameters(); - String name = parameter.getName(); - PsiParameter suspect = null; for (int i = 0; i < parameters.length; i++) { PsiParameter paramInList = parameters[i]; if (parameter.equals(paramInList)) return i; + } + String name = parameter.getName(); + PsiParameter suspect = null; + int i; + for (i = parameters.length - 1; i >= 0; i--) { + PsiParameter paramInList = parameters[i]; if (name.equals(paramInList.getName())) { suspect = paramInList; + break; } } String message = parameter + " not found among parameters: " + Arrays.asList(parameters) + "." + @@ -144,11 +149,12 @@ public class PsiImplUtil { " parameter.isValid()=" + parameter.isValid() + ";" + " parameterList.isValid()= " + parameterList.isValid() + ";" + " parameter stub: "+(parameter instanceof StubBasedPsiElement ? ((StubBasedPsiElement)parameter).getStub() : "---") + ";" + + " suspect: " + suspect +" (index="+i+"); " + " suspect stub: "+(suspect instanceof StubBasedPsiElement ? ((StubBasedPsiElement)suspect).getStub() : suspect == null ? "-null-" : "---"+suspect.getClass()) + ";" + "." ; LOG.error(message); - return -1; + return i; } public static int getTypeParameterIndex(@NotNull PsiTypeParameter typeParameter, @NotNull PsiTypeParameterList typeParameterList) { From 709cc518d499f4f2b6cfbd145a13b18be9bf6a4d Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 27 Dec 2010 14:44:02 +0300 Subject: [PATCH 7/8] 'already disposed' in tests for ages --- .../vcs/changes/ChangeListManagerImpl.java | 2 +- .../vcs/impl/ProjectLevelVcsManagerImpl.java | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java index 9858ae25140c..4d4b52e1d338 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java @@ -1174,7 +1174,7 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec myRevisionsCache.minus(correctedPair); } }); - myRevisionsCache.minus(correctedPair); + //myRevisionsCache.minus(correctedPair); } }); } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java index 6cd0714ee643..6d74682125a5 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java @@ -227,7 +227,7 @@ public class ProjectLevelVcsManagerImpl extends ProjectLevelVcsManagerEx impleme return ApplicationManager.getApplication().runReadAction(new Computable() { @Nullable public AbstractVcs compute() { - if ((!ApplicationManager.getApplication().isUnitTestMode()) && (!myProject.isInitialized())) return null; + if (!ApplicationManager.getApplication().isUnitTestMode() && !myProject.isInitialized()) return null; if (myProject.isDisposed()) throw new ProcessCanceledException(); VirtualFile vFile = ChangesUtil.findValidParent(file); if (vFile != null) { @@ -270,6 +270,7 @@ public class ProjectLevelVcsManagerImpl extends ProjectLevelVcsManagerEx impleme return ApplicationManager.getApplication().runReadAction(new Computable() { @Nullable public VirtualFile compute() { + if (myProject.isDisposed()) return null; VirtualFile vFile = ChangesUtil.findValidParent(file); if (vFile != null) { return getVcsRootFor(vFile); @@ -294,7 +295,7 @@ public class ProjectLevelVcsManagerImpl extends ProjectLevelVcsManagerEx impleme } public void unregisterVcs(AbstractVcs vcs) { - if ((! ApplicationManager.getApplication().isUnitTestMode()) && (myMappings.haveActiveVcs(vcs.getName()))) { + if (! ApplicationManager.getApplication().isUnitTestMode() && myMappings.haveActiveVcs(vcs.getName())) { // unlikely LOG.warn("Active vcs '" + vcs.getName() + "' is being unregistered. Remove from mappings first."); } @@ -398,7 +399,7 @@ public void addMessageToConsoleWindow(final String message, final TextAttributes } public UpdateInfoTree showUpdateProjectInfo(UpdatedFiles updatedFiles, String displayActionName, ActionInfo actionInfo) { - if ((! myProject.isOpen()) || myProject.isDisposed()) return null; + if (! myProject.isOpen() || myProject.isDisposed()) return null; ContentManager contentManager = getContentManager(); if (contentManager == null) { return null; // content manager is made null during dispose; flag is set later @@ -447,7 +448,7 @@ public void addMessageToConsoleWindow(final String message, final TextAttributes public boolean hasExplicitMapping(final VirtualFile vFile) { final VcsDirectoryMapping mapping = myMappings.getMappingFor(vFile); - return mapping != null && (! mapping.isDefaultMapping()); + return mapping != null && ! mapping.isDefaultMapping(); } public void setDirectoryMapping(final String path, final String activeVcsName) { @@ -688,7 +689,7 @@ public void addMessageToConsoleWindow(final String message, final TextAttributes } public void fireDirectoryMappingsChanged() { - if (myProject.isOpen() && (! myProject.isDisposed())) { + if (myProject.isOpen() && ! myProject.isDisposed()) { myMappings.mappingsChanged(); } } @@ -723,8 +724,8 @@ public void addMessageToConsoleWindow(final String message, final TextAttributes public boolean isFileInContent(final VirtualFile vf) { final ExcludedFileIndex excludedIndex = ExcludedFileIndex.getInstance(myProject); - return (vf != null) && (excludedIndex.isInContent(vf) || isFileInBaseDir(vf) || vf.equals(myProject.getBaseDir()) || - hasExplicitMapping(vf) || isInDirectoryBasedRoot(vf)) && (! excludedIndex.isExcludedFile(vf)); + return vf != null && (excludedIndex.isInContent(vf) || isFileInBaseDir(vf) || vf.equals(myProject.getBaseDir()) || + hasExplicitMapping(vf) || isInDirectoryBasedRoot(vf)) && ! excludedIndex.isExcludedFile(vf); } private boolean isInDirectoryBasedRoot(final VirtualFile file) { @@ -734,7 +735,7 @@ public void addMessageToConsoleWindow(final String message, final TextAttributes final VirtualFile baseDir = myProject.getBaseDir(); if (baseDir == null) return false; final VirtualFile ideaDir = baseDir.findChild(Project.DIRECTORY_STORE_FOLDER); - return (ideaDir != null && ideaDir.isValid() && ideaDir.isDirectory() && VfsUtil.isAncestor(ideaDir, file, false)); + return ideaDir != null && ideaDir.isValid() && ideaDir.isDirectory() && VfsUtil.isAncestor(ideaDir, file, false); } return false; } From 446a2aa33fb8127a4e9dac559133622ecb5aee94 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 27 Dec 2010 14:53:07 +0300 Subject: [PATCH 8/8] do not show SOE after exception in tests --- .../daemon/impl/DaemonCodeAnalyzerImpl.java | 10 +++--- .../daemon/impl/PassExecutorService.java | 34 +++++++++++++++---- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java index 475cce0629b2..39b79c098343 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java @@ -197,16 +197,18 @@ public class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzer implements JDOMEx myPassExecutorService.submitPasses(Collections.singletonMap((FileEditor)textEditor, array), progress, Job.DEFAULT_PRIORITY); try { while (progress.isRunning()) { + try { if (progress.isCanceled() && progress.isRunning()) { // write action sneaked in the AWT. restart waitForTermination(); + Throwable savedException = PassExecutorService.getSavedException(progress); + if (savedException != null) throw savedException; return runPasses(file, document, textEditor, toIgnore, canChangeDocument,callbackWhileWaiting); } if (callbackWhileWaiting != null) { callbackWhileWaiting.run(); } progress.waitFor(100); - try { UIUtil.dispatchAllInvocationEvents(); } catch (RuntimeException e) { @@ -501,11 +503,7 @@ public class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzer implements JDOMEx if (!isOffsetInsideHighlightInfo(offset, info, includeFixRange)) return true; int compare = info.getSeverity().compareTo(minSeverity); - if (compare < 0) { - return true; - } - - return processor.process(info); + return compare < 0 || processor.process(info); } }); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java index f5a3ea49abaf..8616ed24c445 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java @@ -18,7 +18,6 @@ package com.intellij.codeInsight.daemon.impl; import com.intellij.codeHighlighting.HighlightingPass; import com.intellij.codeHighlighting.TextEditorHighlightingPass; -import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; import com.intellij.concurrency.Job; import com.intellij.concurrency.JobImpl; import com.intellij.concurrency.JobUtil; @@ -39,10 +38,9 @@ import com.intellij.openapi.progress.impl.ProgressManagerImpl; import com.intellij.openapi.project.DumbAwareRunnable; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.PsiDocumentManager; -import com.intellij.psi.PsiFile; import com.intellij.util.ConcurrencyUtil; import com.intellij.util.Consumer; import com.intellij.util.SmartList; @@ -299,10 +297,10 @@ public abstract class PassExecutorService implements Disposable { private final DaemonProgressIndicator myUpdateProgress; private ScheduledPass(@NotNull List fileEditors, - @NotNull TextEditorHighlightingPass pass, - @NotNull DaemonProgressIndicator progressIndicator, - @NotNull AtomicInteger threadsToStartCountdown, - int jobPriority) { + @NotNull TextEditorHighlightingPass pass, + @NotNull DaemonProgressIndicator progressIndicator, + @NotNull AtomicInteger threadsToStartCountdown, + int jobPriority) { myFileEditors = fileEditors; myPass = pass; myThreadsToStartCountdown = threadsToStartCountdown; @@ -312,6 +310,20 @@ public abstract class PassExecutorService implements Disposable { } public void run() { + try { + doRun(); + } + catch (RuntimeException e) { + saveException(e,myUpdateProgress); + throw e; + } + catch (Error e) { + saveException(e,myUpdateProgress); + throw e; + } + } + + private void doRun() { if (myUpdateProgress.isCanceled()) return; log(myUpdateProgress, myPass, "Started. "); @@ -479,4 +491,12 @@ public abstract class PassExecutorService implements Disposable { } } } + + private static final Key THROWABLE_KEY = Key.create("THROWABLE_KEY"); + private static void saveException(Throwable e, DaemonProgressIndicator indicator) { + indicator.putUserDataIfAbsent(THROWABLE_KEY, e); + } + public static Throwable getSavedException(DaemonProgressIndicator indicator) { + return indicator.getUserData(THROWABLE_KEY); + } }