summaryrefslogtreecommitdiff
path: root/platform/platform-impl/src/com/intellij/openapi/diff/impl/processing/TextCompareProcessor.java
diff options
context:
space:
mode:
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.java24
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;