List<MergeWordFragment> (@NotNull CharSequence text1, @NotNull CharSequence text2, @NotNull CharSequence text3, @NotNull ComparisonPolicy policy, @NotNull CancellationChecker indicator) { indicator.checkCanceled(); List<InlineChunk> words1 = getInlineChunks(text1); List<InlineChunk> words2 = getInlineChunks(text2); List<InlineChunk> words3 = getInlineChunks(text3); FairDiffIterable wordChanges1 = diff(words2, words1, indicator); wordChanges1 = optimizeWordChunks(text2, text1, words2, words1, wordChanges1, indicator); FairDiffIterable iterable1 = matchAdjustmentDelimiters(text2, text1, words2, words1, wordChanges1, indicator); FairDiffIterable wordChanges2 = diff(words2, words3, indicator); wordChanges2 = optimizeWordChunks(text2, text3, words2, words3, wordChanges2, indicator); FairDiffIterable iterable2 = matchAdjustmentDelimiters(text2, text3, words2, words3, wordChanges2, indicator); List<MergeRange> wordConflicts = ComparisonMergeUtil.buildSimple(iterable1, iterable2, indicator); List<MergeRange> result = matchAdjustmentWhitespaces(text1, text2, text3, wordConflicts, policy, indicator); return convertIntoMergeWordFragments(result); }