diff options
Diffstat (limited to 'platform/platform-impl/src/com/intellij/openapi/diff/impl/processing/TextCompareProcessor.java')
-rw-r--r-- | platform/platform-impl/src/com/intellij/openapi/diff/impl/processing/TextCompareProcessor.java | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/processing/TextCompareProcessor.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/processing/TextCompareProcessor.java index b2da49ef2008..e527964a5c0d 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/processing/TextCompareProcessor.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/processing/TextCompareProcessor.java @@ -23,8 +23,10 @@ import com.intellij.openapi.diff.impl.fragments.LineFragment; import com.intellij.openapi.diff.impl.highlighting.FragmentSide; import com.intellij.openapi.diff.impl.highlighting.LineBlockDivider; import com.intellij.openapi.diff.impl.highlighting.Util; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.diff.FilesTooBigForDiffException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -50,7 +52,9 @@ public class TextCompareProcessor { this(comparisonPolicy, DiffPolicy.LINES_WO_FORMATTING); } - public ArrayList<LineFragment> process(String text1, String text2) throws FilesTooBigForDiffException { + public ArrayList<LineFragment> process(@Nullable String text1, @Nullable String text2) throws FilesTooBigForDiffException { + text1 = StringUtil.notNullize(text1); + text2 = StringUtil.notNullize(text2); if (text1.isEmpty() || text2.isEmpty()) { return new DummyDiffFragmentsProcessor().process(text1, text2); } @@ -59,14 +63,22 @@ public class TextCompareProcessor { DiffFragment[] step1lineFragments = new DiffCorrection.TrueLineBlocks(myComparisonPolicy).correctAndNormalize(woFormattingBlocks); ArrayList<LineFragment> lineBlocks = new DiffFragmentsProcessor().process(step1lineFragments); + int badLinesCount = 0; if (mySearchForSubFragments) { for (LineFragment lineBlock : lineBlocks) { if (lineBlock.isOneSide() || lineBlock.isEqual()) continue; - String subText1 = lineBlock.getText(text1, FragmentSide.SIDE1); - String subText2 = lineBlock.getText(text2, FragmentSide.SIDE2); - ArrayList<LineFragment> subFragments = findSubFragments(subText1, subText2); - lineBlock.setChildren(new ArrayList<Fragment>(subFragments)); - lineBlock.adjustTypeFromChildrenTypes(); + try { + String subText1 = lineBlock.getText(text1, FragmentSide.SIDE1); + String subText2 = lineBlock.getText(text2, FragmentSide.SIDE2); + ArrayList<LineFragment> subFragments = findSubFragments(subText1, subText2); + lineBlock.setChildren(new ArrayList<Fragment>(subFragments)); + lineBlock.adjustTypeFromChildrenTypes(); + } + catch (FilesTooBigForDiffException ignore) { + // If we can't by-word compare two lines - this is not a reason to break entire diff. + badLinesCount++; + if (badLinesCount > FilesTooBigForDiffException.MAX_BAD_LINES) break; + } } } return lineBlocks; |