FairDiffIterable (@NotNull List<? extends Line> lines1, @NotNull List<? extends Line> lines2, @NotNull ComparisonPolicy policy, @NotNull CancellationChecker indicator) { indicator.checkCanceled(); if (policy == IGNORE_WHITESPACES) { FairDiffIterable changes = compareSmart(lines1, lines2, indicator); changes = optimizeLineChunks(lines1, lines2, changes, indicator); return expandRanges(lines1, lines2, changes); } else { List<Line> iwLines1 = convertMode(lines1, IGNORE_WHITESPACES); List<Line> iwLines2 = convertMode(lines2, IGNORE_WHITESPACES); FairDiffIterable iwChanges = compareSmart(iwLines1, iwLines2, indicator); iwChanges = optimizeLineChunks(lines1, lines2, iwChanges, indicator); return correctChangesSecondStep(lines1, lines2, iwChanges); } }