From 2f6fcabf0bd2e99d55198ae47a4cf68ae63bffc9 Mon Sep 17 00:00:00 2001 From: "Rustam.Vishnyakov" Date: Wed, 14 Apr 2010 16:34:22 +0400 Subject: [PATCH] Merged from 9.0.x (Maia) branch --- .../intellij/formatting/BlockDebugUtil.java | 80 +++++++++++++++++++ .../TemplateLanguageBlock.java | 6 +- .../TemplateLanguageBlockFactory.java | 5 +- ...emplateLanguageFormattingModelBuilder.java | 4 +- 4 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 platform/lang-impl/src/com/intellij/formatting/BlockDebugUtil.java diff --git a/platform/lang-impl/src/com/intellij/formatting/BlockDebugUtil.java b/platform/lang-impl/src/com/intellij/formatting/BlockDebugUtil.java new file mode 100644 index 000000000000..fc39a126d0a6 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/formatting/BlockDebugUtil.java @@ -0,0 +1,80 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.formatting; + +import com.intellij.formatting.templateLanguages.DataLanguageBlockWrapper; +import com.intellij.lang.ASTNode; +import com.intellij.psi.formatter.common.AbstractBlock; + +import java.io.PrintStream; +import java.util.List; + +/** + * Convenience utilities to print out various formatting blocks information. + * + * @author rvishnyakov + */ +public class BlockDebugUtil { + + /** + * Prints out a dump of nested formatting blocks. + * @param out The output stream. + * @param block The root block to start with. + */ + public static void dumpBlockTree(PrintStream out, Block block) { + out.println("--- BLOCK TREE DUMP ---"); + dumpBlockTree(out, block, ""); + out.println("--- END OF DUMP ---\n\n"); + } + + private static void dumpBlockTree(PrintStream out, Block block, String indent) { + if (block == null) return; + out.print(indent + block.getClass().getSimpleName()); + if (block.getIndent() != null) { + out.print(" " + block.getIndent()); + } + else { + out.print(" "); + } + if (block instanceof ASTBlock) { + ASTNode node = ((ASTBlock)block).getNode(); + if (node != null) { + out.print(" " + node.getElementType()); + String text = node.getText(); + int eolPos = text.indexOf('\n'); + if (eolPos > 0) { + text = text.substring(0, eolPos) + "..."; + } + out.print(" \"" + text + "\""); + } + } + System.out.println(); + List subBlocks = getSubBlocks(block); + if (subBlocks != null && subBlocks.size() > 0) { + out.println(indent + "{"); + for (Block child : subBlocks) { + dumpBlockTree(out, child, indent + " "); + } + out.println(indent + "}"); + } + } + + private static List getSubBlocks(Block root) { + if (root instanceof AbstractBlock) return ((AbstractBlock)root).getSubBlocks(); + if (root instanceof DataLanguageBlockWrapper) return ((DataLanguageBlockWrapper)root).getSubBlocks(); + return null; + } +} diff --git a/platform/lang-impl/src/com/intellij/formatting/templateLanguages/TemplateLanguageBlock.java b/platform/lang-impl/src/com/intellij/formatting/templateLanguages/TemplateLanguageBlock.java index 9970f478b51e..7d1575c24fb8 100644 --- a/platform/lang-impl/src/com/intellij/formatting/templateLanguages/TemplateLanguageBlock.java +++ b/platform/lang-impl/src/com/intellij/formatting/templateLanguages/TemplateLanguageBlock.java @@ -64,7 +64,7 @@ public abstract class TemplateLanguageBlock extends AbstractBlock implements Blo for (ASTNode childNode = getNode().getFirstChildNode(); childNode != null; childNode = childNode.getTreeNext()) { if (FormatterUtil.containsWhiteSpacesOnly(childNode)) continue; if (shouldBuildBlockFor(childNode)) { - final TemplateLanguageBlock childBlock = myBlockFactory.createTemplateLanguageBlock(childNode, null, mySettings); + final TemplateLanguageBlock childBlock = myBlockFactory.createTemplateLanguageBlock(childNode, createChildWrap(childNode), null, mySettings); childBlock.setParent(this); tlChildren.add(childBlock); } @@ -129,5 +129,9 @@ public abstract class TemplateLanguageBlock extends AbstractBlock implements Blo public boolean isRequiredRange(TextRange range) { return true; } + + protected Wrap createChildWrap(ASTNode child) { + return Wrap.createWrap(Wrap.NONE, false); + } } diff --git a/platform/lang-impl/src/com/intellij/formatting/templateLanguages/TemplateLanguageBlockFactory.java b/platform/lang-impl/src/com/intellij/formatting/templateLanguages/TemplateLanguageBlockFactory.java index 0a8d54c13f38..cecc32749d6b 100644 --- a/platform/lang-impl/src/com/intellij/formatting/templateLanguages/TemplateLanguageBlockFactory.java +++ b/platform/lang-impl/src/com/intellij/formatting/templateLanguages/TemplateLanguageBlockFactory.java @@ -15,6 +15,7 @@ */ package com.intellij.formatting.templateLanguages; +import com.intellij.formatting.Wrap; import com.intellij.lang.ASTNode; import com.intellij.psi.codeStyle.CodeStyleSettings; import org.jetbrains.annotations.NotNull; @@ -28,6 +29,8 @@ import java.util.List; * Time: 6:56:55 PM */ public interface TemplateLanguageBlockFactory { - TemplateLanguageBlock createTemplateLanguageBlock(@NotNull ASTNode node, @Nullable List foreignChildren, + TemplateLanguageBlock createTemplateLanguageBlock(@NotNull ASTNode node, + @Nullable Wrap wrap, + @Nullable List foreignChildren, @NotNull CodeStyleSettings codeStyleSettings); } diff --git a/platform/lang-impl/src/com/intellij/formatting/templateLanguages/TemplateLanguageFormattingModelBuilder.java b/platform/lang-impl/src/com/intellij/formatting/templateLanguages/TemplateLanguageFormattingModelBuilder.java index 5f4845f699f8..da82a98880f3 100644 --- a/platform/lang-impl/src/com/intellij/formatting/templateLanguages/TemplateLanguageFormattingModelBuilder.java +++ b/platform/lang-impl/src/com/intellij/formatting/templateLanguages/TemplateLanguageFormattingModelBuilder.java @@ -59,14 +59,14 @@ public abstract class TemplateLanguageFormattingModelBuilder implements Delegati return createDummyBlock(node); } if (builder == null) { - return createTemplateLanguageBlock(node, Collections.emptyList(), settings); + return createTemplateLanguageBlock(node, Wrap.createWrap(WrapType.NONE, false), Collections.emptyList(), settings); } final FormattingModel model = builder.createModel(viewProvider.getPsi(dataLanguage), settings); List childWrappers = buildChildWrappers(model.getRootBlock()); if (childWrappers.size() == 1) { childWrappers = buildChildWrappers(childWrappers.get(0).getOriginal()); } - return createTemplateLanguageBlock(node, filterBlocksByRange(childWrappers, node.getTextRange()), settings); + return createTemplateLanguageBlock(node, Wrap.createWrap(WrapType.NONE, false), filterBlocksByRange(childWrappers, node.getTextRange()), settings); } protected AbstractBlock createDummyBlock(final ASTNode node) {