diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java index e64ff40f5181..12d4f5b84b6d 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java @@ -1959,8 +1959,7 @@ public class CompileDriver { finally { CompilerUtil.refreshIOFiles(filesToRefresh); if (!generatedFiles.isEmpty()) { - DumbService.getInstance(myProject).waitForSmartMode(); - List vFiles = ApplicationManager.getApplication().runReadAction(new Computable>() { + List vFiles = DumbService.getInstance(myProject).runReadActionInSmartMode(new Computable>() { public List compute() { final ArrayList vFiles = new ArrayList(generatedFiles.size()); for (File generatedFile : generatedFiles) { @@ -2162,8 +2161,7 @@ public class CompileDriver { final List toProcess = new ArrayList(); final Set allUrls = new HashSet(); final IOException[] ex = {null}; - DumbService.getInstance(myProject).waitForSmartMode(); - ApplicationManager.getApplication().runReadAction(new Runnable() { + DumbService.getInstance(myProject).runReadActionInSmartMode(new Runnable() { public void run() { try { for (FileProcessingCompiler.ProcessingItem item : items) { diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/FileProcessingCompilerAdapterTask.java b/java/compiler/impl/src/com/intellij/compiler/impl/FileProcessingCompilerAdapterTask.java index 6cbb54b2151d..38468aa5b358 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/FileProcessingCompilerAdapterTask.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/FileProcessingCompilerAdapterTask.java @@ -64,11 +64,10 @@ public class FileProcessingCompilerAdapterTask implements CompileTask{ final List toProcess = new ArrayList(); final Ref ex = new Ref(null); - DumbService.getInstance(project).waitForSmartMode(); final FileProcessingCompilerStateCache cache = CompilerCacheManager.getInstance(project).getFileProcessingCompilerCache(myCompiler); final boolean isMake = context.isMake(); - ApplicationManager.getApplication().runReadAction(new Runnable() { + DumbService.getInstance(project).runReadActionInSmartMode(new Runnable() { public void run() { try { for (FileProcessingCompiler.ProcessingItem item : items) { diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/GenericCompilerRunner.java b/java/compiler/impl/src/com/intellij/compiler/impl/GenericCompilerRunner.java index 3cba0652e82d..36021fd098b8 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/GenericCompilerRunner.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/GenericCompilerRunner.java @@ -186,9 +186,8 @@ public class GenericCompilerRunner { final List> toProcess = new ArrayList>(); final THashSet keySet = new THashSet(new SourceItemHashingStrategy(compiler)); final Ref exception = Ref.create(null); - DumbService.getInstance(myProject).waitForSmartMode(); final Map sourceStates = new HashMap(); - ApplicationManager.getApplication().runReadAction(new Runnable() { + DumbService.getInstance(myProject).runReadActionInSmartMode(new Runnable() { @Override public void run() { try { diff --git a/java/compiler/impl/src/com/intellij/compiler/make/ChangedConstantsDependencyProcessor.java b/java/compiler/impl/src/com/intellij/compiler/make/ChangedConstantsDependencyProcessor.java index bd919a6099b9..ade40349bb47 100644 --- a/java/compiler/impl/src/com/intellij/compiler/make/ChangedConstantsDependencyProcessor.java +++ b/java/compiler/impl/src/com/intellij/compiler/make/ChangedConstantsDependencyProcessor.java @@ -24,7 +24,6 @@ import com.intellij.compiler.classParsing.FieldInfo; import com.intellij.compiler.impl.ExitException; import com.intellij.compiler.impl.ExitStatus; import com.intellij.lang.StdLanguages; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.compiler.CompileContext; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; @@ -73,9 +72,7 @@ public class ChangedConstantsDependencyProcessor { public void run() throws CacheCorruptedException, ExitException { final Ref _ex = new Ref(); final Ref exitException = new Ref(null); - DumbService.getInstance(myProject).waitForSmartMode(); // ensure running in smart mode - - ApplicationManager.getApplication().runReadAction(new Runnable() { + DumbService.getInstance(myProject).runReadActionInSmartMode(new Runnable() { public void run() { try { final String qName = myDependencyCache.resolve(myQName); diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsCompilerInstance.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsCompilerInstance.java index 1edb7743134e..d0c7c233a3f3 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsCompilerInstance.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsCompilerInstance.java @@ -151,12 +151,12 @@ public class ArtifactsCompilerInstance extends GenericCompilerInstance(myBuilderContext.getProcessingItems()); } diff --git a/platform/core-api/src/com/intellij/openapi/project/DumbService.java b/platform/core-api/src/com/intellij/openapi/project/DumbService.java index 9973b17fb5b1..f1dd96554199 100644 --- a/platform/core-api/src/com/intellij/openapi/project/DumbService.java +++ b/platform/core-api/src/com/intellij/openapi/project/DumbService.java @@ -19,7 +19,10 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.NotNullLazyKey; +import com.intellij.openapi.util.Ref; import com.intellij.util.messages.Topic; import org.jetbrains.annotations.NotNull; @@ -39,6 +42,7 @@ import java.util.List; * @author peter */ public abstract class DumbService { + private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.project.DumbService"); /** * @see com.intellij.openapi.project.Project#getMessageBus() @@ -62,6 +66,47 @@ public abstract class DumbService { public abstract void runWhenSmart(Runnable runnable); public abstract void waitForSmartMode(); + + public T runReadActionInSmartMode(final Computable r) { + final Ref result = new Ref(); + runReadActionInSmartMode(new Runnable() { + @Override + public void run() { + result.set(r.compute()); + } + }); + return result.get(); + } + + public void runReadActionInSmartMode(final Runnable r) { + while (true) { + waitForSmartMode(); + boolean success = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public Boolean compute() { + if (isDumb()) { + return false; + } + r.run(); + return true; + } + }); + if (success) break; + } + } + + public void repeatUntilPassesInSmartMode(final Runnable r) { + while (true) { + waitForSmartMode(); + try { + r.run(); + return; + } + catch (IndexNotReadyException e) { + LOG.info(e); + } + } + } /** * Invoke the runnable later on EventDispatchThread AND when IDEA isn't in dumb mode diff --git a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/pattern/compiler/AnnotationBasedInstrumentingCompiler.java b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/pattern/compiler/AnnotationBasedInstrumentingCompiler.java index bd8f724a1b63..a421f475dba7 100644 --- a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/pattern/compiler/AnnotationBasedInstrumentingCompiler.java +++ b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/pattern/compiler/AnnotationBasedInstrumentingCompiler.java @@ -72,9 +72,7 @@ public abstract class AnnotationBasedInstrumentingCompiler implements ClassInstr final Set result = new HashSet(); final PsiSearchHelper searchHelper = PsiSearchHelper.SERVICE.getInstance(context.getProject()); - DumbService.getInstance(project).waitForSmartMode(); - - ApplicationManager.getApplication().runReadAction(new Runnable() { + DumbService.getInstance(project).runReadActionInSmartMode(new Runnable() { public void run() { final String[] names = getAnnotationNames(project); for (String name : names) {