Search in sources :

Example 1 with AbstractBlock

use of com.intellij.psi.formatter.common.AbstractBlock in project intellij-community by JetBrains.

the class AbstractSyntheticBlock method getLastNode.

private ASTNode getLastNode(final List<Block> subBlocks) {
    LOG.assertTrue(!subBlocks.isEmpty());
    final Block lastBlock = subBlocks.get(subBlocks.size() - 1);
    if (lastBlock instanceof AbstractBlock) {
        return ((AbstractBlock) lastBlock).getNode();
    } else {
        return getLastNode(lastBlock.getSubBlocks());
    }
}
Also used : AbstractBlock(com.intellij.psi.formatter.common.AbstractBlock) AbstractBlock(com.intellij.psi.formatter.common.AbstractBlock)

Example 2 with AbstractBlock

use of com.intellij.psi.formatter.common.AbstractBlock in project intellij-community by JetBrains.

the class AbstractSyntheticBlock method getFirstNode.

private ASTNode getFirstNode(final List<Block> subBlocks) {
    LOG.assertTrue(!subBlocks.isEmpty());
    final Block firstBlock = subBlocks.get(0);
    if (firstBlock instanceof AbstractBlock) {
        return ((AbstractBlock) firstBlock).getNode();
    } else {
        return getFirstNode(firstBlock.getSubBlocks());
    }
}
Also used : AbstractBlock(com.intellij.psi.formatter.common.AbstractBlock) AbstractBlock(com.intellij.psi.formatter.common.AbstractBlock)

Example 3 with AbstractBlock

use of com.intellij.psi.formatter.common.AbstractBlock in project intellij-community by JetBrains.

the class SyntheticBlock method getSpacing.

