From fceca082c62bc63d9172bc8f19fdf84c189a67a6 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Mon, 22 Dec 2014 14:51:31 +0300 Subject: [PATCH] diff: more aggressive leading/trailing space trim --- .../openapi/util/diff/comparison/ByWord.java | 19 +++++++++++++------ .../comparison/WordComparisonUtilTest.java | 4 ++-- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/platform/diff-api/src/com/intellij/openapi/util/diff/comparison/ByWord.java b/platform/diff-api/src/com/intellij/openapi/util/diff/comparison/ByWord.java index 2d8bb019b027..0186266695ef 100644 --- a/platform/diff-api/src/com/intellij/openapi/util/diff/comparison/ByWord.java +++ b/platform/diff-api/src/com/intellij/openapi/util/diff/comparison/ByWord.java @@ -514,6 +514,7 @@ public class ByWord { } } + // TODO: algorithm could be more aggressive private static class TrimSpacesCorrector { @NotNull private final DiffIterable myIterable; @NotNull private final CharSequence myText1; @@ -542,16 +543,16 @@ public class ByWord { int end1 = range.end1; int end2 = range.end2; - if (isLeadingSpace(myText1, start1)) { + if (isLeadingTrailingSpace(myText1, start1)) { start1 = trimStart(myText1, start1, end1); } - if (isTrailingSpace(myText1, end1)) { + if (isLeadingTrailingSpace(myText1, end1 - 1)) { end1 = trimEnd(myText1, start1, end1); } - if (isLeadingSpace(myText2, start2)) { + if (isLeadingTrailingSpace(myText2, start2)) { start2 = trimStart(myText2, start2, end2); } - if (isTrailingSpace(myText2, end2)) { + if (isLeadingTrailingSpace(myText2, end2 - 1)) { end2 = trimEnd(myText2, start2, end2); } @@ -566,7 +567,12 @@ public class ByWord { } } + private static boolean isLeadingTrailingSpace(@NotNull CharSequence text, int start) { + return isLeadingSpace(text, start) || isTrailingSpace(text, start); + } + private static boolean isLeadingSpace(@NotNull CharSequence text, int start) { + if (start < 0) return false; if (start == text.length()) return false; if (!isWhiteSpace(text.charAt(start))) return false; @@ -581,8 +587,9 @@ public class ByWord { } private static boolean isTrailingSpace(@NotNull CharSequence text, int end) { - if (end == 0) return false; - if (!isWhiteSpace(text.charAt(end - 1))) return false; + if (end < 0) return false; + if (end == text.length()) return false; + if (!isWhiteSpace(text.charAt(end))) return false; while (end < text.length()) { char c = text.charAt(end); diff --git a/platform/diff-impl/tests/com/intellij/openapi/util/diff/comparison/WordComparisonUtilTest.java b/platform/diff-impl/tests/com/intellij/openapi/util/diff/comparison/WordComparisonUtilTest.java index d237bcfb0ee4..ad6f6dd53eb1 100644 --- a/platform/diff-impl/tests/com/intellij/openapi/util/diff/comparison/WordComparisonUtilTest.java +++ b/platform/diff-impl/tests/com/intellij/openapi/util/diff/comparison/WordComparisonUtilTest.java @@ -105,13 +105,13 @@ public class WordComparisonUtilTest extends ComparisonUtilTestBase { public void testNewlines() { TestData.words(" x _ y _ z ", "x z") ._______Def_("- ------ -", " ") - .______Trim_(" ------ ", " ") // TODO: looks wrong + .______Trim_(" - ", " ") .____Ignore_(" - ", " ") .all(); TestData.words("x z", " x _ y _ z ") ._______Def_(" ", "- ------ -") - .______Trim_(" ", " ------ ") + .______Trim_(" ", " - ") .____Ignore_(" ", " - ") .all(); }