diff --git a/platform/core-api/src/com/intellij/psi/codeStyle/ChangedRangesInfo.java b/platform/core-api/src/com/intellij/psi/codeStyle/ChangedRangesInfo.java index 1e848a3a0bcc..2a66a5ffeb65 100644 --- a/platform/core-api/src/com/intellij/psi/codeStyle/ChangedRangesInfo.java +++ b/platform/core-api/src/com/intellij/psi/codeStyle/ChangedRangesInfo.java @@ -15,7 +15,9 @@ */ package com.intellij.psi.codeStyle; +import com.intellij.openapi.util.Segment; import com.intellij.openapi.util.TextRange; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -23,12 +25,38 @@ import java.util.List; public class ChangedRangesInfo { - public final List insertedRanges; - public final List allChangedRanges; + private final List insertedRanges; + private final List allChangedRanges; public ChangedRangesInfo(@NotNull List allChangedRanges, @Nullable List insertedRanges) { this.insertedRanges = insertedRanges; this.allChangedRanges = allChangedRanges; } + + public List insertedRanges() { + return insertedRanges; + } + + public List optimizedChangedRanges() { + if (allChangedRanges.isEmpty()) return allChangedRanges; + allChangedRanges.sort(Segment.BY_START_OFFSET_THEN_END_OFFSET); + + List result = ContainerUtil.newSmartList(); + + TextRange prev = allChangedRanges.get(0); + for (TextRange next : allChangedRanges) { + if (next.getStartOffset() <= prev.getEndOffset() + 5) { + int newEndOffset = Math.max(prev.getEndOffset(), next.getEndOffset()); + prev = new TextRange(prev.getStartOffset(), newEndOffset); + } + else { + result.add(prev); + prev = next; + } + } + result.add(prev); + + return result; + } } diff --git a/platform/lang-impl/src/com/intellij/formatting/FormatTextRanges.java b/platform/lang-impl/src/com/intellij/formatting/FormatTextRanges.java index 824ffddfb0b5..a7901c34d394 100644 --- a/platform/lang-impl/src/com/intellij/formatting/FormatTextRanges.java +++ b/platform/lang-impl/src/com/intellij/formatting/FormatTextRanges.java @@ -39,8 +39,8 @@ public class FormatTextRanges implements FormattingRangesInfo { } public FormatTextRanges(@NotNull ChangedRangesInfo changedRangesInfo) { - changedRangesInfo.allChangedRanges.forEach((range) -> add(range, true)); - myInsertedRanges = changedRangesInfo.insertedRanges; + changedRangesInfo.optimizedChangedRanges().forEach((range) -> add(range, true)); + myInsertedRanges = changedRangesInfo.insertedRanges(); } public void add(TextRange range, boolean processHeadingWhitespace) { diff --git a/platform/platform-tests/testSrc/com/intellij/codeInsight/actions/MockCodeStyleManager.java b/platform/platform-tests/testSrc/com/intellij/codeInsight/actions/MockCodeStyleManager.java index c61547bb2593..19ec46d5f7fc 100644 --- a/platform/platform-tests/testSrc/com/intellij/codeInsight/actions/MockCodeStyleManager.java +++ b/platform/platform-tests/testSrc/com/intellij/codeInsight/actions/MockCodeStyleManager.java @@ -75,7 +75,7 @@ public class MockCodeStyleManager extends CodeStyleManager { @Override public void reformatTextWithContext(@NotNull PsiFile file, @NotNull ChangedRangesInfo ranges) throws IncorrectOperationException { - reformatText(file, ranges.allChangedRanges); + reformatText(file, ranges.optimizedChangedRanges()); } @NotNull diff --git a/platform/vcs-impl/src/com/intellij/codeInsight/actions/VcsAwareFormatChangedTextUtil.java b/platform/vcs-impl/src/com/intellij/codeInsight/actions/VcsAwareFormatChangedTextUtil.java index 73059dcc58eb..929a9e5e6a5c 100644 --- a/platform/vcs-impl/src/com/intellij/codeInsight/actions/VcsAwareFormatChangedTextUtil.java +++ b/platform/vcs-impl/src/com/intellij/codeInsight/actions/VcsAwareFormatChangedTextUtil.java @@ -48,7 +48,7 @@ class VcsAwareFormatChangedTextUtil extends FormatChangedTextUtil { @NotNull public List getChangedTextRanges(@NotNull Project project, @NotNull PsiFile file) throws FilesTooBigForDiffException { ChangedRangesInfo helper = getChangedRangesInfo(file); - return helper != null ? helper.allChangedRanges : ContainerUtil.newArrayList(); + return helper != null ? helper.optimizedChangedRanges() : ContainerUtil.newArrayList(); } @Override