boolean (@Nullable AbstractBlockWrapper block) { // We don't want to align block that doesn't start new line if it's not configured for 'by columns' alignment. if (!myAllowBackwardShift && block != null && !block.getWhiteSpace().containsLineFeeds()) { return false; } if (block != null) { AbstractBlockWrapper prevAlignBlock = myOffsetRespBlocksCalculator.getLeftRespNeighbor(block); if (!onDifferentLines(prevAlignBlock, block)) { return false; } //blocks are on different lines if (myAllowBackwardShift && myAnchor == Anchor.RIGHT && prevAlignBlock != null && prevAlignBlock.getWhiteSpace().containsLineFeeds() // {prevAlignBlock} starts new indent => can be moved ) { // extend block on position for right align prevAlignBlock = extendBlockFromStart(prevAlignBlock); AbstractBlockWrapper current = block; do { if (current.getStartOffset() < prevAlignBlock.getEndOffset()) { return false; //{prevAlignBlock{current}} | {current}{prevAlignBlock}, no new lines } if (current.getWhiteSpace().containsLineFeeds()) { break; // correct new line was found } else { AbstractBlockWrapper prev = current.getPreviousBlock(); if (prev != null) { prev = extendBlockFromEnd(prev); } current = prev; } } while (current != null); if (current == null) { return false; //root block is the top } } } return myParentAlignment == null || myParentAlignment.continueOffsetResponsibleBlockRetrieval(block); }