mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
diff: cleanup: convert ComparisonUtil into service
This commit is contained in:
@@ -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);
|
||||
}
|
||||
+29
-35
@@ -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;
|
||||
|
||||
+2
-2
@@ -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"
|
||||
|
||||
+8
-7
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user