@Override
public Spacing getSpacing(Block child1, @NotNull Block child2) {
    if (child1 instanceof ReadOnlyBlock || child2 instanceof ReadOnlyBlock) {
        return Spacing.getReadOnlySpacing();
    }
    if (!(child1 instanceof AbstractXmlBlock) || !(child2 instanceof AbstractXmlBlock)) {
        return null;
    }
    ASTNode node1 = ((AbstractBlock) child1).getNode();
    ASTNode node2 = ((AbstractBlock) child2).getNode();
    IElementType type1 = node1.getElementType();
    IElementType type2 = node2.getElementType();
    if (type2 == XmlElementType.XML_COMMENT) {
        // Do not remove any spaces except extra blank lines
        return Spacing.createSpacing(0, Integer.MAX_VALUE, 0, true, myXmlFormattingPolicy.getKeepBlankLines());
    }
    if (type1 == XmlElementType.XML_COMMENT) {
        ASTNode prev = node1.getTreePrev();
        if (prev != null) {
            node1 = prev;
            type1 = prev.getElementType();
        }
    }
    boolean firstIsText = isTextFragment(node1);
    boolean secondIsText = isTextFragment(node2);
    if (((AbstractXmlBlock) child1).isPreserveSpace() && ((AbstractXmlBlock) child2).isPreserveSpace()) {
        return Spacing.getReadOnlySpacing();
    }
    if (type1 == XmlTokenType.XML_CDATA_START || type2 == XmlTokenType.XML_CDATA_END) {
        if (myXmlFormattingPolicy.getKeepWhiteSpacesInsideCDATA()) {
            return Spacing.getReadOnlySpacing();
        }
        if (type1 == XmlTokenType.XML_CDATA_START && type2 == XmlTokenType.XML_CDATA_END) {
            return Spacing.createSpacing(0, 0, 0, myXmlFormattingPolicy.getShouldKeepLineBreaks(), myXmlFormattingPolicy.getKeepBlankLines());
        }
        if (type1 == XmlTokenType.XML_CDATA_START && child2 instanceof AnotherLanguageBlockWrapper || type2 == XmlTokenType.XML_CDATA_END && child1 instanceof AnotherLanguageBlockWrapper) {
            return Spacing.createSpacing(0, 0, 1, myXmlFormattingPolicy.getShouldKeepLineBreaks(), 0);
        }
    }
    boolean firstIsTag = node1.getPsi() instanceof XmlTag && !firstIsText;
    boolean secondIsTag = node2.getPsi() instanceof XmlTag && !secondIsText;
    boolean firstIsEntityRef = isEntityRef(node1);
    boolean secondIsEntityRef = isEntityRef(node2);
    if ((secondIsText && isInlineTag(node1) || firstIsText && isInlineTag(node2)) && myXmlFormattingPolicy.isKeepSpacesAroundInlineTags()) {
        return Spacing.getReadOnlySpacing();
    }
    if (isSpaceInText(firstIsTag, secondIsTag, firstIsText, secondIsText) && keepWhiteSpaces()) {
        return Spacing.getReadOnlySpacing();
    }
    if (firstIsEntityRef || secondIsEntityRef) {
        return Spacing.createSafeSpacing(myXmlFormattingPolicy.getShouldKeepLineBreaks(), myXmlFormattingPolicy.getKeepBlankLines());
    }
    if (type1 == XmlElementType.XML_ATTRIBUTE && (type2 == XmlTokenType.XML_TAG_END || type2 == XmlTokenType.XML_EMPTY_ELEMENT_END)) {
        final PsiElement psi1 = node1.getPsi();
        if (psi1 instanceof XmlAttribute && myXmlFormattingPolicy.insertLineBreakAfterLastAttribute((XmlAttribute) psi1)) {
            return Spacing.createSpacing(0, 0, 1, myXmlFormattingPolicy.getShouldKeepLineBreaks(), myXmlFormattingPolicy.getKeepBlankLines());
        }
    }
    if (type2 == XmlTokenType.XML_EMPTY_ELEMENT_END && myXmlFormattingPolicy.addSpaceIntoEmptyTag()) {
        return Spacing.createSpacing(1, 1, 0, myXmlFormattingPolicy.getShouldKeepLineBreaks(), myXmlFormattingPolicy.getKeepBlankLines());
    }
    if (isXmlTagName(type1, type2)) {
        final int spaces = shouldAddSpaceAroundTagName(node1, node2) ? 1 : 0;
        return Spacing.createSpacing(spaces, spaces, 0, myXmlFormattingPolicy.getShouldKeepLineBreaks(), myXmlFormattingPolicy.getKeepBlankLines());
    }
    if (type2 == XmlElementType.XML_ATTRIBUTE) {
        int minLineFeeds = 0;
        if (type1 == XmlTokenType.XML_NAME) {
            final PsiElement psi2 = node2.getPsi();
            minLineFeeds = psi2 instanceof XmlAttribute && myXmlFormattingPolicy.insertLineBreakBeforeFirstAttribute((XmlAttribute) psi2) ? 1 : 0;
        }
        return Spacing.createSpacing(1, 1, minLineFeeds, myXmlFormattingPolicy.getShouldKeepLineBreaks(), myXmlFormattingPolicy.getKeepBlankLines());
    }
    if (((AbstractXmlBlock) child1).isTextElement() && ((AbstractXmlBlock) child2).isTextElement()) {
        return Spacing.createSafeSpacing(myXmlFormattingPolicy.getShouldKeepLineBreaksInText(), myXmlFormattingPolicy.getKeepBlankLines());
    }
    if (firstIsTag && insertLineFeedAfter((XmlTag) node1.getPsi())) {
        return Spacing.createSpacing(0, 0, 1, true, myXmlFormattingPolicy.getKeepBlankLines());
    }
    if ((firstIsText || firstIsTag) && secondIsTag) {
        //<tag/>text <tag/></tag>
        if (((AbstractXmlBlock) child2).insertLineBreakBeforeTag()) {
            return Spacing.createSpacing(0, Integer.MAX_VALUE, ((AbstractXmlBlock) child2).getBlankLinesBeforeTag() + 1, myXmlFormattingPolicy.getShouldKeepLineBreaks(), myXmlFormattingPolicy.getKeepBlankLines());
        } else if (((AbstractXmlBlock) child2).removeLineBreakBeforeTag()) {
            return Spacing.createSpacing(0, Integer.MAX_VALUE, 0, myXmlFormattingPolicy.getShouldKeepLineBreaks(), myXmlFormattingPolicy.getKeepBlankLines());
        }
    }
    final boolean saveSpacesBetweenTagAndText = myXmlFormattingPolicy.shouldSaveSpacesBetweenTagAndText() && child1.getTextRange().getEndOffset() < child2.getTextRange().getStartOffset();
    if (firstIsTag && secondIsText) {
        if (((AbstractXmlBlock) child1).isTextElement() || saveSpacesBetweenTagAndText) {
            return Spacing.createSafeSpacing(true, myXmlFormattingPolicy.getKeepBlankLines());
        } else {
            return Spacing.createSpacing(0, 0, 0, true, myXmlFormattingPolicy.getKeepBlankLines());
        }
    }
    if (firstIsText && secondIsTag) {
        //text-<tag/>
        if (((AbstractXmlBlock) child2).isTextElement() || saveSpacesBetweenTagAndText) {
            return Spacing.createSafeSpacing(true, myXmlFormattingPolicy.getKeepBlankLines());
        } else {
            return Spacing.createSpacing(0, 0, 0, true, myXmlFormattingPolicy.getKeepBlankLines());
        }
    }
    if (firstIsTag && secondIsTag) {
        //<tag/><tag/>
        return Spacing.createSpacing(0, Integer.MAX_VALUE, 0, true, myXmlFormattingPolicy.getKeepBlankLines());
    }
    return Spacing.createSpacing(0, Integer.MAX_VALUE, 0, myXmlFormattingPolicy.getShouldKeepLineBreaksInText(), myXmlFormattingPolicy.getKeepBlankLines());
}
Also used : IElementType(com.intellij.psi.tree.IElementType) XmlAttribute(com.intellij.psi.xml.XmlAttribute) ASTNode(com.intellij.lang.ASTNode) PsiElement(com.intellij.psi.PsiElement) AbstractBlock(com.intellij.psi.formatter.common.AbstractBlock) XmlTag(com.intellij.psi.xml.XmlTag)

