diff --git a/platform/core-api/src/com/intellij/lang/folding/CompositeFoldingBuilder.java b/platform/core-api/src/com/intellij/lang/folding/CompositeFoldingBuilder.java index d80e6639a1dd..4fdc9bf64a06 100644 --- a/platform/core-api/src/com/intellij/lang/folding/CompositeFoldingBuilder.java +++ b/platform/core-api/src/com/intellij/lang/folding/CompositeFoldingBuilder.java @@ -18,12 +18,14 @@ package com.intellij.lang.folding; import com.intellij.lang.ASTNode; import com.intellij.openapi.editor.Document; -import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.project.DumbService; +import com.intellij.openapi.project.PossiblyDumbAware; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; @@ -38,7 +40,7 @@ import java.util.Set; * @see LanguageFolding * @since 9.0 */ -public class CompositeFoldingBuilder extends FoldingBuilderEx implements DumbAware { +public class CompositeFoldingBuilder extends FoldingBuilderEx implements PossiblyDumbAware { public static final Key FOLDING_BUILDER = new Key("FOLDING_BUILDER"); private final List myBuilders; @@ -56,7 +58,7 @@ public class CompositeFoldingBuilder extends FoldingBuilderEx implements DumbAwa final List descriptors = new ArrayList(); final Set rangesCoveredByDescriptors = ContainerUtil.newHashSet(); - for (FoldingBuilder builder : myBuilders) { + for (FoldingBuilder builder : DumbService.getInstance(root.getProject()).filterByDumbAwareness(myBuilders)) { for (FoldingDescriptor descriptor : LanguageFolding.buildFoldingDescriptors(builder, root, document, quick)) { if (rangesCoveredByDescriptors.add(descriptor.getRange())) { descriptor.getElement().putUserData(FOLDING_BUILDER, builder); @@ -71,24 +73,38 @@ public class CompositeFoldingBuilder extends FoldingBuilderEx implements DumbAwa @Override public String getPlaceholderText(@NotNull ASTNode node, @NotNull TextRange range) { final FoldingBuilder builder = node.getUserData(FOLDING_BUILDER); - return builder == null ? node.getText() : builder instanceof FoldingBuilderEx - ? ((FoldingBuilderEx)builder).getPlaceholderText(node, range) - : builder.getPlaceholderText(node); + return !mayUseBuilder(node, builder) ? node.getText() : + builder instanceof FoldingBuilderEx ? ((FoldingBuilderEx)builder).getPlaceholderText(node, range) + : builder.getPlaceholderText(node); } @Override public String getPlaceholderText(@NotNull ASTNode node) { final FoldingBuilder builder = node.getUserData(FOLDING_BUILDER); - return builder == null ? node.getText() : builder.getPlaceholderText(node); + return !mayUseBuilder(node, builder) ? node.getText() : builder.getPlaceholderText(node); } public boolean isCollapsedByDefault(@NotNull ASTNode node) { final FoldingBuilder builder = node.getUserData(FOLDING_BUILDER); - return builder != null && builder.isCollapsedByDefault(node); + return mayUseBuilder(node, builder) && builder.isCollapsedByDefault(node); + } + + private static boolean mayUseBuilder(@NotNull ASTNode node, @Nullable FoldingBuilder builder) { + return builder != null && (DumbService.isDumbAware(builder) || !DumbService.isDumb(node.getPsi().getProject())); } @Override public String toString() { return getClass().getSimpleName() + myBuilders; } + + @Override + public boolean isDumbAware() { + for (FoldingBuilder builder : myBuilders) { + if (DumbService.isDumbAware(builder)) { + return true; + } + } + return false; + } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/folding/impl/FoldingPolicy.java b/platform/lang-impl/src/com/intellij/codeInsight/folding/impl/FoldingPolicy.java index 945b754a004a..577a58d04d62 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/folding/impl/FoldingPolicy.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/folding/impl/FoldingPolicy.java @@ -19,13 +19,16 @@ package com.intellij.codeInsight.folding.impl; import com.intellij.lang.Language; import com.intellij.lang.folding.FoldingBuilder; import com.intellij.lang.folding.LanguageFolding; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class FoldingPolicy { + private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.folding.impl.FoldingPolicy"); private static final GenericElementSignatureProvider GENERIC_PROVIDER = new GenericElementSignatureProvider(); @@ -34,7 +37,13 @@ public class FoldingPolicy { public static boolean isCollapseByDefault(PsiElement element) { final Language lang = element.getLanguage(); final FoldingBuilder foldingBuilder = LanguageFolding.INSTANCE.forLanguage(lang); - return foldingBuilder != null && foldingBuilder.isCollapsedByDefault(element.getNode()); + try { + return foldingBuilder != null && foldingBuilder.isCollapsedByDefault(element.getNode()); + } + catch (IndexNotReadyException e) { + LOG.error(e); + return false; + } } @Nullable