diff --git a/platform/diff-api/src/com/intellij/diff/comparison/ComparisonManager.java b/platform/diff-api/src/com/intellij/diff/comparison/ComparisonManager.java
new file mode 100644
index 000000000000..272a1f12f57f
--- /dev/null
+++ b/platform/diff-api/src/com/intellij/diff/comparison/ComparisonManager.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2000-2015 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.diff.comparison;
+
+import com.intellij.diff.fragments.DiffFragment;
+import com.intellij.diff.fragments.LineFragment;
+import com.intellij.openapi.components.ServiceManager;
+import com.intellij.openapi.progress.ProgressIndicator;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+/**
+ * Class for the text comparison
+ * CharSequences should to have '\n' as line separator
+ *
+ * It's good idea not to compare String due to expensive subSequence() implementation. Try to wrap into CharSequenceSubSequence.
+ */
+public abstract class ComparisonManager {
+ @NotNull
+ public static ComparisonManager getInstance() {
+ return ServiceManager.getService(ComparisonManager.class);
+ }
+
+ @NotNull
+ public abstract List compareLines(@NotNull CharSequence text1,
+ @NotNull CharSequence text2,
+ @NotNull ComparisonPolicy policy,
+ @NotNull ProgressIndicator indicator);
+
+ @NotNull
+ public abstract List compareLinesInner(@NotNull CharSequence text1,
+ @NotNull CharSequence text2,
+ @NotNull ComparisonPolicy policy,
+ @NotNull ProgressIndicator indicator);
+
+ @NotNull
+ public abstract List compareLinesInner(@NotNull CharSequence text1,
+ @NotNull CharSequence text2,
+ @NotNull List lineFragments,
+ @NotNull ComparisonPolicy policy,
+ @NotNull ProgressIndicator indicator);
+
+ @NotNull
+ public abstract List compareWords(@NotNull CharSequence text1,
+ @NotNull CharSequence text2,
+ @NotNull ComparisonPolicy policy,
+ @NotNull ProgressIndicator indicator);
+
+ @NotNull
+ public abstract List compareChars(@NotNull CharSequence text1,
+ @NotNull CharSequence text2,
+ @NotNull ComparisonPolicy policy,
+ @NotNull ProgressIndicator indicator);
+
+ public abstract boolean isEquals(@NotNull CharSequence text1, @NotNull CharSequence text2, @NotNull ComparisonPolicy policy);
+
+ //
+ // Post process line fragments
+ //
+
+ @NotNull
+ public abstract List squash(@NotNull List oldFragments);
+
+ @NotNull
+ public abstract List processBlocks(@NotNull List oldFragments,
+ @NotNull final CharSequence text1, @NotNull final CharSequence text2,
+ @NotNull final ComparisonPolicy policy,
+ final boolean squash, final boolean trim);
+}
diff --git a/platform/diff-api/src/com/intellij/diff/comparison/ComparisonUtil.java b/platform/diff-api/src/com/intellij/diff/comparison/ComparisonManagerImpl.java
similarity index 82%
rename from platform/diff-api/src/com/intellij/diff/comparison/ComparisonUtil.java
rename to platform/diff-api/src/com/intellij/diff/comparison/ComparisonManagerImpl.java
index 0aeefac50726..d9ae5a1acb01 100644
--- a/platform/diff-api/src/com/intellij/diff/comparison/ComparisonUtil.java
+++ b/platform/diff-api/src/com/intellij/diff/comparison/ComparisonManagerImpl.java
@@ -34,20 +34,14 @@ import java.util.List;
import static com.intellij.diff.comparison.iterables.DiffIterableUtil.convertIntoFragments;
-/**
- * Class for the text comparison
- * CharSequences should to have '\n' as line separator
- *
- * It's good idea not to compare String due to expensive subSequence() implementation. Try to wrap into CharSequenceSubSequence.
- */
-public class ComparisonUtil {
- public static final Logger LOG = Logger.getInstance(ComparisonUtil.class);
+public class ComparisonManagerImpl extends ComparisonManager {
+ public static final Logger LOG = Logger.getInstance(ComparisonManagerImpl.class);
@NotNull
- public static List compareLines(@NotNull CharSequence text1,
- @NotNull CharSequence text2,
- @NotNull ComparisonPolicy policy,
- @NotNull ProgressIndicator indicator) {
+ public List compareLines(@NotNull CharSequence text1,
+ @NotNull CharSequence text2,
+ @NotNull ComparisonPolicy policy,
+ @NotNull ProgressIndicator indicator) {
if (policy == ComparisonPolicy.IGNORE_WHITESPACES) {
return ByLine.compare(text1, text2, policy, indicator);
}
@@ -57,20 +51,20 @@ public class ComparisonUtil {
}
@NotNull
- public static List compareLinesInner(@NotNull CharSequence text1,
- @NotNull CharSequence text2,
- @NotNull ComparisonPolicy policy,
- @NotNull ProgressIndicator indicator) {
+ public List compareLinesInner(@NotNull CharSequence text1,
+ @NotNull CharSequence text2,
+ @NotNull ComparisonPolicy policy,
+ @NotNull ProgressIndicator indicator) {
List fragments = compareLines(text1, text2, policy, indicator);
return compareLinesInner(text1, text2, fragments, policy, indicator);
}
@NotNull
- public static List compareLinesInner(@NotNull CharSequence text1,
- @NotNull CharSequence text2,
- @NotNull List lineFragments,
- @NotNull ComparisonPolicy policy,
- @NotNull ProgressIndicator indicator) {
+ public List compareLinesInner(@NotNull CharSequence text1,
+ @NotNull CharSequence text2,
+ @NotNull List lineFragments,
+ @NotNull ComparisonPolicy policy,
+ @NotNull ProgressIndicator indicator) {
List fineFragments = new ArrayList(lineFragments.size());
int tooBigChunksCount = 0;
@@ -131,18 +125,18 @@ public class ComparisonUtil {
}
@NotNull
- public static List compareWords(@NotNull CharSequence text1,
- @NotNull CharSequence text2,
- @NotNull ComparisonPolicy policy,
- @NotNull ProgressIndicator indicator) {
+ public List compareWords(@NotNull CharSequence text1,
+ @NotNull CharSequence text2,
+ @NotNull ComparisonPolicy policy,
+ @NotNull ProgressIndicator indicator) {
return ByWord.compare(text1, text2, policy, indicator);
}
@NotNull
- public static List compareChars(@NotNull CharSequence text1,
- @NotNull CharSequence text2,
- @NotNull ComparisonPolicy policy,
- @NotNull ProgressIndicator indicator) {
+ public List compareChars(@NotNull CharSequence text1,
+ @NotNull CharSequence text2,
+ @NotNull ComparisonPolicy policy,
+ @NotNull ProgressIndicator indicator) {
if (policy == ComparisonPolicy.IGNORE_WHITESPACES) {
return convertIntoFragments(ByChar.compareIgnoreWhitespaces(text1, text2, indicator));
}
@@ -153,7 +147,7 @@ public class ComparisonUtil {
return convertIntoFragments(ByChar.compareTwoStep(text1, text2, indicator));
}
- public static boolean isEquals(@NotNull CharSequence text1, @NotNull CharSequence text2, @NotNull ComparisonPolicy policy) {
+ public boolean isEquals(@NotNull CharSequence text1, @NotNull CharSequence text2, @NotNull ComparisonPolicy policy) {
switch (policy) {
case DEFAULT:
return StringUtil.equals(text1, text2);
@@ -171,7 +165,7 @@ public class ComparisonUtil {
//
@NotNull
- public static List squash(@NotNull List oldFragments) {
+ public List squash(@NotNull List oldFragments) {
if (oldFragments.isEmpty()) return oldFragments;
final List newFragments = new ArrayList();
@@ -185,10 +179,10 @@ public class ComparisonUtil {
}
@NotNull
- public static List processBlocks(@NotNull List oldFragments,
- @NotNull final CharSequence text1, @NotNull final CharSequence text2,
- @NotNull final ComparisonPolicy policy,
- final boolean squash, final boolean trim) {
+ public List processBlocks(@NotNull List oldFragments,
+ @NotNull final CharSequence text1, @NotNull final CharSequence text2,
+ @NotNull final ComparisonPolicy policy,
+ final boolean squash, final boolean trim) {
if (!squash && !trim) return oldFragments;
if (oldFragments.isEmpty()) return oldFragments;
diff --git a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffChange.java b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffChange.java
index a8753e47f6dd..c0477ba882b7 100644
--- a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffChange.java
+++ b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffChange.java
@@ -15,8 +15,8 @@
*/
package com.intellij.diff.tools.simple;
+import com.intellij.diff.comparison.ComparisonManager;
import com.intellij.diff.comparison.ComparisonPolicy;
-import com.intellij.diff.comparison.ComparisonUtil;
import com.intellij.diff.fragments.MergeLineFragment;
import com.intellij.diff.util.*;
import com.intellij.openapi.editor.Document;
@@ -203,7 +203,7 @@ class SimpleThreesideDiffChange {
CharSequence content1 = getRangeContent(fragment, editors, side1);
CharSequence content2 = getRangeContent(fragment, editors, side2);
- return ComparisonUtil.isEquals(content1, content2, policy);
+ return ComparisonManager.getInstance().isEquals(content1, content2, policy);
}
@NotNull
diff --git a/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java b/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java
index 78fa9c912e89..bd04e5c1fc59 100644
--- a/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java
+++ b/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java
@@ -20,8 +20,8 @@ import com.intellij.diff.DiffContext;
import com.intellij.diff.DiffDialogHints;
import com.intellij.diff.DiffTool;
import com.intellij.diff.SuppressiveDiffTool;
+import com.intellij.diff.comparison.ComparisonManager;
import com.intellij.diff.comparison.ComparisonPolicy;
-import com.intellij.diff.comparison.ComparisonUtil;
import com.intellij.diff.contents.DiffContent;
import com.intellij.diff.contents.DocumentContent;
import com.intellij.diff.contents.EmptyContent;
@@ -442,7 +442,8 @@ public class DiffUtil {
List fragments = doCompareWithCache(request, text1, text2, stamp1, stamp2, config, indicator);
indicator.checkCanceled();
- return ComparisonUtil.processBlocks(fragments, text1, text2, config.policy, config.squashFragments, config.trimFragments);
+ return ComparisonManager.getInstance().processBlocks(fragments, text1, text2,
+ config.policy, config.squashFragments, config.trimFragments);
}
@NotNull
@@ -461,14 +462,14 @@ public class DiffUtil {
if (cachedData.getFragments().isEmpty()) return cachedData.getFragments();
if (!config.innerFragments) return cachedData.getFragments();
if (cachedData.isInnerFragments()) return cachedData.getFragments();
- newFragments = ComparisonUtil.compareLinesInner(text1, text2, cachedData.getFragments(), config.policy, indicator);
+ newFragments = ComparisonManager.getInstance().compareLinesInner(text1, text2, cachedData.getFragments(), config.policy, indicator);
}
else {
if (config.innerFragments) {
- newFragments = ComparisonUtil.compareLinesInner(text1, text2, config.policy, indicator);
+ newFragments = ComparisonManager.getInstance().compareLinesInner(text1, text2, config.policy, indicator);
}
else {
- newFragments = ComparisonUtil.compareLines(text1, text2, config.policy, indicator);
+ newFragments = ComparisonManager.getInstance().compareLines(text1, text2, config.policy, indicator);
}
}
diff --git a/platform/diff-impl/tests/com/intellij/diff/comparison/ComparisonUtilAutoTest.java b/platform/diff-impl/tests/com/intellij/diff/comparison/ComparisonUtilAutoTest.java
index 154b49c7202e..3012e92bf41a 100644
--- a/platform/diff-impl/tests/com/intellij/diff/comparison/ComparisonUtilAutoTest.java
+++ b/platform/diff-impl/tests/com/intellij/diff/comparison/ComparisonUtilAutoTest.java
@@ -79,7 +79,7 @@ public class ComparisonUtilAutoTest extends AutoTestCase {
CharSequence sequence1 = text1.getCharsSequence();
CharSequence sequence2 = text2.getCharsSequence();
- List fragments = ComparisonUtil.compareLinesInner(sequence1, sequence2, policy, INDICATOR);
+ List fragments = ComparisonManager.getInstance().compareLinesInner(sequence1, sequence2, policy, INDICATOR);
debugData.set(fragments);
checkResultLine(text1, text2, fragments, policy, true);
@@ -96,10 +96,10 @@ public class ComparisonUtilAutoTest extends AutoTestCase {
CharSequence sequence1 = text1.getCharsSequence();
CharSequence sequence2 = text2.getCharsSequence();
- List fragments = ComparisonUtil.compareLinesInner(sequence1, sequence2, policy, INDICATOR);
+ List fragments = ComparisonManager.getInstance().compareLinesInner(sequence1, sequence2, policy, INDICATOR);
debugData.set(fragments);
- List squashedFragments = ComparisonUtil.squash(fragments);
+ List squashedFragments = ComparisonManager.getInstance().squash(fragments);
debugData.set(new Object[]{fragments, squashedFragments});
checkResultLine(text1, text2, squashedFragments, policy, false);
@@ -116,10 +116,10 @@ public class ComparisonUtilAutoTest extends AutoTestCase {
CharSequence sequence1 = text1.getCharsSequence();
CharSequence sequence2 = text2.getCharsSequence();
- List fragments = ComparisonUtil.compareLinesInner(sequence1, sequence2, policy, INDICATOR);
+ List fragments = ComparisonManager.getInstance().compareLinesInner(sequence1, sequence2, policy, INDICATOR);
debugData.set(fragments);
- List processed = ComparisonUtil.processBlocks(fragments, sequence1, sequence2, policy, true, true);
+ List processed = ComparisonManager.getInstance().processBlocks(fragments, sequence1, sequence2, policy, true, true);
debugData.set(new Object[]{fragments, processed});
checkResultLine(text1, text2, processed, policy, false);
@@ -133,7 +133,8 @@ public class ComparisonUtilAutoTest extends AutoTestCase {
doTest(seed, runs, maxLength, policies, new TestTask() {
@Override
public void run(@NotNull Document text1, @NotNull Document text2, @NotNull ComparisonPolicy policy, @NotNull Ref