From 3972b9b3d4e03bdb5e62dfa663e3e0a1871e3c9f Mon Sep 17 00:00:00 2001 From: Yaroslav Lepenkin Date: Thu, 11 Jun 2015 17:12:40 +0300 Subject: [PATCH] [Formatter] Provided ability to skip building injected blocks by setting AbstractBlock "myBuildInjectedBlocks" flag. [JavaFormatter] If this flag is set no "InjectedLanguageUtil.hasInjections" check will be performed, which dramatically improves performance of formatter-based indent detector. --- .../psi/formatter/java/AbstractJavaBlock.java | 3 ++- .../FormatterBasedLineIndentInfoBuilder.java | 1 + .../psi/formatter/common/AbstractBlock.java | 21 +++++++++++++++++-- .../common}/NewLineBlocksIterator.java | 7 ++++++- 4 files changed, 28 insertions(+), 4 deletions(-) rename platform/lang-impl/src/com/intellij/psi/{codeStyle/autodetect => formatter/common}/NewLineBlocksIterator.java (93%) diff --git a/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java b/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java index deaf90cb82b0..fff50d1c41ab 100644 --- a/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java +++ b/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java @@ -176,7 +176,8 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo if (isStatement(child, child.getTreeParent())) { return new CodeBlockBlock(child, wrap, alignment, actualIndent, settings, javaSettings); } - if (child instanceof PsiComment && + if (isBuildInjectedBlocks() && + child instanceof PsiComment && child instanceof PsiLanguageInjectionHost && InjectedLanguageUtil.hasInjections((PsiLanguageInjectionHost)child)) { return new CommentWithInjectionBlock(child, wrap, alignment, indent, settings, javaSettings); diff --git a/platform/lang-impl/src/com/intellij/psi/codeStyle/autodetect/FormatterBasedLineIndentInfoBuilder.java b/platform/lang-impl/src/com/intellij/psi/codeStyle/autodetect/FormatterBasedLineIndentInfoBuilder.java index 1bba6b022535..13a57cb3abfb 100644 --- a/platform/lang-impl/src/com/intellij/psi/codeStyle/autodetect/FormatterBasedLineIndentInfoBuilder.java +++ b/platform/lang-impl/src/com/intellij/psi/codeStyle/autodetect/FormatterBasedLineIndentInfoBuilder.java @@ -24,6 +24,7 @@ import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.intellij.psi.formatter.common.NewLineBlocksIterator; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.text.CharArrayUtil; diff --git a/platform/lang-impl/src/com/intellij/psi/formatter/common/AbstractBlock.java b/platform/lang-impl/src/com/intellij/psi/formatter/common/AbstractBlock.java index 726006defceb..d74cffa32d07 100644 --- a/platform/lang-impl/src/com/intellij/psi/formatter/common/AbstractBlock.java +++ b/platform/lang-impl/src/com/intellij/psi/formatter/common/AbstractBlock.java @@ -37,8 +37,10 @@ public abstract class AbstractBlock implements ASTBlock { @NotNull protected final ASTNode myNode; @Nullable protected final Wrap myWrap; @Nullable protected final Alignment myAlignment; - private List mySubBlocks; - private Boolean myIncomplete; + + private List mySubBlocks; + private Boolean myIncomplete; + private boolean myBuildInjectedBlocks = true; protected AbstractBlock(@NotNull ASTNode node, @Nullable Wrap wrap, @Nullable Alignment alignment) { myNode = node; @@ -66,8 +68,23 @@ public abstract class AbstractBlock implements ASTBlock { return mySubBlocks; } + /** + * Prevents from building injected blocks, which allows to build blocks faster + * Initially was made for formatting-based indent detector + */ + protected void setBuildInjectedBlocks(boolean value) { + myBuildInjectedBlocks = value; + } + + protected boolean isBuildInjectedBlocks() { + return myBuildInjectedBlocks; + } + @NotNull private List buildInjectedBlocks() { + if (!myBuildInjectedBlocks) { + return EMPTY; + } if (!(this instanceof SettingsAwareBlock)) { return EMPTY; } diff --git a/platform/lang-impl/src/com/intellij/psi/codeStyle/autodetect/NewLineBlocksIterator.java b/platform/lang-impl/src/com/intellij/psi/formatter/common/NewLineBlocksIterator.java similarity index 93% rename from platform/lang-impl/src/com/intellij/psi/codeStyle/autodetect/NewLineBlocksIterator.java rename to platform/lang-impl/src/com/intellij/psi/formatter/common/NewLineBlocksIterator.java index 9bc7a32a5174..9ec55edcb104 100644 --- a/platform/lang-impl/src/com/intellij/psi/codeStyle/autodetect/NewLineBlocksIterator.java +++ b/platform/lang-impl/src/com/intellij/psi/formatter/common/NewLineBlocksIterator.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.intellij.psi.codeStyle.autodetect; +package com.intellij.psi.formatter.common; import com.intellij.formatting.Block; import com.intellij.openapi.editor.Document; @@ -91,6 +91,11 @@ public class NewLineBlocksIterator implements Iterator { } private void pushAll(Block current) { + if (current instanceof AbstractBlock) { + //building blocks as fast as possible + ((AbstractBlock)current).setBuildInjectedBlocks(false); + } + List blocks = current.getSubBlocks(); Collections.reverse(blocks); for (Block block : blocks) {