diff: avoid trimmable blocks in one-step comparison

This commit is contained in:
Aleksey Pivovarov
2015-10-28 14:42:35 +03:00
parent 48d02befd6
commit 5e936c2b07
3 changed files with 29 additions and 14 deletions
@@ -15,7 +15,7 @@
*/
package com.intellij.diff.comparison;
import com.intellij.diff.comparison.iterables.DiffIterableUtil.TrimChangeBuilder;
import com.intellij.diff.comparison.iterables.DiffIterableUtil.*;
import com.intellij.diff.comparison.iterables.FairDiffIterable;
import com.intellij.diff.fragments.LineFragment;
import com.intellij.diff.fragments.LineFragmentImpl;
@@ -38,8 +38,7 @@ import java.util.List;
import static com.intellij.diff.comparison.TrimUtil.trimEnd;
import static com.intellij.diff.comparison.TrimUtil.trimStart;
import static com.intellij.diff.comparison.iterables.DiffIterableUtil.diff;
import static com.intellij.diff.comparison.iterables.DiffIterableUtil.fair;
import static com.intellij.diff.comparison.iterables.DiffIterableUtil.*;
import static com.intellij.openapi.util.text.StringUtil.isWhiteSpace;
public class ByLine {
@@ -55,6 +54,7 @@ public class ByLine {
FairDiffIterable changes = compareSmart(lines1, lines2, indicator);
changes = optimizeLineChunks(lines1, lines2, changes, indicator);
changes = expandRanges(lines1, lines2, changes, indicator);
return convertIntoFragments(lines1, lines2, changes);
}
@@ -141,7 +141,7 @@ public class ByLine {
* c. match equal lines using result of the previous step
*/
final TrimChangeBuilder builder = new TrimChangeBuilder(lines1, lines2);
final ExpandChangeBuilder builder = new ExpandChangeBuilder(lines1, lines2);
new Object() {
private CharSequence sample = null;
private int last1 = -1;
@@ -367,6 +367,21 @@ public class ByLine {
return Pair.create(bigLines, indexes);
}
@NotNull
private static FairDiffIterable expandRanges(@NotNull List<Line> lines1,
@NotNull List<Line> lines2,
@NotNull FairDiffIterable iterable,
@NotNull ProgressIndicator indicator) {
List<Range> changes = new ArrayList<Range>();
for (Range ch : iterable.iterateChanges()) {
Range expanded = TrimUtil.expand(lines1, lines2, ch.start1, ch.start2, ch.end1, ch.end2);
if (!expanded.isEmpty()) changes.add(expanded);
}
return fair(create(changes, lines1.size(), lines2.size()));
}
//
// Lines
//
@@ -336,11 +336,11 @@ public class DiffIterableUtil {
}
}
public static class TrimChangeBuilder extends ChangeBuilder {
public static class ExpandChangeBuilder extends ChangeBuilder {
@NotNull private final List<?> myObjects1;
@NotNull private final List<?> myObjects2;
public TrimChangeBuilder(@NotNull List<?> objects1, @NotNull List<?> objects2) {
public ExpandChangeBuilder(@NotNull List<?> objects1, @NotNull List<?> objects2) {
super(objects1.size(), objects2.size());
myObjects1 = objects1;
myObjects2 = objects2;
@@ -311,6 +311,14 @@ class LineComparisonUtilTest : ComparisonUtilTestBase() {
}
}
fun `test regression - can trim chunks after 'optimizeLineChunks'`() {
lines {
("A=====_ B=====_ }_}_B=====_" - "A=====_ }_}_B=====_")
default(del(1, 1, 1))
testAll()
}
}
fun `test bad cases caused by 'compareTwoStep' logic`() {
lines {
("x_!" - "!_x_y")
@@ -339,14 +347,6 @@ class LineComparisonUtilTest : ComparisonUtilTestBase() {
}
fun `test bad cases caused by 'compareSmart' logic`() {
lines {
("A=====_ B=====_ }_}_B=====_" - "A=====_ }_}_B=====_")
// TODO: ignore(del(1, 1, 1))
default(del(1, 1, 1))
ignore(mod(1, 1, 3, 2))
testAll()
}
lines {
("A=====_ B=====_ }_}_B=====" - "A=====_ }_}_B=====")
// TODO trim(del(1, 1, 1))