WI-863 HTML formatting in PHP files does not work

This commit is contained in:
Maxim.Mossienko
2010-01-15 22:19:01 +03:00
parent 5e2388ed5d
commit c8b2b7209d
3 changed files with 25 additions and 8 deletions
@@ -17,6 +17,7 @@ package com.intellij.formatting.templateLanguages;
import com.intellij.formatting.*;
import com.intellij.lang.ASTNode;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.formatter.FormatterUtil;
import com.intellij.psi.formatter.common.AbstractBlock;
import com.intellij.psi.tree.IElementType;
@@ -33,14 +34,24 @@ import java.util.List;
*/
public abstract class TemplateLanguageBlock extends AbstractBlock implements BlockWithParent {
private final TemplateLanguageBlockFactory myBlockFactory;
protected final CodeStyleSettings mySettings;
private List<DataLanguageBlockWrapper> myForeignChildren;
private boolean myChildrenBuilt = false;
private BlockWithParent myParent;
protected TemplateLanguageBlock(@NotNull TemplateLanguageBlockFactory blockFactory, @NotNull ASTNode node, @Nullable List<DataLanguageBlockWrapper> foreignChildren) {
super(node, null, null);
protected TemplateLanguageBlock(@NotNull TemplateLanguageBlockFactory blockFactory, @NotNull CodeStyleSettings settings,
@NotNull ASTNode node, @Nullable List<DataLanguageBlockWrapper> foreignChildren) {
this(node, null, null, blockFactory, settings, foreignChildren);
}
protected TemplateLanguageBlock(@NotNull ASTNode node, @Nullable Wrap wrap, @Nullable Alignment alignment,
@NotNull TemplateLanguageBlockFactory blockFactory,
@NotNull CodeStyleSettings settings,
@Nullable List<DataLanguageBlockWrapper> foreignChildren) {
super(node, wrap, alignment);
myBlockFactory = blockFactory;
myForeignChildren = foreignChildren;
mySettings = settings;
}
protected List<Block> buildChildren() {
@@ -51,8 +62,8 @@ public abstract class TemplateLanguageBlock extends AbstractBlock implements Blo
final ArrayList<TemplateLanguageBlock> tlChildren = new ArrayList<TemplateLanguageBlock>(5);
for (ASTNode childNode = getNode().getFirstChildNode(); childNode != null; childNode = childNode.getTreeNext()) {
if (FormatterUtil.containsWhiteSpacesOnly(childNode)) continue;
if (childNode.getElementType() != getTemplateTextElementType() || noForeignChildren()) {
final TemplateLanguageBlock childBlock = myBlockFactory.createTemplateLanguageBlock(childNode, null);
if (shouldBuildBlockFor(childNode)) {
final TemplateLanguageBlock childBlock = myBlockFactory.createTemplateLanguageBlock(childNode, null, mySettings);
childBlock.setParent(this);
tlChildren.add(childBlock);
}
@@ -62,6 +73,10 @@ public abstract class TemplateLanguageBlock extends AbstractBlock implements Blo
return BlockUtil.setParent(children, this);
}
protected boolean shouldBuildBlockFor(ASTNode childNode) {
return childNode.getElementType() != getTemplateTextElementType() || noForeignChildren();
}
private boolean noForeignChildren() {
return (myForeignChildren == null || myForeignChildren.isEmpty());
}
@@ -16,6 +16,7 @@
package com.intellij.formatting.templateLanguages;
import com.intellij.lang.ASTNode;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -27,5 +28,6 @@ import java.util.List;
* Time: 6:56:55 PM
*/
public interface TemplateLanguageBlockFactory {
TemplateLanguageBlock createTemplateLanguageBlock(@NotNull ASTNode node, @Nullable List<DataLanguageBlockWrapper> foreignChildren);
TemplateLanguageBlock createTemplateLanguageBlock(@NotNull ASTNode node, @Nullable List<DataLanguageBlockWrapper> foreignChildren,
@NotNull CodeStyleSettings codeStyleSettings);
}
@@ -44,7 +44,7 @@ public abstract class TemplateLanguageFormattingModelBuilder implements Delegati
@NotNull
public FormattingModel createModel(PsiElement element, CodeStyleSettings settings) {
final PsiFile file = element.getContainingFile();
Block rootBlock = getRootBlock(element, file.getViewProvider(), settings);
Block rootBlock = getRootBlock(file, file.getViewProvider(), settings);
return new DocumentBasedFormattingModel(rootBlock, element.getProject(), settings, file.getFileType(), file);
}
@@ -59,14 +59,14 @@ public abstract class TemplateLanguageFormattingModelBuilder implements Delegati
return createDummyBlock(node);
}
if (builder == null) {
return createTemplateLanguageBlock(node, Collections.<DataLanguageBlockWrapper>emptyList());
return createTemplateLanguageBlock(node, Collections.<DataLanguageBlockWrapper>emptyList(), null);
}
final FormattingModel model = builder.createModel(viewProvider.getPsi(dataLanguage), settings);
List<DataLanguageBlockWrapper> childWrappers = buildChildWrappers(model.getRootBlock());
if (childWrappers.size() == 1) {
childWrappers = buildChildWrappers(childWrappers.get(0).getOriginal());
}
return createTemplateLanguageBlock(node, filterBlocksByRange(childWrappers, node.getTextRange()));
return createTemplateLanguageBlock(node, filterBlocksByRange(childWrappers, node.getTextRange()), settings);
}
protected AbstractBlock createDummyBlock(final ASTNode node) {