diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GroovyDslFileIndex.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GroovyDslFileIndex.java index 964b3de73f30..2391408ef384 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GroovyDslFileIndex.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GroovyDslFileIndex.java @@ -45,6 +45,7 @@ import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.PsiModificationTracker; import com.intellij.util.ExceptionUtil; import com.intellij.util.PathUtil; +import com.intellij.util.concurrency.Semaphore; import com.intellij.util.containers.ConcurrentMultiMap; import com.intellij.util.containers.MultiMap; import com.intellij.util.indexing.*; @@ -256,9 +257,22 @@ public class GroovyDslFileIndex extends ScalarIndexExtension { private static volatile List> ourStandardScripts; private static List> getStandardScripts() { - if (ourStandardScripts == null) { - synchronized (SCRIPTS_CACHE) { - if (ourStandardScripts == null) { + List> result = ourStandardScripts; + if (result != null) { + return result; + } + + final Semaphore semaphore = new Semaphore(); + semaphore.down(); + ourPool.execute(new Runnable() { + @SuppressWarnings("AssignmentToStaticFieldFromInstanceMethod") + @Override + public void run() { + if (ourStandardScripts != null) { + return; + } + + try { Set scriptFolders = new LinkedHashSet(); // perhaps a separate extension for that? for (GroovyFrameworkConfigNotification extension : GroovyFrameworkConfigNotification.EP_NAME.getExtensions()) { @@ -285,11 +299,28 @@ public class GroovyDslFileIndex extends ScalarIndexExtension { } } } - } ourStandardScripts = executors; } + catch (OutOfMemoryError e) { + stopGdsl = true; + throw e; + } + catch (NoClassDefFoundError e) { + stopGdsl = true; + throw e; + } + finally { + semaphore.up(); + } } + }); + + while (ourStandardScripts == null && !stopGdsl && !semaphore.waitFor(20)) { + ProgressManager.checkCanceled(); + } + if (stopGdsl) { + return Collections.emptyList(); } return ourStandardScripts; } @@ -307,18 +338,11 @@ public class GroovyDslFileIndex extends ScalarIndexExtension { List result = new ArrayList(); - try { - for (Pair pair : getStandardScripts()) { - result.add(new GroovyDslScript(project, null, pair.second, pair.first.getPath())); - } + for (Pair pair : getStandardScripts()) { + result.add(new GroovyDslScript(project, null, pair.second, pair.first.getPath())); } - catch (OutOfMemoryError e) { - stopGdsl = true; - throw e; - } - catch (NoClassDefFoundError e) { - stopGdsl = true; - throw e; + if (stopGdsl) { + return Result.create(Collections.emptyList()); } final LinkedBlockingQueue> queue =