List<FineMergeLineFragment> (@NotNull CharSequence text1, @NotNull CharSequence text2, @NotNull CharSequence text3, @NotNull ProgressIndicator indicator) { IgnorePolicy ignorePolicy = getIgnorePolicy(); HighlightPolicy highlightPolicy = getHighlightPolicy(); ComparisonPolicy comparisonPolicy = ignorePolicy.getComparisonPolicy(); List<CharSequence> sequences = Arrays.asList(text1, text2, text3); List<LineOffsets> lineOffsets = ContainerUtil.map(sequences, LineOffsetsUtil::create); indicator.checkCanceled(); List<MergeLineFragment> lineFragments = ComparisonManager.getInstance().compareLines(text1, text2, text3, comparisonPolicy, indicator); indicator.checkCanceled(); List<FineMergeLineFragment> result = new ArrayList<>(lineFragments.size()); for (MergeLineFragment fragment : lineFragments) { MergeConflictType conflictType = getConflictType(comparisonPolicy, sequences, lineOffsets, fragment); MergeInnerDifferences innerDifferences; if (highlightPolicy.isFineFragments()) { List<CharSequence> chunks = getChunks(fragment, sequences, lineOffsets, conflictType); innerDifferences = DiffUtil.compareThreesideInner(chunks, comparisonPolicy, indicator); } else { innerDifferences = null; } result.add(new FineMergeLineFragmentImpl(fragment, conflictType, innerDifferences)); } return result; }