mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-08 01:28:26 -05:00
Merge from vscode e3c4990c67c40213af168300d1cfeb71d680f877 (#16569)
This commit is contained in:
@@ -27,6 +27,7 @@ export function stringDiff(original: string, modified: string, pretty: boolean):
|
||||
|
||||
export interface ISequence {
|
||||
getElements(): Int32Array | number[] | string[];
|
||||
getStrictElement?(index: number): string;
|
||||
}
|
||||
|
||||
export interface IDiffChange {
|
||||
@@ -231,6 +232,8 @@ export class LcsDiff {
|
||||
|
||||
private readonly ContinueProcessingPredicate: IContinueProcessingPredicate | null;
|
||||
|
||||
private readonly _originalSequence: ISequence;
|
||||
private readonly _modifiedSequence: ISequence;
|
||||
private readonly _hasStrings: boolean;
|
||||
private readonly _originalStringElements: string[];
|
||||
private readonly _originalElementsOrHash: Int32Array;
|
||||
@@ -246,6 +249,9 @@ export class LcsDiff {
|
||||
constructor(originalSequence: ISequence, modifiedSequence: ISequence, continueProcessingPredicate: IContinueProcessingPredicate | null = null) {
|
||||
this.ContinueProcessingPredicate = continueProcessingPredicate;
|
||||
|
||||
this._originalSequence = originalSequence;
|
||||
this._modifiedSequence = modifiedSequence;
|
||||
|
||||
const [originalStringElements, originalElementsOrHash, originalHasStrings] = LcsDiff._getElements(originalSequence);
|
||||
const [modifiedStringElements, modifiedElementsOrHash, modifiedHasStrings] = LcsDiff._getElements(modifiedSequence);
|
||||
|
||||
@@ -288,6 +294,22 @@ export class LcsDiff {
|
||||
return (this._hasStrings ? this._originalStringElements[originalIndex] === this._modifiedStringElements[newIndex] : true);
|
||||
}
|
||||
|
||||
private ElementsAreStrictEqual(originalIndex: number, newIndex: number): boolean {
|
||||
if (!this.ElementsAreEqual(originalIndex, newIndex)) {
|
||||
return false;
|
||||
}
|
||||
const originalElement = LcsDiff._getStrictElement(this._originalSequence, originalIndex);
|
||||
const modifiedElement = LcsDiff._getStrictElement(this._modifiedSequence, newIndex);
|
||||
return (originalElement === modifiedElement);
|
||||
}
|
||||
|
||||
private static _getStrictElement(sequence: ISequence, index: number): string | null {
|
||||
if (typeof sequence.getStrictElement === 'function') {
|
||||
return sequence.getStrictElement(index);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private OriginalElementsAreEqual(index1: number, index2: number): boolean {
|
||||
if (this._originalElementsOrHash[index1] !== this._originalElementsOrHash[index2]) {
|
||||
return false;
|
||||
@@ -813,10 +835,18 @@ export class LcsDiff {
|
||||
const checkOriginal = change.originalLength > 0;
|
||||
const checkModified = change.modifiedLength > 0;
|
||||
|
||||
while (change.originalStart + change.originalLength < originalStop &&
|
||||
change.modifiedStart + change.modifiedLength < modifiedStop &&
|
||||
(!checkOriginal || this.OriginalElementsAreEqual(change.originalStart, change.originalStart + change.originalLength)) &&
|
||||
(!checkModified || this.ModifiedElementsAreEqual(change.modifiedStart, change.modifiedStart + change.modifiedLength))) {
|
||||
while (
|
||||
change.originalStart + change.originalLength < originalStop
|
||||
&& change.modifiedStart + change.modifiedLength < modifiedStop
|
||||
&& (!checkOriginal || this.OriginalElementsAreEqual(change.originalStart, change.originalStart + change.originalLength))
|
||||
&& (!checkModified || this.ModifiedElementsAreEqual(change.modifiedStart, change.modifiedStart + change.modifiedLength))
|
||||
) {
|
||||
const startStrictEqual = this.ElementsAreStrictEqual(change.originalStart, change.modifiedStart);
|
||||
const endStrictEqual = this.ElementsAreStrictEqual(change.originalStart + change.originalLength, change.modifiedStart + change.modifiedLength);
|
||||
if (endStrictEqual && !startStrictEqual) {
|
||||
// moving the change down would create an equal change, but the elements are not strict equal
|
||||
break;
|
||||
}
|
||||
change.originalStart++;
|
||||
change.modifiedStart++;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user