diff: cleanup: convert ComparisonUtil into service

This commit is contained in:
Aleksey Pivovarov
2015-02-03 20:17:25 +03:00
parent d9b3fcd217
commit 5fd6a09a17
8 changed files with 146 additions and 60 deletions
@@ -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
* <p/>
* 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<LineFragment> compareLines(@NotNull CharSequence text1,
@NotNull CharSequence text2,
@NotNull ComparisonPolicy policy,
@NotNull ProgressIndicator indicator);
@NotNull
public abstract List<LineFragment> compareLinesInner(@NotNull CharSequence text1,
@NotNull CharSequence text2,
@NotNull ComparisonPolicy policy,
@NotNull ProgressIndicator indicator);
@NotNull
public abstract List<LineFragment> compareLinesInner(@NotNull CharSequence text1,
@NotNull CharSequence text2,
@NotNull List<LineFragment> lineFragments,
@NotNull ComparisonPolicy policy,
@NotNull ProgressIndicator indicator);
@NotNull
public abstract List<DiffFragment> compareWords(@NotNull CharSequence text1,
@NotNull CharSequence text2,
@NotNull ComparisonPolicy policy,
@NotNull ProgressIndicator indicator);
@NotNull
public abstract List<DiffFragment> 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<LineFragment> squash(@NotNull List<LineFragment> oldFragments);
@NotNull
public abstract List<LineFragment> processBlocks(@NotNull List<LineFragment> oldFragments,
@NotNull final CharSequence text1, @NotNull final CharSequence text2,
@NotNull final ComparisonPolicy policy,
final boolean squash, final boolean trim);
}
@@ -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
* <p/>
* 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<LineFragment> compareLines(@NotNull CharSequence text1,
@NotNull CharSequence text2,
@NotNull ComparisonPolicy policy,
@NotNull ProgressIndicator indicator) {
public List<LineFragment> 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<LineFragment> compareLinesInner(@NotNull CharSequence text1,
@NotNull CharSequence text2,
@NotNull ComparisonPolicy policy,
@NotNull ProgressIndicator indicator) {
public List<LineFragment> compareLinesInner(@NotNull CharSequence text1,
@NotNull CharSequence text2,
@NotNull ComparisonPolicy policy,
@NotNull ProgressIndicator indicator) {
List<LineFragment> fragments = compareLines(text1, text2, policy, indicator);
return compareLinesInner(text1, text2, fragments, policy, indicator);
}
@NotNull
public static List<LineFragment> compareLinesInner(@NotNull CharSequence text1,
@NotNull CharSequence text2,
@NotNull List<LineFragment> lineFragments,
@NotNull ComparisonPolicy policy,
@NotNull ProgressIndicator indicator) {
public List<LineFragment> compareLinesInner(@NotNull CharSequence text1,
@NotNull CharSequence text2,
@NotNull List<LineFragment> lineFragments,
@NotNull ComparisonPolicy policy,
@NotNull ProgressIndicator indicator) {
List<LineFragment> fineFragments = new ArrayList<LineFragment>(lineFragments.size());
int tooBigChunksCount = 0;
@@ -131,18 +125,18 @@ public class ComparisonUtil {
}
@NotNull
public static List<DiffFragment> compareWords(@NotNull CharSequence text1,
@NotNull CharSequence text2,
@NotNull ComparisonPolicy policy,
@NotNull ProgressIndicator indicator) {
public List<DiffFragment> compareWords(@NotNull CharSequence text1,
@NotNull CharSequence text2,
@NotNull ComparisonPolicy policy,
@NotNull ProgressIndicator indicator) {
return ByWord.compare(text1, text2, policy, indicator);
}
@NotNull
public static List<DiffFragment> compareChars(@NotNull CharSequence text1,
@NotNull CharSequence text2,
@NotNull ComparisonPolicy policy,
@NotNull ProgressIndicator indicator) {
public List<DiffFragment> 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<LineFragment> squash(@NotNull List<LineFragment> oldFragments) {
public List<LineFragment> squash(@NotNull List<LineFragment> oldFragments) {
if (oldFragments.isEmpty()) return oldFragments;
final List<LineFragment> newFragments = new ArrayList<LineFragment>();
@@ -185,10 +179,10 @@ public class ComparisonUtil {
}
@NotNull
public static List<LineFragment> processBlocks(@NotNull List<LineFragment> oldFragments,
@NotNull final CharSequence text1, @NotNull final CharSequence text2,
@NotNull final ComparisonPolicy policy,
final boolean squash, final boolean trim) {
public List<LineFragment> processBlocks(@NotNull List<LineFragment> 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;
@@ -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
@@ -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<LineFragment> 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);
}
}
@@ -79,7 +79,7 @@ public class ComparisonUtilAutoTest extends AutoTestCase {
CharSequence sequence1 = text1.getCharsSequence();
CharSequence sequence2 = text2.getCharsSequence();
List<LineFragment> fragments = ComparisonUtil.compareLinesInner(sequence1, sequence2, policy, INDICATOR);
List<LineFragment> 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<LineFragment> fragments = ComparisonUtil.compareLinesInner(sequence1, sequence2, policy, INDICATOR);
List<LineFragment> fragments = ComparisonManager.getInstance().compareLinesInner(sequence1, sequence2, policy, INDICATOR);
debugData.set(fragments);
List<LineFragment> squashedFragments = ComparisonUtil.squash(fragments);
List<LineFragment> 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<LineFragment> fragments = ComparisonUtil.compareLinesInner(sequence1, sequence2, policy, INDICATOR);
List<LineFragment> fragments = ComparisonManager.getInstance().compareLinesInner(sequence1, sequence2, policy, INDICATOR);
debugData.set(fragments);
List<LineFragment> processed = ComparisonUtil.processBlocks(fragments, sequence1, sequence2, policy, true, true);
List<LineFragment> 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<Object> debugData) {
List<DiffFragment> fragments = ComparisonUtil.compareChars(text1.getCharsSequence(), text2.getCharsSequence(), policy, INDICATOR);
List<DiffFragment> fragments = ComparisonManager.getInstance()
.compareChars(text1.getCharsSequence(), text2.getCharsSequence(), policy, INDICATOR);
debugData.set(fragments);
checkResultChar(text1.getCharsSequence(), text2.getCharsSequence(), fragments, policy);
@@ -58,7 +58,8 @@ public abstract class ComparisonUtilTestBase extends UsefulTestCase {
@Nullable Couple<BitSet> matchings,
@Nullable List<Change> expected,
@NotNull ComparisonPolicy policy) {
List<LineFragment> fragments = ComparisonUtil.compareLines(before.getCharsSequence(), after.getCharsSequence(), policy, INDICATOR);
List<LineFragment> fragments = ComparisonManager.getInstance()
.compareLines(before.getCharsSequence(), after.getCharsSequence(), policy, INDICATOR);
checkConsistency(fragments, before, after, policy);
if (matchings != null) checkLineMatching(fragments, before, after, matchings, policy);
if (expected != null) checkLineChanges(fragments, before, after, expected, policy);
@@ -69,8 +70,9 @@ public abstract class ComparisonUtilTestBase extends UsefulTestCase {
@Nullable Couple<BitSet> matchings,
@Nullable List<Change> expected,
@NotNull ComparisonPolicy policy) {
List<LineFragment> rawFragments = ComparisonUtil.compareLinesInner(before.getCharsSequence(), after.getCharsSequence(), policy, INDICATOR);
List<LineFragment> fragments = ComparisonUtil.squash(rawFragments);
List<LineFragment> rawFragments = ComparisonManager.getInstance()
.compareLinesInner(before.getCharsSequence(), after.getCharsSequence(), policy, INDICATOR);
List<LineFragment> fragments = ComparisonManager.getInstance().squash(rawFragments);
checkConsistencyWord(fragments, before, after, policy);
@@ -86,7 +88,8 @@ public abstract class ComparisonUtilTestBase extends UsefulTestCase {
@Nullable Couple<BitSet> matchings,
@Nullable List<Change> expected,
@NotNull ComparisonPolicy policy) {
List<DiffFragment> fragments = ComparisonUtil.compareChars(before.getCharsSequence(), after.getCharsSequence(), policy, INDICATOR);
List<DiffFragment> fragments = ComparisonManager.getInstance()
.compareChars(before.getCharsSequence(), after.getCharsSequence(), policy, INDICATOR);
checkConsistency(fragments, before, after, policy);
if (matchings != null) checkDiffMatching(fragments, before, after, matchings, policy);
if (expected != null) checkDiffChanges(fragments, before, after, expected, policy);
@@ -97,7 +100,8 @@ public abstract class ComparisonUtilTestBase extends UsefulTestCase {
@Nullable Couple<BitSet> matchings,
@Nullable List<Change> expected,
@NotNull ComparisonPolicy policy) {
List<LineFragment> fragments = ComparisonUtil.compareLinesInner(before.getCharsSequence(), after.getCharsSequence(), policy, INDICATOR);
List<LineFragment> fragments = ComparisonManager.getInstance()
.compareLinesInner(before.getCharsSequence(), after.getCharsSequence(), policy, INDICATOR);
checkConsistency(fragments, before, after, policy);
if (matchings != null) checkLineMatching(fragments, before, after, matchings, policy);
if (expected != null) checkLineChanges(fragments, before, after, expected, policy);
@@ -87,6 +87,8 @@
serviceImplementation="com.intellij.diff.impl.DiffContentFactoryImpl"/>
<applicationService serviceInterface="com.intellij.diff.DiffRequestFactory"
serviceImplementation="com.intellij.diff.impl.DiffRequestFactoryImpl"/>
<applicationService serviceInterface="com.intellij.diff.comparison.ComparisonManager"
serviceImplementation="com.intellij.diff.comparison.ComparisonManagerImpl"/>
<applicationService serviceInterface="com.intellij.diff.tools.util.base.TextDiffSettingsHolder"
serviceImplementation="com.intellij.diff.tools.util.base.TextDiffSettingsHolder"/>
<applicationService serviceInterface="com.intellij.diff.tools.external.ExternalDiffSettings"
@@ -1,19 +1,19 @@
package org.jetbrains.idea.svn.difftool.properties;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Couple;
import com.intellij.diff.DiffContext;
import com.intellij.diff.FrameDiffTool.DiffViewer;
import com.intellij.diff.FrameDiffTool.ToolbarComponents;
import com.intellij.diff.comparison.ComparisonManager;
import com.intellij.diff.comparison.ComparisonPolicy;
import com.intellij.diff.comparison.ComparisonUtil;
import com.intellij.diff.comparison.DiffTooBigException;
import com.intellij.diff.comparison.TrimUtil;
import com.intellij.diff.contents.DiffContent;
import com.intellij.diff.fragments.LineFragment;
import com.intellij.diff.fragments.LineFragmentImpl;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Couple;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.ScrollPaneFactory;
import com.intellij.ui.table.TableView;
@@ -161,11 +161,12 @@ public class SvnPropertiesDiffViewer implements DiffViewer {
int lines2 = couple2.second;
try {
ComparisonManager comparisonManager = ComparisonManager.getInstance();
if (words1 < MAX_ITEM_COUNT && words2 < MAX_ITEM_COUNT) {
return ComparisonUtil.squash(ComparisonUtil.compareLinesInner(text1, text2, ComparisonPolicy.DEFAULT, INSTANCE));
return comparisonManager.squash(comparisonManager.compareLinesInner(text1, text2, ComparisonPolicy.DEFAULT, INSTANCE));
}
if (lines1 < MAX_ITEM_COUNT && lines2 < MAX_ITEM_COUNT) {
return ComparisonUtil.squash(ComparisonUtil.compareLines(text1, text2, ComparisonPolicy.DEFAULT, INSTANCE));
return comparisonManager.squash(comparisonManager.compareLines(text1, text2, ComparisonPolicy.DEFAULT, INSTANCE));
}
}
catch (DiffTooBigException e) {