From 2df44a429367ef4f4de7acd25ca0bcccf3ac8247 Mon Sep 17 00:00:00 2001 From: Yaroslav Lepenkin Date: Thu, 2 Jul 2015 00:38:27 +0300 Subject: [PATCH] Reformat with context: collect all alignments from blocks, standing after reformatted range end, but before end of line. Say we renamed some method: xxx(a, xxxxxx(a, b) b) Because alignment "a" comes after modified xxx and before end of line, we collect it, and then mark all blocks with same alignment as NOT read only, so they can be realigned accordingly. So actual result will be: xxxxxx(a, b) --- .../formatting/InitialInfoBuilder.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/formatting/InitialInfoBuilder.java b/platform/lang-impl/src/com/intellij/formatting/InitialInfoBuilder.java index d5d7fa686665..b51bcf82f908 100644 --- a/platform/lang-impl/src/com/intellij/formatting/InitialInfoBuilder.java +++ b/platform/lang-impl/src/com/intellij/formatting/InitialInfoBuilder.java @@ -19,6 +19,7 @@ package com.intellij.formatting; import com.intellij.diagnostic.LogMessageEx; import com.intellij.lang.LanguageFormatting; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CodeStyleSettings; @@ -191,9 +192,8 @@ class InitialInfoBuilder { myCurrentWhiteSpace.append(blockStartOffset, myModel, myOptions); - boolean isInsideFormattingRanges = isInsideFormattingRanges(rootBlock, rootBlockIsRightBlock); if (myCollectAlignmentsInsideFormattingRange && rootBlock.getAlignment() != null - && isInsideFormattingRanges && !myInsideFormatRestrictingTag) + && isAffectedByFormatting(rootBlock) && !myInsideFormatRestrictingTag) { myAlignmentsInsideRangeToModify.add(rootBlock.getAlignment()); } @@ -386,9 +386,27 @@ class InitialInfoBuilder { } } - private boolean isInsideFormattingRanges(final Block block, boolean rootIsRightBlock) { + private boolean isAffectedByFormatting(final Block block) { if (myAffectedRanges == null) return true; - return !myAffectedRanges.isReadOnly(block.getTextRange(), rootIsRightBlock); + + List allRanges = myAffectedRanges.getRanges(); + Document document = myModel.getDocument(); + int docLength = document.getTextLength(); + + for (FormatTextRanges.FormatTextRange range : allRanges) { + int startOffset = range.getStartOffset(); + if (startOffset >= docLength) continue; + + int lineNumber = document.getLineNumber(startOffset); + int lineEndOffset = document.getLineEndOffset(lineNumber); + + int blockStartOffset = block.getTextRange().getStartOffset(); + if (blockStartOffset >= startOffset && blockStartOffset < lineEndOffset) { + return true; + } + } + + return false; } public Map getBlockToInfoMap() {