custom language formatter intent problem


Hi, I've written a plugin for a custom language and I implement a simple formatting function. It works but has a little problem I dont' know how to fix it.

Here is the problem:

When I press the enter, it will go to a newline with eight spaces (sometimes four) wide extra indent. And my default indent is four spaces wide. Then I type any statement and format the code, the intent will back to normal. Why the newline will with extra intents?

Here is the Block class:

public class YJSBlock extends AbstractBlock {

private final SpacingBuilder spacingBuilder;

  protected YJSBlock(@NotNull ASTNode node,
                     @Nullable Wrap wrap,
                     @Nullable Alignment alignment,
                     SpacingBuilder spacingBuilder) {
    super(node, wrap, alignment);
    this.spacingBuilder = spacingBuilder;

protected List<Block> buildChildren() {
    List<Block> blocks = new ArrayList<>();
    ASTNode child = myNode.getFirstChildNode();
    while (child != null) {
    if (child.getElementType() != TokenType.WHITE_SPACE) {
Block block = new YJSBlock(child, null, null, spacingBuilder);
      child = child.getTreeNext();
    return blocks;

  public Indent getIndent() {
    if (isEmpty(myNode)) {
      return null;

    String parentType;
    if(myNode.getTreeParent() != null) {
      parentType = myNode.getTreeParent().getElementType().toString();
    } else {
      parentType = "";

    String firstChildType;
    if(myNode.getFirstChildNode() != null) {
      firstChildType = myNode.getFirstChildNode().getElementType().toString();
    } else {
      firstChildType = "";
  String type = myNode.getElementType().toString();

      return Indent.getNormalIndent();
      return Indent.getNormalIndent();
      return Indent.getNormalIndent();
    if(type.equals("statementList") && parentType.equals("block"))
      return Indent.getNormalIndent();
    if (type.equals("statement") && parentType.equals("ifStatement") && !firstChildType.equals("block"))
      return Indent .getNormalIndent();
    return Indent.getNoneIndent();

  public Spacing getSpacing(@Nullable Block child1, @NotNull Block child2) {
    return spacingBuilder.getSpacing(this, child1, child2);

  public boolean isLeaf() {
    return myNode.getFirstChildNode() == null;

  private static boolean isEmpty(ASTNode node) {
    return node.getElementType() == TokenType.WHITE_SPACE || node.getTextLength() == 0;
1 comment
Comment actions Permalink

Please take a look at Block.getChildAttributes() and adjust it to your needs.


Please sign in to leave a comment.