From 607a502fd7afdb55adcc1955bb919bf1d87c7e23 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 24 Aug 2012 11:16:40 +0400 Subject: [PATCH] Capture indicator value before moving to another thread --- .../highlighter/DeclarationHintSupport.java | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/DeclarationHintSupport.java b/idea/src/org/jetbrains/jet/plugin/highlighter/DeclarationHintSupport.java index d80ba7b0bd5..6804982ef83 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/DeclarationHintSupport.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/DeclarationHintSupport.java @@ -117,12 +117,7 @@ public class DeclarationHintSupport extends AbstractProjectComponent { lastIndicator = new ProgressIndicatorBase(); // Move long resolve operation to another thread - ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { - @Override - public void run() { - searchResolvedDescriptor(jetFile, declaration, editor, lastIndicator); - } - }); + searchResolvedDescriptor(jetFile, declaration, editor, lastIndicator); } else { // Mouse moved out of the declaration - can stop search for descriptor @@ -187,31 +182,38 @@ public class DeclarationHintSupport extends AbstractProjectComponent { | HintManager.HIDE_BY_SCROLLING | HintManager.HIDE_BY_OTHER_HINT | HintManager.HIDE_BY_MOUSEOVER, 0, false); } - // Executed in Thread Pool + // Moves execution from GUI thread to thread pool thread private void searchResolvedDescriptor( @NotNull final JetFile jetFile, @NotNull final JetNamedDeclaration declaration, @NotNull final Editor editor, @NotNull final ProgressIndicator indicator ) { - runWithWriteActionPriority(indicator, new Runnable() { + ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { @Override public void run() { - DeclarationDescriptor descriptor = null; - try { - BindingContext bindingContext = WholeProjectAnalyzerFacade.analyzeProjectWithCacheOnAFile(jetFile).getBindingContext(); - descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration); - } - finally { - // Back to GUI thread for submitting result - final DeclarationDescriptor finalDescriptor = descriptor; - ApplicationManager.getApplication().invokeLater(new Runnable() { - @Override - public void run() { - onDescriptorReady(finalDescriptor, declaration, editor, jetFile, indicator); + runWithWriteActionPriority(indicator, new Runnable() { + @Override + public void run() { + // Executed in the thread from Thread Pool + DeclarationDescriptor descriptor = null; + try { + BindingContext bindingContext = + WholeProjectAnalyzerFacade.analyzeProjectWithCacheOnAFile(jetFile).getBindingContext(); + descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration); } - }); - } + finally { + // Back to GUI thread for submitting result + final DeclarationDescriptor finalDescriptor = descriptor; + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + onDescriptorReady(finalDescriptor, declaration, editor, jetFile, indicator); + } + }); + } + } + }); } }); } @@ -219,11 +221,11 @@ public class DeclarationHintSupport extends AbstractProjectComponent { /** * Execute action with immediate stop when write lock is required. * - * @see ProgressIndicatorUtils.runWithWriteActionPriority(); - * * @param indicator * @param action + * @see ProgressIndicatorUtils.runWithWriteActionPriority(); */ + @SuppressWarnings("JavadocReference") private void runWithWriteActionPriority(final ProgressIndicator indicator, final Runnable action) { // Executed in Thread Pool final ApplicationAdapter listener = new ApplicationAdapter() { @@ -235,7 +237,7 @@ public class DeclarationHintSupport extends AbstractProjectComponent { final Application application = ApplicationManager.getApplication(); try { application.addApplicationListener(listener); - ProgressManager.getInstance().runProcess(new Runnable(){ + ProgressManager.getInstance().runProcess(new Runnable() { @Override public void run() { application.runReadAction(action);