Example 4 with AbstractBlock

use of com.intellij.psi.formatter.common.AbstractBlock in project intellij-community by JetBrains.

the class SyntheticCodeBlock method toString.

public String toString() {
    ASTNode treeNode = null;
    Block child = mySubBlocks.get(0);
    while (treeNode == null) {
        if (child instanceof AbstractBlock) {
            treeNode = ((AbstractBlock) child).getNode();
        } else if (child instanceof SyntheticCodeBlock) {
            child = ((SyntheticCodeBlock) child).mySubBlocks.get(0);
        } else {
            break;
        }
    }
    final TextRange textRange = getTextRange();
    if (treeNode != null) {
        PsiElement psi = treeNode.getPsi();
        if (psi != null) {
            PsiFile file = psi.getContainingFile();
            if (file != null) {
                return file.getText().subSequence(textRange.getStartOffset(), textRange.getEndOffset()) + " " + textRange;
            }
        }
    }
    return getClass().getName() + ": " + textRange;
}
Also used : ASTNode(com.intellij.lang.ASTNode) AbstractBlock(com.intellij.psi.formatter.common.AbstractBlock) TextRange(com.intellij.openapi.util.TextRange) PsiFile(com.intellij.psi.PsiFile) PsiElement(com.intellij.psi.PsiElement) AbstractBlock(com.intellij.psi.formatter.common.AbstractBlock)

Example 5 with AbstractBlock

use of com.intellij.psi.formatter.common.AbstractBlock in project intellij-community by JetBrains.

the class AbstractJavaBlock method isAfter.

protected boolean isAfter(final int newChildIndex, @NotNull final IElementType[] elementTypes) {
    if (newChildIndex == 0)
        return false;
    final Block previousBlock = getSubBlocks().get(newChildIndex - 1);
    if (!(previousBlock instanceof AbstractBlock))
        return false;
    final IElementType previousElementType = ((AbstractBlock) previousBlock).getNode().getElementType();
    for (IElementType elementType : elementTypes) {
        if (previousElementType == elementType)
            return true;
    }
    return false;
}
Also used : IElementType(com.intellij.psi.tree.IElementType) AbstractBlock(com.intellij.psi.formatter.common.AbstractBlock) AbstractBlock(com.intellij.psi.formatter.common.AbstractBlock)

Aggregations

AbstractBlock (com.intellij.psi.formatter.common.AbstractBlock)10 IElementType (com.intellij.psi.tree.IElementType)6 ASTNode (com.intellij.lang.ASTNode)5 TextRange (com.intellij.openapi.util.TextRange)2 PsiElement (com.intellij.psi.PsiElement)2 PsiFile (com.intellij.psi.PsiFile)2 Language (com.intellij.lang.Language)1 FileViewProvider (com.intellij.psi.FileViewProvider)1 DocumentBasedFormattingModel (com.intellij.psi.formatter.DocumentBasedFormattingModel)1 CompositeElement (com.intellij.psi.impl.source.tree.CompositeElement)1 XmlAttribute (com.intellij.psi.xml.XmlAttribute)1 XmlTag (com.intellij.psi.xml.XmlTag)1 List (java.util.List)1 NotNull (org.jetbrains.annotations.NotNull)1