diff --git a/.vscode/settings.json b/.vscode/settings.json index eea3f45f764..3abb868dc0c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -12,7 +12,8 @@ } }, "files.associations": { - "cglicenses.json": "jsonc" + "cglicenses.json": "jsonc", + "*.tst": "typescript" }, "search.exclude": { "**/node_modules": true, @@ -27,7 +28,8 @@ "test/automation/out/**": true, "test/integration/browser/out/**": true, "src/vs/base/test/node/uri.test.data.txt": true, - "src/vs/workbench/api/test/browser/extHostDocumentData.test.perf-data.ts": true + "src/vs/workbench/api/test/browser/extHostDocumentData.test.perf-data.ts": true, + "src/vs/editor/test/node/diffing/fixtures/**": true, }, "lcov.path": [ "./.build/coverage/lcov.info", diff --git a/src/vs/editor/common/diff/algorithms/joinSequenceDiffs.ts b/src/vs/editor/common/diff/algorithms/joinSequenceDiffs.ts index ae370b5a693..81d9c9acd06 100644 --- a/src/vs/editor/common/diff/algorithms/joinSequenceDiffs.ts +++ b/src/vs/editor/common/diff/algorithms/joinSequenceDiffs.ts @@ -85,11 +85,11 @@ export function shiftSequenceDiffs(sequence1: ISequence, sequence2: ISequence, s const diff = sequenceDiffs[i]; if (diff.seq1Range.isEmpty) { const seq2PrevEndExclusive = (i > 0 ? sequenceDiffs[i - 1].seq2Range.endExclusive : -1); - const seq2NextStart = (i + 1 < sequenceDiffs.length ? sequenceDiffs[i + 1].seq2Range.start : sequence2.length + 1); + const seq2NextStart = (i + 1 < sequenceDiffs.length ? sequenceDiffs[i + 1].seq2Range.start : sequence2.length); sequenceDiffs[i] = shiftDiffToBetterPosition(diff, sequence1, sequence2, seq2NextStart, seq2PrevEndExclusive); } else if (diff.seq2Range.isEmpty) { const seq1PrevEndExclusive = (i > 0 ? sequenceDiffs[i - 1].seq1Range.endExclusive : -1); - const seq1NextStart = (i + 1 < sequenceDiffs.length ? sequenceDiffs[i + 1].seq1Range.start : sequence1.length + 1); + const seq1NextStart = (i + 1 < sequenceDiffs.length ? sequenceDiffs[i + 1].seq1Range.start : sequence1.length); sequenceDiffs[i] = shiftDiffToBetterPosition(diff.reverse(), sequence2, sequence1, seq1NextStart, seq1PrevEndExclusive).reverse(); } } @@ -102,7 +102,7 @@ function shiftDiffToBetterPosition(diff: SequenceDiff, sequence1: ISequence, seq // don't touch previous or next! let deltaBefore = 1; - while (diff.seq1Range.start - deltaBefore > seq2PrevEndExclusive && + while (diff.seq2Range.start - deltaBefore > seq2PrevEndExclusive && sequence2.getElement(diff.seq2Range.start - deltaBefore) === sequence2.getElement(diff.seq2Range.endExclusive - deltaBefore) && deltaBefore < maxShiftLimit) { deltaBefore++; @@ -110,7 +110,7 @@ function shiftDiffToBetterPosition(diff: SequenceDiff, sequence1: ISequence, seq deltaBefore--; let deltaAfter = 1; - while (diff.seq1Range.start + deltaAfter < seq2NextStart && + while (diff.seq2Range.start + deltaAfter < seq2NextStart && sequence2.getElement(diff.seq2Range.start + deltaAfter) === sequence2.getElement(diff.seq2Range.endExclusive + deltaAfter) && deltaAfter < maxShiftLimit) { deltaAfter++; diff --git a/src/vs/editor/test/node/diffing/README.md b/src/vs/editor/test/node/diffing/README.md new file mode 100644 index 00000000000..0865d7b3eca --- /dev/null +++ b/src/vs/editor/test/node/diffing/README.md @@ -0,0 +1,10 @@ +# Diffing Fixture Tests + +Every folder in `fixtures` represents a test. +The file that starts with `1.` is diffed against the file that starts with `2.`. Use `tst` instead of `ts` to avoid compiler/linter errors for typescript diff files. + +* Missing `*.expected.diff.json` are created automatically (as well as an `*.invalid.diff.json` file). +* If the actual diff does not equal the expected diff, the expected file is updated automatically. The previous value of the expected file is written to `*.invalid.diff.json`. +* The test will fail if there are any `*.invalid.diff.json` files. This makes sure that the test keeps failing even if it is run a second time. + +When changing the diffing algorithm, run the fixture tests, review the diff of the `*.expected.diff.json` files and delete all `*.invalid.diff.json` files. diff --git a/src/vs/editor/test/node/diffing/diffing.test.ts b/src/vs/editor/test/node/diffing/diffing.test.ts new file mode 100644 index 00000000000..fdccaf91fc2 --- /dev/null +++ b/src/vs/editor/test/node/diffing/diffing.test.ts @@ -0,0 +1,99 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import assert = require('assert'); +import { readdirSync, readFileSync, existsSync, writeFileSync } from 'fs'; +import { join, resolve } from 'path'; +import { FileAccess } from 'vs/base/common/network'; +import { SmartLinesDiffComputer } from 'vs/editor/common/diff/smartLinesDiffComputer'; +import { StandardLinesDiffComputer } from 'vs/editor/common/diff/standardLinesDiffComputer'; + +suite('diff fixtures', () => { + const fixturesOutDir = FileAccess.asFileUri('vs/editor/test/node/diffing/fixtures').fsPath; + // We want the dir in src, so we can directly update the source files if they disagree and create invalid files to capture the previous state. + // This makes it very easy to update the fixtures. + const fixturesSrcDir = resolve(fixturesOutDir).replaceAll('\\', '/').replace('/out/vs/editor/', '/src/vs/editor/'); + const folders = readdirSync(fixturesSrcDir); + + for (const folder of folders) { + for (const diffingAlgoName of ['smart', 'experimental']) { + test(`${folder}-${diffingAlgoName}`, () => { + const folderPath = join(fixturesSrcDir, folder); + const files = readdirSync(folderPath); + + const firstFileName = files.find(f => f.startsWith('1.'))!; + const secondFileName = files.find(f => f.startsWith('2.'))!; + + const firstContentLines = readFileSync(join(folderPath, firstFileName), 'utf8').split(/\r\n|\r|\n/); + const secondContentLines = readFileSync(join(folderPath, secondFileName), 'utf8').split(/\r\n|\r|\n/); + + const diffingAlgo = diffingAlgoName === 'smart' ? new SmartLinesDiffComputer() : new StandardLinesDiffComputer(); + + const diff = diffingAlgo.computeDiff(firstContentLines, secondContentLines, { ignoreTrimWhitespace: false, maxComputationTime: Number.MAX_SAFE_INTEGER }); + + const actualDiffingResult: DiffingResult = { + originalFileName: `./${firstFileName}`, + modifiedFileName: `./${secondFileName}`, + diffs: diff.changes.map(c => ({ + originalRange: c.originalRange.toString(), + modifiedRange: c.modifiedRange.toString(), + innerChanges: c.innerChanges?.map(c => ({ + originalRange: c.originalRange.toString(), + modifiedRange: c.modifiedRange.toString(), + })) || null + })) + }; + + const expectedFilePath = join(folderPath, `${diffingAlgoName}.expected.diff.json`); + const invalidFilePath = join(folderPath, `${diffingAlgoName}.invalid.diff.json`); + + const expectedFileContentFromActual = JSON.stringify(actualDiffingResult, null, '\t'); + + const invalidExists = existsSync(invalidFilePath); + + if (!existsSync(expectedFilePath)) { + writeFileSync(expectedFilePath, expectedFileContentFromActual); + writeFileSync(invalidFilePath, ''); + throw new Error('No expected file! Expected and invalid files were written. Delete the invalid file to make the test pass.'); + } else { + const expectedFileContent = readFileSync(invalidExists ? invalidFilePath : expectedFilePath, 'utf8'); + const expectedFileDiffResult: DiffingResult = JSON.parse(expectedFileContent); + + try { + assert.deepStrictEqual(actualDiffingResult, expectedFileDiffResult); + } catch (e) { + if (!invalidExists) { + writeFileSync(invalidFilePath, expectedFileContent); + } + writeFileSync(expectedFilePath, expectedFileContentFromActual); + throw e; + } + } + + if (invalidExists) { + throw new Error('Invalid file exists and agrees with expected file! Delete the invalid file to make the test pass.'); + } + }); + } + } +}); + +interface DiffingResult { + originalFileName: string; + modifiedFileName: string; + + diffs: IDetailedDiff[]; +} + +interface IDetailedDiff { + originalRange: string; // [startLineNumber, endLineNumberExclusive) + modifiedRange: string; // [startLineNumber, endLineNumberExclusive) + innerChanges: IDiff[] | null; +} + +interface IDiff { + originalRange: string; // [1,18 -> 1,19] + modifiedRange: string; // [1,18 -> 1,19] +} diff --git a/src/vs/editor/test/node/diffing/fixtures/bracket-aligning/1.tst b/src/vs/editor/test/node/diffing/fixtures/bracket-aligning/1.tst new file mode 100644 index 00000000000..e1557eb0c9a --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/bracket-aligning/1.tst @@ -0,0 +1,131 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { CompareResult } from 'vs/base/common/arrays'; +import { autorun, derived } from 'vs/base/common/observable'; +import { IModelDeltaDecoration, MinimapPosition, OverviewRulerLane } from 'vs/editor/common/model'; +import { localize } from 'vs/nls'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { LineRange } from 'vs/workbench/contrib/mergeEditor/browser/model/lineRange'; +import { applyObservableDecorations, join } from 'vs/workbench/contrib/mergeEditor/browser/utils'; +import { handledConflictMinimapOverViewRulerColor, unhandledConflictMinimapOverViewRulerColor } from 'vs/workbench/contrib/mergeEditor/browser/view/colors'; +import { CodeEditorView } from './codeEditorView'; + +export class ResultCodeEditorView extends CodeEditorView { + private readonly decorations = derived('result.decorations', reader => { + const viewModel = this.viewModel.read(reader); + if (!viewModel) { + return []; + } + const model = viewModel.model; + const result = new Array(); + + const baseRangeWithStoreAndTouchingDiffs = join( + model.modifiedBaseRanges.read(reader), + model.resultDiffs.read(reader), + (baseRange, diff) => baseRange.baseRange.touches(diff.inputRange) + ? CompareResult.neitherLessOrGreaterThan + : LineRange.compareByStart( + baseRange.baseRange, + diff.inputRange + ) + ); + + const activeModifiedBaseRange = viewModel.activeModifiedBaseRange.read(reader); + + for (const m of baseRangeWithStoreAndTouchingDiffs) { + const modifiedBaseRange = m.left; + + if (modifiedBaseRange) { + const range = model.getRangeInResult(modifiedBaseRange.baseRange, reader).toInclusiveRange(); + if (range) { + const blockClassNames = ['merge-editor-block']; + const isHandled = model.isHandled(modifiedBaseRange).read(reader); + if (isHandled) { + blockClassNames.push('handled'); + } + if (modifiedBaseRange === activeModifiedBaseRange) { + blockClassNames.push('focused'); + } + blockClassNames.push('result'); + + result.push({ + range, + options: { + isWholeLine: true, + blockClassName: blockClassNames.join(' '), + description: 'Result Diff', + minimap: { + position: MinimapPosition.Gutter, + color: { id: isHandled ? handledConflictMinimapOverViewRulerColor : unhandledConflictMinimapOverViewRulerColor }, + }, + overviewRuler: { + position: OverviewRulerLane.Center, + color: { id: isHandled ? handledConflictMinimapOverViewRulerColor : unhandledConflictMinimapOverViewRulerColor }, + } + } + }); + } + } + + for (const diff of m.rights) { + const range = diff.outputRange.toInclusiveRange(); + if (range) { + result.push({ + range, + options: { + className: `merge-editor-diff result`, + description: 'Merge Editor', + isWholeLine: true, + } + }); + } + + if (diff.rangeMappings) { + for (const d of diff.rangeMappings) { + result.push({ + range: d.outputRange, + options: { + className: `merge-editor-diff-word result`, + description: 'Merge Editor' + } + }); + } + } + } + } + return result; + }); + + constructor( + @IInstantiationService instantiationService: IInstantiationService + ) { + super(instantiationService); + + this._register(applyObservableDecorations(this.editor, this.decorations)); + + + this._register(autorun('update remainingConflicts label', reader => { + const model = this.model.read(reader); + if (!model) { + return; + } + const count = model.unhandledConflictsCount.read(reader); + + this.htmlElements.detail.innerText = count === 1 + ? localize( + 'mergeEditor.remainingConflicts', + '{0} Conflict Remaining', + count + ) + : localize( + 'mergeEditor.remainingConflict', + '{0} Conflicts Remaining ', + count + ); + + })); + } +} diff --git a/src/vs/editor/test/node/diffing/fixtures/bracket-aligning/2.tst b/src/vs/editor/test/node/diffing/fixtures/bracket-aligning/2.tst new file mode 100644 index 00000000000..f775a30f62a --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/bracket-aligning/2.tst @@ -0,0 +1,134 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { CompareResult } from 'vs/base/common/arrays'; +import { autorun, derived } from 'vs/base/common/observable'; +import { IModelDeltaDecoration, MinimapPosition, OverviewRulerLane } from 'vs/editor/common/model'; +import { localize } from 'vs/nls'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { LineRange } from 'vs/workbench/contrib/mergeEditor/browser/model/lineRange'; +import { applyObservableDecorations, join } from 'vs/workbench/contrib/mergeEditor/browser/utils'; +import { handledConflictMinimapOverViewRulerColor, unhandledConflictMinimapOverViewRulerColor } from 'vs/workbench/contrib/mergeEditor/browser/view/colors'; +import { CodeEditorView } from './codeEditorView'; + +export class ResultCodeEditorView extends CodeEditorView { + private readonly decorations = derived('result.decorations', reader => { + const viewModel = this.viewModel.read(reader); + if (!viewModel) { + return []; + } + const model = viewModel.model; + const result = new Array(); + + const baseRangeWithStoreAndTouchingDiffs = join( + model.modifiedBaseRanges.read(reader), + model.resultDiffs.read(reader), + (baseRange, diff) => baseRange.baseRange.touches(diff.inputRange) + ? CompareResult.neitherLessOrGreaterThan + : LineRange.compareByStart( + baseRange.baseRange, + diff.inputRange + ) + ); + + const activeModifiedBaseRange = viewModel.activeModifiedBaseRange.read(reader); + + for (const m of baseRangeWithStoreAndTouchingDiffs) { + const modifiedBaseRange = m.left; + + if (modifiedBaseRange) { + const range = model.getRangeInResult(modifiedBaseRange.baseRange, reader).toInclusiveRange(); + if (range) { + const blockClassNames = ['merge-editor-block']; + const isHandled = model.isHandled(modifiedBaseRange).read(reader); + if (isHandled) { + blockClassNames.push('handled'); + } + if (modifiedBaseRange === activeModifiedBaseRange) { + blockClassNames.push('focused'); + } + blockClassNames.push('result'); + + result.push({ + range, + options: { + isWholeLine: true, + blockClassName: blockClassNames.join(' '), + description: 'Result Diff', + minimap: { + position: MinimapPosition.Gutter, + color: { id: isHandled ? handledConflictMinimapOverViewRulerColor : unhandledConflictMinimapOverViewRulerColor }, + }, + overviewRuler: { + position: OverviewRulerLane.Center, + color: { id: isHandled ? handledConflictMinimapOverViewRulerColor : unhandledConflictMinimapOverViewRulerColor }, + } + } + }); + } + } + + + if (!modifiedBaseRange || modifiedBaseRange.isConflicting) { + for (const diff of m.rights) { + const range = diff.outputRange.toInclusiveRange(); + if (range) { + result.push({ + range, + options: { + className: `merge-editor-diff result`, + description: 'Merge Editor', + isWholeLine: true, + } + }); + } + + if (diff.rangeMappings) { + for (const d of diff.rangeMappings) { + result.push({ + range: d.outputRange, + options: { + className: `merge-editor-diff-word result`, + description: 'Merge Editor' + } + }); + } + } + } + } + } + return result; + }); + + constructor( + @IInstantiationService instantiationService: IInstantiationService + ) { + super(instantiationService); + + this._register(applyObservableDecorations(this.editor, this.decorations)); + + + this._register(autorun('update remainingConflicts label', reader => { + const model = this.model.read(reader); + if (!model) { + return; + } + const count = model.unhandledConflictsCount.read(reader); + + this.htmlElements.detail.innerText = count === 1 + ? localize( + 'mergeEditor.remainingConflicts', + '{0} Conflict Remaining', + count + ) + : localize( + 'mergeEditor.remainingConflict', + '{0} Conflicts Remaining ', + count + ); + + })); + } +} diff --git a/src/vs/editor/test/node/diffing/fixtures/bracket-aligning/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/bracket-aligning/experimental.expected.diff.json new file mode 100644 index 00000000000..86b0dc30193 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/bracket-aligning/experimental.expected.diff.json @@ -0,0 +1,122 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[73,85)", + "modifiedRange": "[73,87)", + "innerChanges": [ + { + "originalRange": "[73,1 -> 73,1]", + "modifiedRange": "[73,1 -> 75,1]" + }, + { + "originalRange": "[73,1 -> 73,1]", + "modifiedRange": "[75,1 -> 75,2]" + }, + { + "originalRange": "[74,1 -> 74,1]", + "modifiedRange": "[76,1 -> 76,2]" + }, + { + "originalRange": "[75,1 -> 75,1]", + "modifiedRange": "[77,1 -> 77,2]" + }, + { + "originalRange": "[76,1 -> 76,1]", + "modifiedRange": "[78,1 -> 78,2]" + }, + { + "originalRange": "[77,1 -> 77,1]", + "modifiedRange": "[79,1 -> 79,2]" + }, + { + "originalRange": "[78,1 -> 78,1]", + "modifiedRange": "[80,1 -> 80,2]" + }, + { + "originalRange": "[79,1 -> 79,1]", + "modifiedRange": "[81,1 -> 81,2]" + }, + { + "originalRange": "[80,1 -> 80,1]", + "modifiedRange": "[82,1 -> 82,2]" + }, + { + "originalRange": "[81,1 -> 81,1]", + "modifiedRange": "[83,1 -> 83,2]" + }, + { + "originalRange": "[82,1 -> 82,1]", + "modifiedRange": "[84,1 -> 84,2]" + }, + { + "originalRange": "[83,1 -> 83,1]", + "modifiedRange": "[85,1 -> 85,2]" + }, + { + "originalRange": "[84,1 -> 84,1]", + "modifiedRange": "[86,1 -> 86,2]" + } + ] + }, + { + "originalRange": "[86,98)", + "modifiedRange": "[88,101)", + "innerChanges": [ + { + "originalRange": "[86,1 -> 86,1]", + "modifiedRange": "[88,1 -> 88,2]" + }, + { + "originalRange": "[87,1 -> 87,1]", + "modifiedRange": "[89,1 -> 89,2]" + }, + { + "originalRange": "[88,1 -> 88,1]", + "modifiedRange": "[90,1 -> 90,2]" + }, + { + "originalRange": "[89,1 -> 89,1]", + "modifiedRange": "[91,1 -> 91,2]" + }, + { + "originalRange": "[90,1 -> 90,1]", + "modifiedRange": "[92,1 -> 92,2]" + }, + { + "originalRange": "[91,1 -> 91,1]", + "modifiedRange": "[93,1 -> 93,2]" + }, + { + "originalRange": "[92,1 -> 92,1]", + "modifiedRange": "[94,1 -> 94,2]" + }, + { + "originalRange": "[93,1 -> 93,1]", + "modifiedRange": "[95,1 -> 95,2]" + }, + { + "originalRange": "[94,1 -> 94,1]", + "modifiedRange": "[96,1 -> 96,2]" + }, + { + "originalRange": "[95,1 -> 95,1]", + "modifiedRange": "[97,1 -> 97,2]" + }, + { + "originalRange": "[96,1 -> 96,1]", + "modifiedRange": "[98,1 -> 98,2]" + }, + { + "originalRange": "[97,1 -> 97,1]", + "modifiedRange": "[99,1 -> 99,2]" + }, + { + "originalRange": "[98,1 -> 98,1]", + "modifiedRange": "[100,1 -> 101,1]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/bracket-aligning/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/bracket-aligning/smart.expected.diff.json new file mode 100644 index 00000000000..17dd9daa899 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/bracket-aligning/smart.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[73,85)", + "modifiedRange": "[73,87)", + "innerChanges": null + }, + { + "originalRange": "[86,95)", + "modifiedRange": "[88,98)", + "innerChanges": null + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/fuzzy-matching/1.txt b/src/vs/editor/test/node/diffing/fixtures/fuzzy-matching/1.txt new file mode 100644 index 00000000000..8530beeba82 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/fuzzy-matching/1.txt @@ -0,0 +1,8 @@ + +console.log(1) +console.log(2) +console.log(3) +console.log(4) +console.log(5) +console.log(6) +console.log(7) diff --git a/src/vs/editor/test/node/diffing/fixtures/fuzzy-matching/2.txt b/src/vs/editor/test/node/diffing/fixtures/fuzzy-matching/2.txt new file mode 100644 index 00000000000..808189c8bec --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/fuzzy-matching/2.txt @@ -0,0 +1,9 @@ +console.log(1); +console.log(2); +console.log(3); +console.log(4); + +console.log(5); +console.log(6); +console.log(7); + diff --git a/src/vs/editor/test/node/diffing/fixtures/fuzzy-matching/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/fuzzy-matching/experimental.expected.diff.json new file mode 100644 index 00000000000..52c3f93400f --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/fuzzy-matching/experimental.expected.diff.json @@ -0,0 +1,26 @@ +{ + "originalFileName": "./1.txt", + "modifiedFileName": "./2.txt", + "diffs": [ + { + "originalRange": "[1,1)", + "modifiedRange": "[1,9)", + "innerChanges": [ + { + "originalRange": "[1,1 -> 1,1]", + "modifiedRange": "[1,1 -> 9,1]" + } + ] + }, + { + "originalRange": "[2,9)", + "modifiedRange": "[10,10)", + "innerChanges": [ + { + "originalRange": "[2,1 -> 9,1]", + "modifiedRange": "[10,1 -> 10,1]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/fuzzy-matching/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/fuzzy-matching/smart.expected.diff.json new file mode 100644 index 00000000000..3a2b5cf1e02 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/fuzzy-matching/smart.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.txt", + "modifiedFileName": "./2.txt", + "diffs": [ + { + "originalRange": "[1,1)", + "modifiedRange": "[1,9)", + "innerChanges": null + }, + { + "originalRange": "[2,9)", + "modifiedRange": "[10,10)", + "innerChanges": null + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/indentation/1.tst b/src/vs/editor/test/node/diffing/fixtures/indentation/1.tst new file mode 100644 index 00000000000..f41bf28983f --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/indentation/1.tst @@ -0,0 +1,36 @@ +export function lineRangeMappingFromRangeMappings(alignments: RangeMapping[]): LineRangeMapping[] { + const changes: LineRangeMapping[] = []; + for (const g of group( + alignments, + (a1, a2) => + (a2.originalRange.startLineNumber - (a1.originalRange.endLineNumber - (a1.originalRange.endColumn > 1 ? 0 : 1)) <= 1) + || (a2.modifiedRange.startLineNumber - (a1.modifiedRange.endLineNumber - (a1.modifiedRange.endColumn > 1 ? 0 : 1)) <= 1) + )) { + const first = g[0]; + const last = g[g.length - 1]; + + changes.push(new LineRangeMapping( + new LineRange( + first.originalRange.startLineNumber, + last.originalRange.endLineNumber + (last.originalRange.endColumn > 1 || last.modifiedRange.endColumn > 1 ? 1 : 0) + ), + new LineRange( + first.modifiedRange.startLineNumber, + last.modifiedRange.endLineNumber + (last.originalRange.endColumn > 1 || last.modifiedRange.endColumn > 1 ? 1 : 0) + ), + g + )); + } + + assertFn(() => { + return checkAdjacentItems(changes, + (m1, m2) => m2.originalRange.startLineNumber - m1.originalRange.endLineNumberExclusive === m2.modifiedRange.startLineNumber - m1.modifiedRange.endLineNumberExclusive && + // There has to be an unchanged line in between (otherwise both diffs should have been joined) + m1.originalRange.endLineNumberExclusive < m2.originalRange.startLineNumber && + m1.modifiedRange.endLineNumberExclusive < m2.modifiedRange.startLineNumber, + ); + }); + + + return changes; +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/indentation/2.tst b/src/vs/editor/test/node/diffing/fixtures/indentation/2.tst new file mode 100644 index 00000000000..30845a978ee --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/indentation/2.tst @@ -0,0 +1,38 @@ +export function lineRangeMappingFromRangeMappings(alignments: RangeMapping[]): LineRangeMapping[] { + const changes: LineRangeMapping[] = []; + for (const g of group( + alignments, + (a1, a2) => + (a2.originalRange.startLineNumber - (a1.originalRange.endLineNumber - (a1.originalRange.endColumn > 1 ? 0 : 1)) <= 1) + || (a2.modifiedRange.startLineNumber - (a1.modifiedRange.endLineNumber - (a1.modifiedRange.endColumn > 1 ? 0 : 1)) <= 1) + )) { + if (true) { + const first = g[0]; + const last = g[g.length - 1]; + + changes.push(new LineRangeMapping( + new LineRange( + first.originalRange.startLineNumber, + last.originalRange.endLineNumber + (last.originalRange.endColumn > 1 || last.modifiedRange.endColumn > 1 ? 1 : 0) + ), + new LineRange( + first.modifiedRange.startLineNumber, + last.modifiedRange.endLineNumber + (last.originalRange.endColumn > 1 || last.modifiedRange.endColumn > 1 ? 1 : 0) + ), + g + )); + } + } + + assertFn(() => { + return checkAdjacentItems(changes, + (m1, m2) => m2.originalRange.startLineNumber - m1.originalRange.endLineNumberExclusive === m2.modifiedRange.startLineNumber - m1.modifiedRange.endLineNumberExclusive && + // There has to be an unchanged line in between (otherwise both diffs should have been joined) + m1.originalRange.endLineNumberExclusive < m2.originalRange.startLineNumber && + m1.modifiedRange.endLineNumberExclusive < m2.modifiedRange.startLineNumber, + ); + }); + + + return changes; +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/indentation/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/indentation/experimental.expected.diff.json new file mode 100644 index 00000000000..6e683c46f89 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/indentation/experimental.expected.diff.json @@ -0,0 +1,78 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[9,11)", + "modifiedRange": "[9,12)", + "innerChanges": [ + { + "originalRange": "[9,1 -> 9,1]", + "modifiedRange": "[9,1 -> 10,1]" + }, + { + "originalRange": "[9,1 -> 9,1]", + "modifiedRange": "[10,1 -> 10,2]" + }, + { + "originalRange": "[10,1 -> 10,1]", + "modifiedRange": "[11,1 -> 11,2]" + } + ] + }, + { + "originalRange": "[12,23)", + "modifiedRange": "[13,25)", + "innerChanges": [ + { + "originalRange": "[12,1 -> 12,1]", + "modifiedRange": "[13,1 -> 13,2]" + }, + { + "originalRange": "[13,1 -> 13,1]", + "modifiedRange": "[14,1 -> 14,2]" + }, + { + "originalRange": "[14,1 -> 14,1]", + "modifiedRange": "[15,1 -> 15,2]" + }, + { + "originalRange": "[15,1 -> 15,1]", + "modifiedRange": "[16,1 -> 16,2]" + }, + { + "originalRange": "[16,1 -> 16,1]", + "modifiedRange": "[17,1 -> 17,2]" + }, + { + "originalRange": "[17,1 -> 17,1]", + "modifiedRange": "[18,1 -> 18,2]" + }, + { + "originalRange": "[18,1 -> 18,1]", + "modifiedRange": "[19,1 -> 19,2]" + }, + { + "originalRange": "[19,1 -> 19,1]", + "modifiedRange": "[20,1 -> 20,2]" + }, + { + "originalRange": "[20,1 -> 20,1]", + "modifiedRange": "[21,1 -> 21,2]" + }, + { + "originalRange": "[21,1 -> 21,1]", + "modifiedRange": "[22,1 -> 22,2]" + }, + { + "originalRange": "[22,1 -> 22,1]", + "modifiedRange": "[23,1 -> 23,2]" + }, + { + "originalRange": "[23,1 -> 23,1]", + "modifiedRange": "[24,1 -> 25,1]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/indentation/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/indentation/smart.expected.diff.json new file mode 100644 index 00000000000..1673eac315e --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/indentation/smart.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[9,11)", + "modifiedRange": "[9,12)", + "innerChanges": null + }, + { + "originalRange": "[12,23)", + "modifiedRange": "[13,25)", + "innerChanges": null + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/intra-block-align/1.txt b/src/vs/editor/test/node/diffing/fixtures/intra-block-align/1.txt new file mode 100644 index 00000000000..5b1da6edfa1 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/intra-block-align/1.txt @@ -0,0 +1,4 @@ +console.log(1); +console.log(2); +console.log(3); +console.log(4); diff --git a/src/vs/editor/test/node/diffing/fixtures/intra-block-align/2.txt b/src/vs/editor/test/node/diffing/fixtures/intra-block-align/2.txt new file mode 100644 index 00000000000..1def7d3472a --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/intra-block-align/2.txt @@ -0,0 +1,3 @@ +console.log(1) +console.log(2) +console.log(4) diff --git a/src/vs/editor/test/node/diffing/fixtures/intra-block-align/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/intra-block-align/experimental.expected.diff.json new file mode 100644 index 00000000000..7ac4028731d --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/intra-block-align/experimental.expected.diff.json @@ -0,0 +1,24 @@ +{ + "originalFileName": "./1.txt", + "modifiedFileName": "./2.txt", + "diffs": [ + { + "originalRange": "[1,5)", + "modifiedRange": "[1,4)", + "innerChanges": [ + { + "originalRange": "[1,15 -> 1,16]", + "modifiedRange": "[1,15 -> 1,15]" + }, + { + "originalRange": "[2,15 -> 3,16]", + "modifiedRange": "[2,15 -> 2,15]" + }, + { + "originalRange": "[4,15 -> 4,16]", + "modifiedRange": "[3,15 -> 3,15]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/intra-block-align/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/intra-block-align/smart.expected.diff.json new file mode 100644 index 00000000000..7ac4028731d --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/intra-block-align/smart.expected.diff.json @@ -0,0 +1,24 @@ +{ + "originalFileName": "./1.txt", + "modifiedFileName": "./2.txt", + "diffs": [ + { + "originalRange": "[1,5)", + "modifiedRange": "[1,4)", + "innerChanges": [ + { + "originalRange": "[1,15 -> 1,16]", + "modifiedRange": "[1,15 -> 1,15]" + }, + { + "originalRange": "[2,15 -> 3,16]", + "modifiedRange": "[2,15 -> 2,15]" + }, + { + "originalRange": "[4,15 -> 4,16]", + "modifiedRange": "[3,15 -> 3,15]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/json-brackets/1.json b/src/vs/editor/test/node/diffing/fixtures/json-brackets/1.json new file mode 100644 index 00000000000..7fa1a6519a7 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/json-brackets/1.json @@ -0,0 +1,478 @@ +{ + "editor": [ + { + "name": "vs/platform", + "project": "vscode-editor" + }, + { + "name": "vs/editor/contrib", + "project": "vscode-editor" + }, + { + "name": "vs/editor", + "project": "vscode-editor" + }, + { + "name": "vs/base", + "project": "vscode-editor" + } + ], + "workbench": [ + { + "name": "vs/code", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/api/common", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/bulkEdit", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/cli", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/codeEditor", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/callHierarchy", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/typeHierarchy", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/codeActions", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/comments", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/debug", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/dialogs", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/emmet", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/experiments", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/extensions", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/externalTerminal", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/feedback", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/files", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/html", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/issue", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/inlayHints", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/interactive", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/languageStatus", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/keybindings", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/markers", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/mergeEditor", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/localization", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/logs", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/output", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/performance", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/preferences", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/notebook", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/quickaccess", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/userData", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/remote", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/relauncher", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/sash", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/scm", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/search", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/searchEditor", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/snippets", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/format", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/tags", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/surveys", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/tasks", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/testing", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/terminal", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/themes", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/trust", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/update", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/url", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/watermark", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/webview", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/webviewPanel", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/workspace", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/workspaces", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/customEditor", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/externalUriOpener", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/welcomeGettingStarted", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/welcomeOverlay", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/welcomePage", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/welcomeViews", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/welcomeWalkthrough", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/outline", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/userDataSync", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/editSessions", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/views", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/languageDetection", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/audioCues", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/deprecatedExtensionMigrator", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/offline", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/actions", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/authToken", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/backup", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/bulkEdit", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/clipboard", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/commands", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/configuration", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/configurationResolver", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/dialogs", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/editor", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/extensions", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/extensionManagement", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/files", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/history", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/log", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/integrity", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/keybinding", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/lifecycle", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/language", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/progress", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/remote", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/search", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/textfile", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/themes", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/textMate", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/workingCopy", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/workspaces", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/decorations", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/label", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/preferences", + "project": "vscode-preferences" + }, + { + "name": "vs/workbench/services/notification", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/userData", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/userDataSync", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/editSessions", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/views", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/timeline", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/localHistory", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/authentication", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/extensionRecommendations", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/gettingStarted", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/host", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/userDataProfile", + "project": "vscode-profiles" + }, + { + "name": "vs/workbench/services/userDataProfile", + "project": "vscode-profiles" + } + ] +} diff --git a/src/vs/editor/test/node/diffing/fixtures/json-brackets/2.json b/src/vs/editor/test/node/diffing/fixtures/json-brackets/2.json new file mode 100644 index 00000000000..dd949e618f2 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/json-brackets/2.json @@ -0,0 +1,482 @@ +{ + "editor": [ + { + "name": "vs/platform", + "project": "vscode-editor" + }, + { + "name": "vs/editor/contrib", + "project": "vscode-editor" + }, + { + "name": "vs/editor", + "project": "vscode-editor" + }, + { + "name": "vs/base", + "project": "vscode-editor" + } + ], + "workbench": [ + { + "name": "vs/code", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/api/common", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/bulkEdit", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/cli", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/codeEditor", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/callHierarchy", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/typeHierarchy", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/codeActions", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/comments", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/debug", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/dialogs", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/emmet", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/experiments", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/extensions", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/externalTerminal", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/feedback", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/files", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/html", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/issue", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/inlayHints", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/interactive", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/languageStatus", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/keybindings", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/markers", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/mergeEditor", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/localization", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/logs", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/output", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/performance", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/preferences", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/notebook", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/quickaccess", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/userData", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/remote", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/relauncher", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/sash", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/scm", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/search", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/searchEditor", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/snippets", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/format", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/tags", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/surveys", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/tasks", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/testing", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/terminal", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/themes", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/trust", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/update", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/url", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/watermark", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/webview", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/webviewPanel", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/workspace", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/workspaces", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/customEditor", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/externalUriOpener", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/welcomeGettingStarted", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/welcomeOverlay", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/welcomePage", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/welcomeViews", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/welcomeWalkthrough", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/outline", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/userDataSync", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/editSessions", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/views", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/languageDetection", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/audioCues", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/deprecatedExtensionMigrator", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/bracketPairColorizer2Telemetry", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/offline", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/actions", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/authToken", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/backup", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/bulkEdit", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/clipboard", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/commands", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/configuration", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/configurationResolver", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/dialogs", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/editor", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/extensions", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/extensionManagement", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/files", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/history", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/log", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/integrity", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/keybinding", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/lifecycle", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/language", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/progress", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/remote", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/search", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/textfile", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/themes", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/textMate", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/workingCopy", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/workspaces", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/decorations", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/label", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/preferences", + "project": "vscode-preferences" + }, + { + "name": "vs/workbench/services/notification", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/userData", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/userDataSync", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/editSessions", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/views", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/timeline", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/localHistory", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/authentication", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/extensionRecommendations", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/gettingStarted", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/services/host", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/userDataProfile", + "project": "vscode-profiles" + }, + { + "name": "vs/workbench/services/userDataProfile", + "project": "vscode-profiles" + } + ] +} diff --git a/src/vs/editor/test/node/diffing/fixtures/json-brackets/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/json-brackets/experimental.expected.diff.json new file mode 100644 index 00000000000..7e258364cfc --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/json-brackets/experimental.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.json", + "modifiedFileName": "./2.json", + "diffs": [ + { + "originalRange": "[301,301)", + "modifiedRange": "[301,305)", + "innerChanges": [ + { + "originalRange": "[301,1 -> 301,1]", + "modifiedRange": "[301,1 -> 305,1]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/json-brackets/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/json-brackets/smart.expected.diff.json new file mode 100644 index 00000000000..93b4f55206e --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/json-brackets/smart.expected.diff.json @@ -0,0 +1,11 @@ +{ + "originalFileName": "./1.json", + "modifiedFileName": "./2.json", + "diffs": [ + { + "originalRange": "[302,302)", + "modifiedRange": "[302,306)", + "innerChanges": null + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/just-whitespace/1.js b/src/vs/editor/test/node/diffing/fixtures/just-whitespace/1.js new file mode 100644 index 00000000000..78f00467983 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/just-whitespace/1.js @@ -0,0 +1 @@ +console.log('foo'); \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/just-whitespace/2.js b/src/vs/editor/test/node/diffing/fixtures/just-whitespace/2.js new file mode 100644 index 00000000000..3c800d3a788 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/just-whitespace/2.js @@ -0,0 +1 @@ +console.log('foo'); \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/just-whitespace/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/just-whitespace/experimental.expected.diff.json new file mode 100644 index 00000000000..cf6f3ec5f25 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/just-whitespace/experimental.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.js", + "modifiedFileName": "./2.js", + "diffs": [ + { + "originalRange": "[1,2)", + "modifiedRange": "[1,2)", + "innerChanges": [ + { + "originalRange": "[1,20 -> 1,21]", + "modifiedRange": "[1,20 -> 1,20]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/just-whitespace/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/just-whitespace/smart.expected.diff.json new file mode 100644 index 00000000000..cf6f3ec5f25 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/just-whitespace/smart.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.js", + "modifiedFileName": "./2.js", + "diffs": [ + { + "originalRange": "[1,2)", + "modifiedRange": "[1,2)", + "innerChanges": [ + { + "originalRange": "[1,20 -> 1,21]", + "modifiedRange": "[1,20 -> 1,20]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/method-splitting/1.tst b/src/vs/editor/test/node/diffing/fixtures/method-splitting/1.tst new file mode 100644 index 00000000000..41ec64f1b1e --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/method-splitting/1.tst @@ -0,0 +1,71 @@ +class Test { + public getDecorationsViewportData(viewRange: Range): IDecorationsViewportData { + return null!; + } + + public getInlineDecorationsOnLine(lineNumber: number): InlineDecoration[] { + const range = new Range(lineNumber, this._linesCollection.getViewLineMinColumn(lineNumber), lineNumber, this._linesCollection.getViewLineMaxColumn(lineNumber)); + return this._getDecorationsInRange(range).inlineDecorations[0]; + } + + private _getDecorationsInRange(viewRange: Range): IDecorationsViewportData { + const modelDecorations = this._linesCollection.getDecorationsInRange(viewRange, this.editorId, filterValidationDecorations(this.configuration.options)); + const startLineNumber = viewRange.startLineNumber; + const endLineNumber = viewRange.endLineNumber; + + const decorationsInViewport: ViewModelDecoration[] = []; + let decorationsInViewportLen = 0; + const inlineDecorations: InlineDecoration[][] = []; + for (let j = startLineNumber; j <= endLineNumber; j++) { + inlineDecorations[j - startLineNumber] = []; + } + + for (let i = 0, len = modelDecorations.length; i < len; i++) { + const modelDecoration = modelDecorations[i]; + const decorationOptions = modelDecoration.options; + + if (!isModelDecorationVisible(this.model, modelDecoration)) { + continue; + } + + const viewModelDecoration = this._getOrCreateViewModelDecoration(modelDecoration); + const viewRange = viewModelDecoration.range; + + decorationsInViewport[decorationsInViewportLen++] = viewModelDecoration; + + if (decorationOptions.inlineClassName) { + const inlineDecoration = new InlineDecoration(viewRange, decorationOptions.inlineClassName, decorationOptions.inlineClassNameAffectsLetterSpacing ? InlineDecorationType.RegularAffectingLetterSpacing : InlineDecorationType.Regular); + const intersectedStartLineNumber = Math.max(startLineNumber, viewRange.startLineNumber); + const intersectedEndLineNumber = Math.min(endLineNumber, viewRange.endLineNumber); + for (let j = intersectedStartLineNumber; j <= intersectedEndLineNumber; j++) { + inlineDecorations[j - startLineNumber].push(inlineDecoration); + } + } + if (decorationOptions.beforeContentClassName) { + if (startLineNumber <= viewRange.startLineNumber && viewRange.startLineNumber <= endLineNumber) { + const inlineDecoration = new InlineDecoration( + new Range(viewRange.startLineNumber, viewRange.startColumn, viewRange.startLineNumber, viewRange.startColumn), + decorationOptions.beforeContentClassName, + InlineDecorationType.Before + ); + inlineDecorations[viewRange.startLineNumber - startLineNumber].push(inlineDecoration); + } + } + if (decorationOptions.afterContentClassName) { + if (startLineNumber <= viewRange.endLineNumber && viewRange.endLineNumber <= endLineNumber) { + const inlineDecoration = new InlineDecoration( + new Range(viewRange.endLineNumber, viewRange.endColumn, viewRange.endLineNumber, viewRange.endColumn), + decorationOptions.afterContentClassName, + InlineDecorationType.After + ); + inlineDecorations[viewRange.endLineNumber - startLineNumber].push(inlineDecoration); + } + } + } + + return { + decorations: decorationsInViewport, + inlineDecorations: inlineDecorations + }; + } +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/method-splitting/2.tst b/src/vs/editor/test/node/diffing/fixtures/method-splitting/2.tst new file mode 100644 index 00000000000..f74aaa81fc2 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/method-splitting/2.tst @@ -0,0 +1,67 @@ +class Test { + public getDecorationsViewportData(viewRange: Range): IDecorationsViewportData { + return null!; + } + + private _getDecorationsViewportData(viewportRange: Range, onlyMinimapDecorations: boolean): IDecorationsViewportData { + const modelDecorations = this._linesCollection.getDecorationsInRange(viewportRange, this.editorId, filterValidationDecorations(this.configuration.options), onlyMinimapDecorations); + + const startLineNumber = viewportRange.startLineNumber; + const endLineNumber = viewportRange.endLineNumber; + + const decorationsInViewport: ViewModelDecoration[] = []; + let decorationsInViewportLen = 0; + const inlineDecorations: InlineDecoration[][] = []; + for (let j = startLineNumber; j <= endLineNumber; j++) { + inlineDecorations[j - startLineNumber] = []; + } + + for (let i = 0, len = modelDecorations.length; i < len; i++) { + const modelDecoration = modelDecorations[i]; + const decorationOptions = modelDecoration.options; + + if (!isModelDecorationVisible(this.model, modelDecoration)) { + continue; + } + + const viewModelDecoration = this._getOrCreateViewModelDecoration(modelDecoration); + const viewRange = viewModelDecoration.range; + + decorationsInViewport[decorationsInViewportLen++] = viewModelDecoration; + + if (decorationOptions.inlineClassName) { + const inlineDecoration = new InlineDecoration(viewRange, decorationOptions.inlineClassName, decorationOptions.inlineClassNameAffectsLetterSpacing ? InlineDecorationType.RegularAffectingLetterSpacing : InlineDecorationType.Regular); + const intersectedStartLineNumber = Math.max(startLineNumber, viewRange.startLineNumber); + const intersectedEndLineNumber = Math.min(endLineNumber, viewRange.endLineNumber); + for (let j = intersectedStartLineNumber; j <= intersectedEndLineNumber; j++) { + inlineDecorations[j - startLineNumber].push(inlineDecoration); + } + } + if (decorationOptions.beforeContentClassName) { + if (startLineNumber <= viewRange.startLineNumber && viewRange.startLineNumber <= endLineNumber) { + const inlineDecoration = new InlineDecoration( + new Range(viewRange.startLineNumber, viewRange.startColumn, viewRange.startLineNumber, viewRange.startColumn), + decorationOptions.beforeContentClassName, + InlineDecorationType.Before + ); + inlineDecorations[viewRange.startLineNumber - startLineNumber].push(inlineDecoration); + } + } + if (decorationOptions.afterContentClassName) { + if (startLineNumber <= viewRange.endLineNumber && viewRange.endLineNumber <= endLineNumber) { + const inlineDecoration = new InlineDecoration( + new Range(viewRange.endLineNumber, viewRange.endColumn, viewRange.endLineNumber, viewRange.endColumn), + decorationOptions.afterContentClassName, + InlineDecorationType.After + ); + inlineDecorations[viewRange.endLineNumber - startLineNumber].push(inlineDecoration); + } + } + } + + return { + decorations: decorationsInViewport, + inlineDecorations: inlineDecorations + }; + } +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/method-splitting/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/method-splitting/experimental.expected.diff.json new file mode 100644 index 00000000000..1c1ebba93cd --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/method-splitting/experimental.expected.diff.json @@ -0,0 +1,278 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[6,10)", + "modifiedRange": "[6,8)", + "innerChanges": [ + { + "originalRange": "[6,3 -> 6,6]", + "modifiedRange": "[6,3 -> 6,4]" + }, + { + "originalRange": "[6,7 -> 6,8]", + "modifiedRange": "[6,5 -> 6,9]" + }, + { + "originalRange": "[6,9 -> 6,9]", + "modifiedRange": "[6,10 -> 6,11]" + }, + { + "originalRange": "[6,12 -> 6,18]", + "modifiedRange": "[6,14 -> 6,14]" + }, + { + "originalRange": "[6,29 -> 6,32]", + "modifiedRange": "[6,25 -> 6,26]" + }, + { + "originalRange": "[6,33 -> 6,34]", + "modifiedRange": "[6,27 -> 6,27]" + }, + { + "originalRange": "[6,35 -> 6,35]", + "modifiedRange": "[6,28 -> 6,37]" + }, + { + "originalRange": "[6,36 -> 6,37]", + "modifiedRange": "[6,38 -> 6,39]" + }, + { + "originalRange": "[6,38 -> 6,38]", + "modifiedRange": "[6,40 -> 6,48]" + }, + { + "originalRange": "[6,39 -> 6,39]", + "modifiedRange": "[6,49 -> 6,50]" + }, + { + "originalRange": "[6,40 -> 6,42]", + "modifiedRange": "[6,51 -> 6,68]" + }, + { + "originalRange": "[6,43 -> 6,44]", + "modifiedRange": "[6,69 -> 6,72]" + }, + { + "originalRange": "[6,45 -> 6,45]", + "modifiedRange": "[6,73 -> 6,75]" + }, + { + "originalRange": "[6,46 -> 6,46]", + "modifiedRange": "[6,76 -> 6,82]" + }, + { + "originalRange": "[6,48 -> 6,51]", + "modifiedRange": "[6,84 -> 6,84]" + }, + { + "originalRange": "[6,52 -> 6,52]", + "modifiedRange": "[6,85 -> 6,88]" + }, + { + "originalRange": "[6,53 -> 6,54]", + "modifiedRange": "[6,89 -> 6,91]" + }, + { + "originalRange": "[6,58 -> 6,63]", + "modifiedRange": "[6,95 -> 6,95]" + }, + { + "originalRange": "[6,73 -> 6,75]", + "modifiedRange": "[6,105 -> 6,118]" + }, + { + "originalRange": "[7,9 -> 7,13]", + "modifiedRange": "[7,9 -> 7,12]" + }, + { + "originalRange": "[7,14 -> 7,18]", + "modifiedRange": "[7,13 -> 7,15]" + }, + { + "originalRange": "[7,19 -> 7,22]", + "modifiedRange": "[7,16 -> 7,19]" + }, + { + "originalRange": "[7,23 -> 7,28]", + "modifiedRange": "[7,20 -> 7,21]" + }, + { + "originalRange": "[7,29 -> 7,29]", + "modifiedRange": "[7,22 -> 7,23]" + }, + { + "originalRange": "[7,30 -> 7,38]", + "modifiedRange": "[7,24 -> 7,27]" + }, + { + "originalRange": "[7,64 -> 7,66]", + "modifiedRange": "[7,53 -> 7,54]" + }, + { + "originalRange": "[7,67 -> 7,69]", + "modifiedRange": "[7,55 -> 7,60]" + }, + { + "originalRange": "[7,70 -> 7,70]", + "modifiedRange": "[7,61 -> 7,62]" + }, + { + "originalRange": "[7,71 -> 7,74]", + "modifiedRange": "[7,63 -> 7,65]" + }, + { + "originalRange": "[7,75 -> 7,80]", + "modifiedRange": "[7,66 -> 7,68]" + }, + { + "originalRange": "[7,81 -> 7,81]", + "modifiedRange": "[7,69 -> 7,71]" + }, + { + "originalRange": "[7,82 -> 7,83]", + "modifiedRange": "[7,72 -> 7,73]" + }, + { + "originalRange": "[7,84 -> 7,85]", + "modifiedRange": "[7,74 -> 7,74]" + }, + { + "originalRange": "[7,86 -> 7,91]", + "modifiedRange": "[7,75 -> 7,78]" + }, + { + "originalRange": "[7,92 -> 7,97]", + "modifiedRange": "[7,79 -> 7,82]" + }, + { + "originalRange": "[7,98 -> 7,98]", + "modifiedRange": "[7,83 -> 7,84]" + }, + { + "originalRange": "[7,99 -> 7,105]", + "modifiedRange": "[7,85 -> 7,85]" + }, + { + "originalRange": "[7,112 -> 7,116]", + "modifiedRange": "[7,92 -> 7,92]" + }, + { + "originalRange": "[7,117 -> 7,119]", + "modifiedRange": "[7,93 -> 7,96]" + }, + { + "originalRange": "[7,120 -> 7,120]", + "modifiedRange": "[7,97 -> 7,104]" + }, + { + "originalRange": "[7,121 -> 7,124]", + "modifiedRange": "[7,105 -> 7,105]" + }, + { + "originalRange": "[7,125 -> 7,130]", + "modifiedRange": "[7,106 -> 7,106]" + }, + { + "originalRange": "[7,131 -> 7,132]", + "modifiedRange": "[7,107 -> 7,108]" + }, + { + "originalRange": "[7,133 -> 7,133]", + "modifiedRange": "[7,109 -> 7,111]" + }, + { + "originalRange": "[7,134 -> 7,137]", + "modifiedRange": "[7,112 -> 7,115]" + }, + { + "originalRange": "[7,138 -> 7,138]", + "modifiedRange": "[7,116 -> 7,117]" + }, + { + "originalRange": "[7,139 -> 7,139]", + "modifiedRange": "[7,118 -> 7,119]" + }, + { + "originalRange": "[7,140 -> 7,141]", + "modifiedRange": "[7,120 -> 7,123]" + }, + { + "originalRange": "[7,142 -> 7,144]", + "modifiedRange": "[7,124 -> 7,126]" + }, + { + "originalRange": "[7,145 -> 7,148]", + "modifiedRange": "[7,127 -> 7,127]" + }, + { + "originalRange": "[7,149 -> 7,149]", + "modifiedRange": "[7,128 -> 7,129]" + }, + { + "originalRange": "[7,150 -> 8,5]", + "modifiedRange": "[7,130 -> 7,130]" + }, + { + "originalRange": "[8,6 -> 8,11]", + "modifiedRange": "[7,131 -> 7,131]" + }, + { + "originalRange": "[8,15 -> 8,21]", + "modifiedRange": "[7,135 -> 7,135]" + }, + { + "originalRange": "[8,23 -> 8,23]", + "modifiedRange": "[7,137 -> 7,142]" + }, + { + "originalRange": "[8,29 -> 8,44]", + "modifiedRange": "[7,148 -> 7,148]" + }, + { + "originalRange": "[8,45 -> 8,45]", + "modifiedRange": "[7,149 -> 7,152]" + }, + { + "originalRange": "[8,46 -> 8,46]", + "modifiedRange": "[7,153 -> 7,160]" + }, + { + "originalRange": "[8,48 -> 8,48]", + "modifiedRange": "[7,162 -> 7,164]" + }, + { + "originalRange": "[8,50 -> 8,51]", + "modifiedRange": "[7,166 -> 7,170]" + }, + { + "originalRange": "[8,62 -> 8,65]", + "modifiedRange": "[7,181 -> 7,182]" + }, + { + "originalRange": "[8,66 -> 9,3]", + "modifiedRange": "[7,183 -> 7,183]" + } + ] + }, + { + "originalRange": "[11,15)", + "modifiedRange": "[9,11)", + "innerChanges": [ + { + "originalRange": "[11,1 -> 13,1]", + "modifiedRange": "[9,1 -> 9,1]" + }, + { + "originalRange": "[13,31 -> 13,31]", + "modifiedRange": "[9,31 -> 9,35]" + }, + { + "originalRange": "[14,29 -> 14,29]", + "modifiedRange": "[10,29 -> 10,33]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/method-splitting/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/method-splitting/smart.expected.diff.json new file mode 100644 index 00000000000..d0b4abc03ed --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/method-splitting/smart.expected.diff.json @@ -0,0 +1,78 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[6,10)", + "modifiedRange": "[6,8)", + "innerChanges": [ + { + "originalRange": "[6,3 -> 6,9]", + "modifiedRange": "[6,3 -> 6,11]" + }, + { + "originalRange": "[6,12 -> 6,18]", + "modifiedRange": "[6,14 -> 6,14]" + }, + { + "originalRange": "[6,29 -> 6,54]", + "modifiedRange": "[6,25 -> 6,91]" + }, + { + "originalRange": "[6,58 -> 6,63]", + "modifiedRange": "[6,95 -> 6,95]" + }, + { + "originalRange": "[6,73 -> 6,75]", + "modifiedRange": "[6,105 -> 6,118]" + }, + { + "originalRange": "[7,9 -> 7,38]", + "modifiedRange": "[7,9 -> 7,27]" + }, + { + "originalRange": "[7,64 -> 7,105]", + "modifiedRange": "[7,53 -> 7,85]" + }, + { + "originalRange": "[7,112 -> 7,124]", + "modifiedRange": "[7,92 -> 7,114]" + }, + { + "originalRange": "[7,128 -> 8,10]", + "modifiedRange": "[7,118 -> 7,130]" + }, + { + "originalRange": "[8,15 -> 8,23]", + "modifiedRange": "[7,135 -> 7,142]" + }, + { + "originalRange": "[8,29 -> 8,51]", + "modifiedRange": "[7,148 -> 7,170]" + }, + { + "originalRange": "[8,62 -> 9,3]", + "modifiedRange": "[7,181 -> 7,183]" + } + ] + }, + { + "originalRange": "[11,15)", + "modifiedRange": "[9,11)", + "innerChanges": [ + { + "originalRange": "[11,1 -> 13,1]", + "modifiedRange": "[9,1 -> 9,1]" + }, + { + "originalRange": "[13,31 -> 13,31]", + "modifiedRange": "[9,31 -> 9,35]" + }, + { + "originalRange": "[14,29 -> 14,29]", + "modifiedRange": "[10,29 -> 10,33]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/minimal-diff-character/1.tst b/src/vs/editor/test/node/diffing/fixtures/minimal-diff-character/1.tst new file mode 100644 index 00000000000..b9fd35ebace --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/minimal-diff-character/1.tst @@ -0,0 +1,5 @@ +import * as path from 'path'; +import { Command } from 'vscode'; +import * as nls from 'vscode-nls'; + +"()()()()()()()()()()()()()" \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/minimal-diff-character/2.tst b/src/vs/editor/test/node/diffing/fixtures/minimal-diff-character/2.tst new file mode 100644 index 00000000000..44b380e2bdb --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/minimal-diff-character/2.tst @@ -0,0 +1,5 @@ +import * as path from 'path'; +import { Command, commands } from 'vscode'; +import * as nls from 'vscode-nls'; + +"Gallicum()est()divisa()in()partres()tres()quarum()unam()est()()()()()()()()()()()()" \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/minimal-diff-character/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/minimal-diff-character/experimental.expected.diff.json new file mode 100644 index 00000000000..a0aea479fa4 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/minimal-diff-character/experimental.expected.diff.json @@ -0,0 +1,30 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[2,3)", + "modifiedRange": "[2,3)", + "innerChanges": [ + { + "originalRange": "[2,17 -> 2,17]", + "modifiedRange": "[2,17 -> 2,27]" + } + ] + }, + { + "originalRange": "[5,6)", + "modifiedRange": "[5,6)", + "innerChanges": [ + { + "originalRange": "[5,2 -> 5,2]", + "modifiedRange": "[5,2 -> 5,56]" + }, + { + "originalRange": "[5,4 -> 5,4]", + "modifiedRange": "[5,58 -> 5,61]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/minimal-diff-character/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/minimal-diff-character/smart.expected.diff.json new file mode 100644 index 00000000000..430db713be3 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/minimal-diff-character/smart.expected.diff.json @@ -0,0 +1,26 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[2,3)", + "modifiedRange": "[2,3)", + "innerChanges": [ + { + "originalRange": "[2,17 -> 2,17]", + "modifiedRange": "[2,17 -> 2,27]" + } + ] + }, + { + "originalRange": "[5,6)", + "modifiedRange": "[5,6)", + "innerChanges": [ + { + "originalRange": "[5,2 -> 5,4]", + "modifiedRange": "[5,2 -> 5,61]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/subword/1.tst b/src/vs/editor/test/node/diffing/fixtures/subword/1.tst new file mode 100644 index 00000000000..d4e043303e5 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/subword/1.tst @@ -0,0 +1,5 @@ +import { EditorSimpleWorker } from 'vs/editor/common/services/editorSimpleWorker'; +import { IEditorWorkerService, IUnicodeHighlightsResult } from 'vs/editor/common/services/editorWorker'; +import { IModelService } from 'vs/editor/common/services/model'; + +let x: [IEditorWorkerService, EditorSimpleWorker, IModelService, IUnicodeHighlightsResult]; \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/subword/2.tst b/src/vs/editor/test/node/diffing/fixtures/subword/2.tst new file mode 100644 index 00000000000..94f016c889b --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/subword/2.tst @@ -0,0 +1,6 @@ +import { EditorSimpleWorker } from 'vs/editor/common/services/editorSimpleWorker'; +import { IDiffComputationResult, IEditorWorkerService, IUnicodeHighlightsResult } from 'vs/editor/common/services/editorWorker'; +import { IModelService } from 'vs/editor/common/services/model'; + +let x: [IEditorWorkerService, EditorSimpleWorker, IModelService, IUnicodeHighlightsResult]; +let y: IDiffComputationResult; \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/subword/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/subword/experimental.expected.diff.json new file mode 100644 index 00000000000..d1e2aa57bee --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/subword/experimental.expected.diff.json @@ -0,0 +1,26 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[2,3)", + "modifiedRange": "[2,3)", + "innerChanges": [ + { + "originalRange": "[2,9 -> 2,9]", + "modifiedRange": "[2,9 -> 2,33]" + } + ] + }, + { + "originalRange": "[6,6)", + "modifiedRange": "[6,7)", + "innerChanges": [ + { + "originalRange": "[6,1 -> 6,1]", + "modifiedRange": "[6,1 -> 7,1]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/subword/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/subword/smart.expected.diff.json new file mode 100644 index 00000000000..795a5a1d248 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/subword/smart.expected.diff.json @@ -0,0 +1,21 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[2,3)", + "modifiedRange": "[2,3)", + "innerChanges": [ + { + "originalRange": "[2,11 -> 2,11]", + "modifiedRange": "[2,11 -> 2,35]" + } + ] + }, + { + "originalRange": "[6,6)", + "modifiedRange": "[6,7)", + "innerChanges": null + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/trivial/1.txt b/src/vs/editor/test/node/diffing/fixtures/trivial/1.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/vs/editor/test/node/diffing/fixtures/trivial/2.txt b/src/vs/editor/test/node/diffing/fixtures/trivial/2.txt new file mode 100644 index 00000000000..c1b0730e013 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/trivial/2.txt @@ -0,0 +1 @@ +x \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/trivial/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/trivial/experimental.expected.diff.json new file mode 100644 index 00000000000..82196225144 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/trivial/experimental.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.txt", + "modifiedFileName": "./2.txt", + "diffs": [ + { + "originalRange": "[1,2)", + "modifiedRange": "[1,2)", + "innerChanges": [ + { + "originalRange": "[1,1 -> 1,1]", + "modifiedRange": "[1,1 -> 1,2]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/trivial/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/trivial/smart.expected.diff.json new file mode 100644 index 00000000000..6068fbfd5b1 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/trivial/smart.expected.diff.json @@ -0,0 +1,11 @@ +{ + "originalFileName": "./1.txt", + "modifiedFileName": "./2.txt", + "diffs": [ + { + "originalRange": "[1,2)", + "modifiedRange": "[1,2)", + "innerChanges": null + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-comments/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-comments/1.tst new file mode 100644 index 00000000000..cc22cad9aae --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-comments/1.tst @@ -0,0 +1,12 @@ +interface Test { + /** + * Render +/- indicators for added/deleted changes. + * Defaults to true. + */ + renderIndicators?: boolean; + /** + * Original model should be editable? + * Defaults to false. + */ + originalEditable?: boolean; +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-comments/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-comments/2.tst new file mode 100644 index 00000000000..3650024093c --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-comments/2.tst @@ -0,0 +1,17 @@ +interface Test { + /** + * Render +/- indicators for added/deleted changes. + * Defaults to true. + */ + renderIndicators?: boolean; + /** + * Shows icons in the glyph margin to revert changes. + * Default to true. + */ + renderMarginRevertIcon?: boolean; + /** + * Original model should be editable? + * Defaults to false. + */ + originalEditable?: boolean; +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-comments/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-comments/experimental.expected.diff.json new file mode 100644 index 00000000000..6bdd24212ff --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-comments/experimental.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[7,7)", + "modifiedRange": "[7,12)", + "innerChanges": [ + { + "originalRange": "[7,1 -> 7,1]", + "modifiedRange": "[7,1 -> 12,1]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-comments/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-comments/smart.expected.diff.json new file mode 100644 index 00000000000..e5fb2b96111 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-comments/smart.expected.diff.json @@ -0,0 +1,11 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[8,8)", + "modifiedRange": "[8,13)", + "innerChanges": null + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-confusing-2/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-confusing-2/1.tst new file mode 100644 index 00000000000..d709bbb57e9 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-confusing-2/1.tst @@ -0,0 +1,33 @@ +class Test { + // ---- BEGIN diff -------------------------------------------------------------------------- + + public async computeDiff(originalUrl: string, modifiedUrl: string, ignoreTrimWhitespace: boolean, maxComputationTime: number): Promise { + const original = this._getModel(originalUrl); + const modified = this._getModel(modifiedUrl); + if (!original || !modified) { + return null; + } + + return EditorSimpleWorker.computeDiff(original, modified, ignoreTrimWhitespace, maxComputationTime); + } + + public static computeDiff(originalTextModel: ICommonModel | ITextModel, modifiedTextModel: ICommonModel | ITextModel, ignoreTrimWhitespace: boolean, maxComputationTime: number): IDiffComputationResult | null { + const originalLines = originalTextModel.getLinesContent(); + const modifiedLines = modifiedTextModel.getLinesContent(); + const diffComputer = new DiffComputer(originalLines, modifiedLines, { + shouldComputeCharChanges: true, + shouldPostProcessCharChanges: true, + shouldIgnoreTrimWhitespace: ignoreTrimWhitespace, + shouldMakePrettyDiff: true, + maxComputationTime: maxComputationTime + }); + + const diffResult = diffComputer.computeDiff(); + const identical = (diffResult.changes.length > 0 ? false : this._modelsAreIdentical(originalTextModel, modifiedTextModel)); + return { + quitEarly: diffResult.quitEarly, + identical: identical, + changes: diffResult.changes + }; + } +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-confusing-2/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-confusing-2/2.tst new file mode 100644 index 00000000000..7de284ec7a0 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-confusing-2/2.tst @@ -0,0 +1,40 @@ +class Test { + // ---- BEGIN diff -------------------------------------------------------------------------- + + public async computeDiff(originalUrl: string, modifiedUrl: string, options: ILinesDiffComputerOptions): Promise { + const original = this._getModel(originalUrl); + const modified = this._getModel(modifiedUrl); + if (!original || !modified) { + return null; + } + + return EditorSimpleWorker.computeDiff(original, modified, options); + } + + public static computeDiff(originalTextModel: ICommonModel | ITextModel, modifiedTextModel: ICommonModel | ITextModel, options: ILinesDiffComputerOptions): IDiffComputationResult { + + const diffAlgorithm: ILinesDiffComputer = options.diffAlgorithm === 'experimental' ? linesDiffComputers.experimental : linesDiffComputers.smart; + + const originalLines = originalTextModel.getLinesContent(); + const modifiedLines = modifiedTextModel.getLinesContent(); + + const result = diffAlgorithm.computeDiff(originalLines, modifiedLines, options); + + const identical = (result.changes.length > 0 ? false : this._modelsAreIdentical(originalTextModel, modifiedTextModel)); + + return { + identical, + quitEarly: result.quitEarly, + changes: result.changes.map(m => ([m.originalRange.startLineNumber, m.originalRange.endLineNumberExclusive, m.modifiedRange.startLineNumber, m.modifiedRange.endLineNumberExclusive, m.innerChanges?.map(m => [ + m.originalRange.startLineNumber, + m.originalRange.startColumn, + m.originalRange.endLineNumber, + m.originalRange.endColumn, + m.modifiedRange.startLineNumber, + m.modifiedRange.startColumn, + m.modifiedRange.endLineNumber, + m.modifiedRange.endColumn, + ])])) + }; + } +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-confusing-2/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-confusing-2/experimental.expected.diff.json new file mode 100644 index 00000000000..1fdc1077112 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-confusing-2/experimental.expected.diff.json @@ -0,0 +1,508 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[2,3)", + "modifiedRange": "[2,3)", + "innerChanges": [ + { + "originalRange": "[2,1 -> 2,5]", + "modifiedRange": "[2,1 -> 2,2]" + } + ] + }, + { + "originalRange": "[4,5)", + "modifiedRange": "[4,5)", + "innerChanges": [ + { + "originalRange": "[4,69 -> 4,69]", + "modifiedRange": "[4,69 -> 4,72]" + }, + { + "originalRange": "[4,70 -> 4,71]", + "modifiedRange": "[4,73 -> 4,74]" + }, + { + "originalRange": "[4,72 -> 4,84]", + "modifiedRange": "[4,75 -> 4,75]" + }, + { + "originalRange": "[4,85 -> 4,89]", + "modifiedRange": "[4,76 -> 4,76]" + }, + { + "originalRange": "[4,91 -> 4,95]", + "modifiedRange": "[4,78 -> 4,82]" + }, + { + "originalRange": "[4,96 -> 4,103]", + "modifiedRange": "[4,83 -> 4,88]" + }, + { + "originalRange": "[4,109 -> 4,110]", + "modifiedRange": "[4,94 -> 4,98]" + }, + { + "originalRange": "[4,114 -> 4,126]", + "modifiedRange": "[4,102 -> 4,103]" + } + ] + }, + { + "originalRange": "[11,12)", + "modifiedRange": "[11,12)", + "innerChanges": [ + { + "originalRange": "[11,61 -> 11,87]", + "modifiedRange": "[11,61 -> 11,61]" + }, + { + "originalRange": "[11,88 -> 11,89]", + "modifiedRange": "[11,62 -> 11,62]" + }, + { + "originalRange": "[11,90 -> 11,93]", + "modifiedRange": "[11,63 -> 11,63]" + }, + { + "originalRange": "[11,97 -> 11,101]", + "modifiedRange": "[11,67 -> 11,68]" + } + ] + }, + { + "originalRange": "[14,15)", + "modifiedRange": "[14,18)", + "innerChanges": [ + { + "originalRange": "[14,120 -> 14,120]", + "modifiedRange": "[14,120 -> 14,123]" + }, + { + "originalRange": "[14,121 -> 14,123]", + "modifiedRange": "[14,124 -> 14,124]" + }, + { + "originalRange": "[14,124 -> 14,125]", + "modifiedRange": "[14,125 -> 14,133]" + }, + { + "originalRange": "[14,126 -> 14,128]", + "modifiedRange": "[14,134 -> 14,136]" + }, + { + "originalRange": "[14,129 -> 14,129]", + "modifiedRange": "[14,137 -> 14,141]" + }, + { + "originalRange": "[14,130 -> 14,133]", + "modifiedRange": "[14,142 -> 14,144]" + }, + { + "originalRange": "[14,135 -> 14,136]", + "modifiedRange": "[14,146 -> 14,148]" + }, + { + "originalRange": "[14,137 -> 14,143]", + "modifiedRange": "[14,149 -> 14,151]" + }, + { + "originalRange": "[14,144 -> 14,148]", + "modifiedRange": "[14,152 -> 14,152]" + }, + { + "originalRange": "[14,149 -> 14,150]", + "modifiedRange": "[14,153 -> 14,156]" + }, + { + "originalRange": "[14,151 -> 14,154]", + "modifiedRange": "[14,157 -> 14,162]" + }, + { + "originalRange": "[14,165 -> 14,168]", + "modifiedRange": "[14,173 -> 14,174]" + }, + { + "originalRange": "[14,169 -> 14,170]", + "modifiedRange": "[14,175 -> 14,179]" + }, + { + "originalRange": "[14,171 -> 14,171]", + "modifiedRange": "[14,180 -> 16,5]" + }, + { + "originalRange": "[14,172 -> 14,176]", + "modifiedRange": "[16,6 -> 16,17]" + }, + { + "originalRange": "[14,177 -> 14,178]", + "modifiedRange": "[16,18 -> 16,22]" + }, + { + "originalRange": "[14,181 -> 14,181]", + "modifiedRange": "[16,25 -> 16,30]" + }, + { + "originalRange": "[14,191 -> 14,192]", + "modifiedRange": "[16,40 -> 16,47]" + }, + { + "originalRange": "[14,196 -> 14,198]", + "modifiedRange": "[16,51 -> 16,51]" + }, + { + "originalRange": "[14,199 -> 14,200]", + "modifiedRange": "[16,52 -> 16,58]" + }, + { + "originalRange": "[14,201 -> 14,201]", + "modifiedRange": "[16,59 -> 16,63]" + }, + { + "originalRange": "[14,202 -> 14,202]", + "modifiedRange": "[16,64 -> 16,66]" + }, + { + "originalRange": "[14,203 -> 14,204]", + "modifiedRange": "[16,67 -> 16,70]" + }, + { + "originalRange": "[14,205 -> 14,205]", + "modifiedRange": "[16,71 -> 16,80]" + }, + { + "originalRange": "[14,206 -> 14,207]", + "modifiedRange": "[16,81 -> 16,83]" + }, + { + "originalRange": "[14,209 -> 14,209]", + "modifiedRange": "[16,85 -> 16,119]" + }, + { + "originalRange": "[14,210 -> 14,211]", + "modifiedRange": "[16,120 -> 17,1]" + } + ] + }, + { + "originalRange": "[17,24)", + "modifiedRange": "[20,24)", + "innerChanges": [ + { + "originalRange": "[17,1 -> 17,1]", + "modifiedRange": "[20,1 -> 21,1]" + }, + { + "originalRange": "[17,8 -> 17,8]", + "modifiedRange": "[21,8 -> 21,17]" + }, + { + "originalRange": "[17,13 -> 17,14]", + "modifiedRange": "[21,22 -> 21,33]" + }, + { + "originalRange": "[17,20 -> 17,28]", + "modifiedRange": "[21,39 -> 21,39]" + }, + { + "originalRange": "[17,32 -> 17,40]", + "modifiedRange": "[21,43 -> 21,43]" + }, + { + "originalRange": "[17,71 -> 17,72]", + "modifiedRange": "[21,74 -> 22,1]" + }, + { + "originalRange": "[18,3 -> 18,4]", + "modifiedRange": "[23,3 -> 23,6]" + }, + { + "originalRange": "[18,5 -> 18,9]", + "modifiedRange": "[23,7 -> 23,10]" + }, + { + "originalRange": "[18,10 -> 18,15]", + "modifiedRange": "[23,11 -> 23,13]" + }, + { + "originalRange": "[18,16 -> 18,19]", + "modifiedRange": "[23,14 -> 23,16]" + }, + { + "originalRange": "[18,20 -> 18,29]", + "modifiedRange": "[23,17 -> 23,20]" + }, + { + "originalRange": "[18,30 -> 18,31]", + "modifiedRange": "[23,21 -> 23,22]" + }, + { + "originalRange": "[18,32 -> 18,33]", + "modifiedRange": "[23,23 -> 23,23]" + }, + { + "originalRange": "[18,34 -> 19,4]", + "modifiedRange": "[23,24 -> 23,24]" + }, + { + "originalRange": "[19,5 -> 19,7]", + "modifiedRange": "[23,25 -> 23,25]" + }, + { + "originalRange": "[19,10 -> 19,14]", + "modifiedRange": "[23,28 -> 23,28]" + }, + { + "originalRange": "[19,14 -> 19,17]", + "modifiedRange": "[23,28 -> 23,29]" + }, + { + "originalRange": "[19,18 -> 19,26]", + "modifiedRange": "[23,30 -> 23,30]" + }, + { + "originalRange": "[19,32 -> 19,32]", + "modifiedRange": "[23,36 -> 23,56]" + }, + { + "originalRange": "[19,35 -> 20,4]", + "modifiedRange": "[23,59 -> 23,61]" + }, + { + "originalRange": "[20,5 -> 20,6]", + "modifiedRange": "[23,62 -> 23,65]" + }, + { + "originalRange": "[20,7 -> 20,9]", + "modifiedRange": "[23,66 -> 23,66]" + }, + { + "originalRange": "[20,10 -> 20,15]", + "modifiedRange": "[23,67 -> 23,67]" + }, + { + "originalRange": "[20,16 -> 20,17]", + "modifiedRange": "[23,68 -> 23,71]" + }, + { + "originalRange": "[20,18 -> 20,24]", + "modifiedRange": "[23,72 -> 23,72]" + }, + { + "originalRange": "[20,25 -> 20,29]", + "modifiedRange": "[23,73 -> 23,75]" + }, + { + "originalRange": "[20,30 -> 20,32]", + "modifiedRange": "[23,76 -> 23,78]" + }, + { + "originalRange": "[20,33 -> 20,35]", + "modifiedRange": "[23,79 -> 23,83]" + }, + { + "originalRange": "[20,36 -> 20,39]", + "modifiedRange": "[23,84 -> 23,84]" + }, + { + "originalRange": "[20,41 -> 20,44]", + "modifiedRange": "[23,86 -> 23,87]" + }, + { + "originalRange": "[20,45 -> 20,49]", + "modifiedRange": "[23,88 -> 23,89]" + }, + { + "originalRange": "[20,50 -> 20,51]", + "modifiedRange": "[23,90 -> 23,92]" + }, + { + "originalRange": "[20,52 -> 21,6]", + "modifiedRange": "[23,93 -> 23,96]" + }, + { + "originalRange": "[21,7 -> 21,9]", + "modifiedRange": "[23,97 -> 23,97]" + }, + { + "originalRange": "[21,10 -> 21,13]", + "modifiedRange": "[23,98 -> 23,98]" + }, + { + "originalRange": "[21,14 -> 21,25]", + "modifiedRange": "[23,99 -> 23,101]" + }, + { + "originalRange": "[21,26 -> 22,4]", + "modifiedRange": "[23,102 -> 23,102]" + }, + { + "originalRange": "[22,5 -> 22,8]", + "modifiedRange": "[23,103 -> 23,103]" + }, + { + "originalRange": "[22,9 -> 22,15]", + "modifiedRange": "[23,104 -> 23,107]" + }, + { + "originalRange": "[22,16 -> 22,18]", + "modifiedRange": "[23,108 -> 23,110]" + }, + { + "originalRange": "[22,19 -> 22,21]", + "modifiedRange": "[23,111 -> 23,111]" + }, + { + "originalRange": "[22,22 -> 22,26]", + "modifiedRange": "[23,112 -> 23,112]" + }, + { + "originalRange": "[22,27 -> 22,32]", + "modifiedRange": "[23,113 -> 23,113]" + }, + { + "originalRange": "[22,33 -> 22,36]", + "modifiedRange": "[23,114 -> 23,115]" + }, + { + "originalRange": "[22,37 -> 22,41]", + "modifiedRange": "[23,116 -> 23,117]" + }, + { + "originalRange": "[22,42 -> 23,4]", + "modifiedRange": "[23,118 -> 23,120]" + } + ] + }, + { + "originalRange": "[25,27)", + "modifiedRange": "[25,25)", + "innerChanges": [ + { + "originalRange": "[25,1 -> 27,1]", + "modifiedRange": "[25,1 -> 25,1]" + } + ] + }, + { + "originalRange": "[28,31)", + "modifiedRange": "[26,38)", + "innerChanges": [ + { + "originalRange": "[28,4 -> 28,4]", + "modifiedRange": "[26,4 -> 27,4]" + }, + { + "originalRange": "[28,15 -> 28,20]", + "modifiedRange": "[27,15 -> 27,16]" + }, + { + "originalRange": "[29,4 -> 29,7]", + "modifiedRange": "[28,4 -> 28,7]" + }, + { + "originalRange": "[29,8 -> 29,8]", + "modifiedRange": "[28,8 -> 28,18]" + }, + { + "originalRange": "[29,9 -> 29,10]", + "modifiedRange": "[28,19 -> 28,20]" + }, + { + "originalRange": "[29,11 -> 29,11]", + "modifiedRange": "[28,21 -> 28,47]" + }, + { + "originalRange": "[29,13 -> 29,14]", + "modifiedRange": "[28,49 -> 28,71]" + }, + { + "originalRange": "[29,15 -> 29,15]", + "modifiedRange": "[28,72 -> 28,76]" + }, + { + "originalRange": "[29,16 -> 29,16]", + "modifiedRange": "[28,77 -> 28,90]" + }, + { + "originalRange": "[29,17 -> 29,17]", + "modifiedRange": "[28,91 -> 28,94]" + }, + { + "originalRange": "[29,18 -> 29,18]", + "modifiedRange": "[28,95 -> 28,124]" + }, + { + "originalRange": "[29,19 -> 29,19]", + "modifiedRange": "[28,125 -> 28,129]" + }, + { + "originalRange": "[29,20 -> 29,20]", + "modifiedRange": "[28,130 -> 28,134]" + }, + { + "originalRange": "[29,21 -> 29,21]", + "modifiedRange": "[28,135 -> 28,176]" + }, + { + "originalRange": "[29,22 -> 29,22]", + "modifiedRange": "[28,177 -> 29,13]" + }, + { + "originalRange": "[29,24 -> 29,24]", + "modifiedRange": "[29,15 -> 29,36]" + }, + { + "originalRange": "[30,4 -> 30,6]", + "modifiedRange": "[30,4 -> 30,16]" + }, + { + "originalRange": "[30,10 -> 30,10]", + "modifiedRange": "[30,20 -> 30,21]" + }, + { + "originalRange": "[30,11 -> 30,13]", + "modifiedRange": "[30,22 -> 31,23]" + }, + { + "originalRange": "[30,14 -> 30,14]", + "modifiedRange": "[31,24 -> 33,10]" + }, + { + "originalRange": "[30,16 -> 30,17]", + "modifiedRange": "[33,12 -> 33,15]" + }, + { + "originalRange": "[30,18 -> 30,18]", + "modifiedRange": "[33,16 -> 33,19]" + }, + { + "originalRange": "[30,19 -> 30,19]", + "modifiedRange": "[33,20 -> 33,21]" + }, + { + "originalRange": "[30,20 -> 30,22]", + "modifiedRange": "[33,22 -> 33,22]" + }, + { + "originalRange": "[30,23 -> 30,23]", + "modifiedRange": "[33,23 -> 34,6]" + }, + { + "originalRange": "[30,24 -> 30,26]", + "modifiedRange": "[34,7 -> 34,16]" + }, + { + "originalRange": "[30,30 -> 30,30]", + "modifiedRange": "[34,20 -> 34,21]" + }, + { + "originalRange": "[30,31 -> 30,31]", + "modifiedRange": "[34,22 -> 37,9]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-confusing-2/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-confusing-2/smart.expected.diff.json new file mode 100644 index 00000000000..a1e0ab440f9 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-confusing-2/smart.expected.diff.json @@ -0,0 +1,155 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[2,3)", + "modifiedRange": "[2,3)", + "innerChanges": [ + { + "originalRange": "[2,1 -> 2,5]", + "modifiedRange": "[2,1 -> 2,2]" + } + ] + }, + { + "originalRange": "[4,5)", + "modifiedRange": "[4,5)", + "innerChanges": [ + { + "originalRange": "[4,69 -> 4,103]", + "modifiedRange": "[4,69 -> 4,88]" + }, + { + "originalRange": "[4,109 -> 4,110]", + "modifiedRange": "[4,94 -> 4,98]" + }, + { + "originalRange": "[4,114 -> 4,126]", + "modifiedRange": "[4,102 -> 4,103]" + } + ] + }, + { + "originalRange": "[11,12)", + "modifiedRange": "[11,12)", + "innerChanges": [ + { + "originalRange": "[11,61 -> 11,93]", + "modifiedRange": "[11,61 -> 11,63]" + }, + { + "originalRange": "[11,97 -> 11,101]", + "modifiedRange": "[11,67 -> 11,68]" + } + ] + }, + { + "originalRange": "[14,15)", + "modifiedRange": "[14,18)", + "innerChanges": [ + { + "originalRange": "[14,120 -> 14,154]", + "modifiedRange": "[14,120 -> 14,162]" + }, + { + "originalRange": "[14,165 -> 14,178]", + "modifiedRange": "[14,173 -> 16,22]" + }, + { + "originalRange": "[14,181 -> 14,181]", + "modifiedRange": "[16,25 -> 16,30]" + }, + { + "originalRange": "[14,191 -> 14,192]", + "modifiedRange": "[16,40 -> 16,47]" + }, + { + "originalRange": "[14,196 -> 14,211]", + "modifiedRange": "[16,51 -> 17,1]" + } + ] + }, + { + "originalRange": "[17,24)", + "modifiedRange": "[20,24)", + "innerChanges": [ + { + "originalRange": "[17,1 -> 17,1]", + "modifiedRange": "[20,1 -> 21,1]" + }, + { + "originalRange": "[17,9 -> 17,21]", + "modifiedRange": "[21,9 -> 21,15]" + }, + { + "originalRange": "[17,24 -> 17,29]", + "modifiedRange": "[21,18 -> 21,19]" + }, + { + "originalRange": "[17,32 -> 17,33]", + "modifiedRange": "[21,22 -> 21,33]" + }, + { + "originalRange": "[17,39 -> 17,40]", + "modifiedRange": "[21,39 -> 21,43]" + }, + { + "originalRange": "[17,71 -> 17,72]", + "modifiedRange": "[21,74 -> 22,1]" + }, + { + "originalRange": "[18,3 -> 19,26]", + "modifiedRange": "[23,3 -> 23,30]" + }, + { + "originalRange": "[19,32 -> 19,32]", + "modifiedRange": "[23,36 -> 23,56]" + }, + { + "originalRange": "[19,35 -> 23,4]", + "modifiedRange": "[23,59 -> 23,120]" + } + ] + }, + { + "originalRange": "[25,27)", + "modifiedRange": "[25,25)", + "innerChanges": null + }, + { + "originalRange": "[28,31)", + "modifiedRange": "[26,38)", + "innerChanges": [ + { + "originalRange": "[28,1 -> 28,1]", + "modifiedRange": "[26,1 -> 27,1]" + }, + { + "originalRange": "[28,15 -> 28,20]", + "modifiedRange": "[27,15 -> 27,16]" + }, + { + "originalRange": "[29,4 -> 29,24]", + "modifiedRange": "[28,4 -> 32,30]" + }, + { + "originalRange": "[30,4 -> 30,6]", + "modifiedRange": "[33,4 -> 33,16]" + }, + { + "originalRange": "[30,10 -> 30,13]", + "modifiedRange": "[33,20 -> 34,9]" + }, + { + "originalRange": "[30,16 -> 30,26]", + "modifiedRange": "[34,12 -> 36,16]" + }, + { + "originalRange": "[30,30 -> 30,31]", + "modifiedRange": "[36,20 -> 37,9]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-confusing/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-confusing/1.tst new file mode 100644 index 00000000000..ae2fd98b2ca --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-confusing/1.tst @@ -0,0 +1,26 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { URI } from 'vs/base/common/uri'; +import { IRange } from 'vs/editor/common/core/range'; +import { IEditorWorkerService, IUnicodeHighlightsResult } from 'vs/editor/common/services/editorWorker'; +import { TextEdit, IInplaceReplaceSupportResult } from 'vs/editor/common/languages'; +import { IChange, IDiffComputationResult } from 'vs/editor/common/diff/diffComputer'; + +export class TestEditorWorkerService implements IEditorWorkerService { + + declare readonly _serviceBrand: undefined; + + canComputeUnicodeHighlights(uri: URI): boolean { return false; } + async computedUnicodeHighlights(uri: URI): Promise { return { ranges: [], hasMore: false, ambiguousCharacterCount: 0, invisibleCharacterCount: 0, nonBasicAsciiCharacterCount: 0 }; } + async computeDiff(original: URI, modified: URI, ignoreTrimWhitespace: boolean, maxComputationTime: number): Promise { return null; } + canComputeDirtyDiff(original: URI, modified: URI): boolean { return false; } + async computeDirtyDiff(original: URI, modified: URI, ignoreTrimWhitespace: boolean): Promise { return null; } + async computeMoreMinimalEdits(resource: URI, edits: TextEdit[] | null | undefined): Promise { return undefined; } + canComputeWordRanges(resource: URI): boolean { return false; } + async computeWordRanges(resource: URI, range: IRange): Promise<{ [word: string]: IRange[] } | null> { return null; } + canNavigateValueSet(resource: URI): boolean { return false; } + async navigateValueSet(resource: URI, range: IRange, up: boolean): Promise { return null; } +} diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-confusing/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-confusing/2.tst new file mode 100644 index 00000000000..9c5c6519088 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-confusing/2.tst @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { URI } from 'vs/base/common/uri'; +import { IRange } from 'vs/editor/common/core/range'; +import { IDiffComputationResult, IEditorWorkerService, IUnicodeHighlightsResult } from 'vs/editor/common/services/editorWorker'; +import { TextEdit, IInplaceReplaceSupportResult } from 'vs/editor/common/languages'; +import { IDocumentDiffProviderOptions } from 'vs/editor/common/diff/documentDiffProvider'; +import { IChange } from 'vs/editor/common/diff/smartLinesDiffComputer'; + +export class TestEditorWorkerService implements IEditorWorkerService { + + declare readonly _serviceBrand: undefined; + + canComputeUnicodeHighlights(uri: URI): boolean { return false; } + async computedUnicodeHighlights(uri: URI): Promise { return { ranges: [], hasMore: false, ambiguousCharacterCount: 0, invisibleCharacterCount: 0, nonBasicAsciiCharacterCount: 0 }; } + async computeDiff(original: URI, modified: URI, options: IDocumentDiffProviderOptions): Promise { return null; } + canComputeDirtyDiff(original: URI, modified: URI): boolean { return false; } + async computeDirtyDiff(original: URI, modified: URI, ignoreTrimWhitespace: boolean): Promise { return null; } + async computeMoreMinimalEdits(resource: URI, edits: TextEdit[] | null | undefined): Promise { return undefined; } + canComputeWordRanges(resource: URI): boolean { return false; } + async computeWordRanges(resource: URI, range: IRange): Promise<{ [word: string]: IRange[] } | null> { return null; } + canNavigateValueSet(resource: URI): boolean { return false; } + async navigateValueSet(resource: URI, range: IRange, up: boolean): Promise { return null; } +} diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-confusing/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-confusing/experimental.expected.diff.json new file mode 100644 index 00000000000..ecd6a96cfcb --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-confusing/experimental.expected.diff.json @@ -0,0 +1,112 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[8,9)", + "modifiedRange": "[8,9)", + "innerChanges": [ + { + "originalRange": "[8,9 -> 8,9]", + "modifiedRange": "[8,9 -> 8,33]" + } + ] + }, + { + "originalRange": "[10,11)", + "modifiedRange": "[10,12)", + "innerChanges": [ + { + "originalRange": "[10,11 -> 10,14]", + "modifiedRange": "[10,11 -> 10,17]" + }, + { + "originalRange": "[10,15 -> 10,20]", + "modifiedRange": "[10,18 -> 10,19]" + }, + { + "originalRange": "[10,24 -> 10,25]", + "modifiedRange": "[10,23 -> 10,25]" + }, + { + "originalRange": "[10,26 -> 10,27]", + "modifiedRange": "[10,26 -> 10,32]" + }, + { + "originalRange": "[10,28 -> 10,31]", + "modifiedRange": "[10,33 -> 10,33]" + }, + { + "originalRange": "[10,35 -> 10,36]", + "modifiedRange": "[10,37 -> 10,50]" + }, + { + "originalRange": "[10,37 -> 10,38]", + "modifiedRange": "[10,51 -> 10,72]" + }, + { + "originalRange": "[10,39 -> 10,40]", + "modifiedRange": "[10,73 -> 11,6]" + }, + { + "originalRange": "[10,42 -> 10,42]", + "modifiedRange": "[11,8 -> 11,18]" + }, + { + "originalRange": "[10,72 -> 10,73]", + "modifiedRange": "[11,48 -> 11,59]" + } + ] + }, + { + "originalRange": "[18,19)", + "modifiedRange": "[19,20)", + "innerChanges": [ + { + "originalRange": "[18,50 -> 18,50]", + "modifiedRange": "[19,50 -> 19,53]" + }, + { + "originalRange": "[18,51 -> 18,52]", + "modifiedRange": "[19,54 -> 19,55]" + }, + { + "originalRange": "[18,53 -> 18,65]", + "modifiedRange": "[19,56 -> 19,56]" + }, + { + "originalRange": "[18,66 -> 18,70]", + "modifiedRange": "[19,57 -> 19,57]" + }, + { + "originalRange": "[18,72 -> 18,73]", + "modifiedRange": "[19,59 -> 19,61]" + }, + { + "originalRange": "[18,74 -> 18,76]", + "modifiedRange": "[19,62 -> 19,65]" + }, + { + "originalRange": "[18,77 -> 18,78]", + "modifiedRange": "[19,66 -> 19,66]" + }, + { + "originalRange": "[18,79 -> 18,85]", + "modifiedRange": "[19,67 -> 19,74]" + }, + { + "originalRange": "[18,86 -> 18,87]", + "modifiedRange": "[19,75 -> 19,81]" + }, + { + "originalRange": "[18,88 -> 18,91]", + "modifiedRange": "[19,82 -> 19,82]" + }, + { + "originalRange": "[18,95 -> 18,107]", + "modifiedRange": "[19,86 -> 19,87]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-confusing/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-confusing/smart.expected.diff.json new file mode 100644 index 00000000000..7ad5e5e6604 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-confusing/smart.expected.diff.json @@ -0,0 +1,48 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[8,9)", + "modifiedRange": "[8,9)", + "innerChanges": [ + { + "originalRange": "[8,11 -> 8,11]", + "modifiedRange": "[8,11 -> 8,35]" + } + ] + }, + { + "originalRange": "[10,11)", + "modifiedRange": "[10,12)", + "innerChanges": [ + { + "originalRange": "[10,11 -> 10,20]", + "modifiedRange": "[10,11 -> 10,77]" + }, + { + "originalRange": "[10,24 -> 10,41]", + "modifiedRange": "[10,81 -> 11,17]" + }, + { + "originalRange": "[10,72 -> 10,73]", + "modifiedRange": "[11,48 -> 11,59]" + } + ] + }, + { + "originalRange": "[18,19)", + "modifiedRange": "[19,20)", + "innerChanges": [ + { + "originalRange": "[18,50 -> 18,91]", + "modifiedRange": "[19,50 -> 19,82]" + }, + { + "originalRange": "[18,95 -> 18,107]", + "modifiedRange": "[19,86 -> 19,87]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-diff-word-split/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-diff-word-split/1.tst new file mode 100644 index 00000000000..0a612a235e2 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-diff-word-split/1.tst @@ -0,0 +1,10 @@ +import { findLast } from 'vs/base/common/arrays'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { ITransaction, observableValue, transaction } from 'vs/base/common/observable'; +import { Range } from 'vs/editor/common/core/range'; +import { ScrollType } from 'vs/editor/common/editorCommon'; +import { IFooBar, IFoo } from 'foo'; + +console.log(observableValue); + +console.log(observableValue); diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-diff-word-split/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-diff-word-split/2.tst new file mode 100644 index 00000000000..968e08f00f8 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-diff-word-split/2.tst @@ -0,0 +1,10 @@ +import { findLast } from 'vs/base/common/arrays'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { ITransaction, observableFromEvent, observableValue, transaction } from 'vs/base/common/observable'; +import { Range } from 'vs/editor/common/core/range'; +import { ScrollType } from 'vs/editor/common/editorCommon'; +import { IFooBar, IBar, IFoo } from 'foo'; + +console.log(observableFromEvent, observableValue); + +console.log(observableValue, observableFromEvent); diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-diff-word-split/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-diff-word-split/experimental.expected.diff.json new file mode 100644 index 00000000000..7a03e3e2009 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-diff-word-split/experimental.expected.diff.json @@ -0,0 +1,46 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[3,4)", + "modifiedRange": "[3,4)", + "innerChanges": [ + { + "originalRange": "[3,23 -> 3,23]", + "modifiedRange": "[3,23 -> 3,44]" + } + ] + }, + { + "originalRange": "[6,7)", + "modifiedRange": "[6,7)", + "innerChanges": [ + { + "originalRange": "[6,18 -> 6,18]", + "modifiedRange": "[6,18 -> 6,24]" + } + ] + }, + { + "originalRange": "[8,9)", + "modifiedRange": "[8,9)", + "innerChanges": [ + { + "originalRange": "[8,13 -> 8,13]", + "modifiedRange": "[8,13 -> 8,34]" + } + ] + }, + { + "originalRange": "[10,11)", + "modifiedRange": "[10,11)", + "innerChanges": [ + { + "originalRange": "[10,28 -> 10,28]", + "modifiedRange": "[10,28 -> 10,49]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-diff-word-split/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-diff-word-split/smart.expected.diff.json new file mode 100644 index 00000000000..ac0383a456b --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-diff-word-split/smart.expected.diff.json @@ -0,0 +1,46 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[3,4)", + "modifiedRange": "[3,4)", + "innerChanges": [ + { + "originalRange": "[3,34 -> 3,34]", + "modifiedRange": "[3,34 -> 3,55]" + } + ] + }, + { + "originalRange": "[6,7)", + "modifiedRange": "[6,7)", + "innerChanges": [ + { + "originalRange": "[6,20 -> 6,20]", + "modifiedRange": "[6,20 -> 6,26]" + } + ] + }, + { + "originalRange": "[8,9)", + "modifiedRange": "[8,9)", + "innerChanges": [ + { + "originalRange": "[8,23 -> 8,23]", + "modifiedRange": "[8,23 -> 8,44]" + } + ] + }, + { + "originalRange": "[10,11)", + "modifiedRange": "[10,11)", + "innerChanges": [ + { + "originalRange": "[10,28 -> 10,28]", + "modifiedRange": "[10,28 -> 10,49]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-example1/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-example1/1.tst new file mode 100644 index 00000000000..5615fb34001 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-example1/1.tst @@ -0,0 +1,15 @@ +export class EditorWorkerServiceDiffComputer implements IDiffComputer { + constructor(@IEditorWorkerService private readonly editorWorkerService: IEditorWorkerService) { } + + async computeDiff(textModel1: ITextModel, textModel2: ITextModel): Promise { + const diffs = await this.editorWorkerService.computeDiff(textModel1.uri, textModel2.uri, false, 1000); + if (!diffs || diffs.quitEarly) { + return null; + } + return diffs.changes.map((c) => LineDiff.fromLineChange(c, textModel1, textModel2)); + } +} + +function wait(ms: number): Promise { + return new Promise(r => setTimeout(r, ms)); +} diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-example1/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-example1/2.tst new file mode 100644 index 00000000000..e923d0ec4de --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-example1/2.tst @@ -0,0 +1,80 @@ +export class EditorWorkerServiceDiffComputer implements IDiffComputer { + constructor(@IEditorWorkerService private readonly editorWorkerService: IEditorWorkerService) { } + + async computeDiff(textModel1: ITextModel, textModel2: ITextModel): Promise { + const diffs = await this.editorWorkerService.computeDiff(textModel1.uri, textModel2.uri, false, 1000); + if (!diffs || diffs.quitEarly) { + return null; + } + return EditorWorkerServiceDiffComputer.fromDiffComputationResult(diffs, textModel1, textModel2); + } + + public static fromDiffComputationResult(result: IDiffComputationResult, textModel1: ITextModel, textModel2: ITextModel): LineDiff[] { + return result.changes.map((c) => fromLineChange(c, textModel1, textModel2)); + } +} + +function fromLineChange(lineChange: ILineChange, originalTextModel: ITextModel, modifiedTextModel: ITextModel): LineDiff { + let originalRange: LineRange; + if (lineChange.originalEndLineNumber === 0) { + // Insertion + originalRange = new LineRange(lineChange.originalStartLineNumber + 1, 0); + } else { + originalRange = new LineRange(lineChange.originalStartLineNumber, lineChange.originalEndLineNumber - lineChange.originalStartLineNumber + 1); + } + + let modifiedRange: LineRange; + if (lineChange.modifiedEndLineNumber === 0) { + // Deletion + modifiedRange = new LineRange(lineChange.modifiedStartLineNumber + 1, 0); + } else { + modifiedRange = new LineRange(lineChange.modifiedStartLineNumber, lineChange.modifiedEndLineNumber - lineChange.modifiedStartLineNumber + 1); + } + + let innerDiffs = lineChange.charChanges?.map(c => fromCharChange(c)); + if (!innerDiffs) { + innerDiffs = [diffFromLineRanges(originalRange, modifiedRange)]; + } + + return new LineDiff( + originalTextModel, + originalRange, + modifiedTextModel, + modifiedRange, + innerDiffs + ); +} + +function diffFromLineRanges(originalRange: LineRange, modifiedRange: LineRange): Diff { + // [1,1) -> [100, 101) + + if (originalRange.startLineNumber !== 1 && modifiedRange.startLineNumber !== 1) { + + } + + let original = new Range( + originalRange.startLineNumber - 1, + Number.MAX_SAFE_INTEGER, + originalRange.endLineNumberExclusive - 1, + Number.MAX_SAFE_INTEGER, + ); + + let modified = new Range( + modifiedRange.startLineNumber - 1, + Number.MAX_SAFE_INTEGER, + modifiedRange.endLineNumberExclusive - 1, + Number.MAX_SAFE_INTEGER, + ); + + return new Diff( + original, + modified + ); +} + +function fromCharChange(charChange: ICharChange): Diff { + return new Diff( + new Range(charChange.originalStartLineNumber, charChange.originalStartColumn, charChange.originalEndLineNumber, charChange.originalEndColumn), + new Range(charChange.modifiedStartLineNumber, charChange.modifiedStartColumn, charChange.modifiedEndLineNumber, charChange.modifiedEndColumn) + ); +} diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-example1/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-example1/experimental.expected.diff.json new file mode 100644 index 00000000000..dff793f0286 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-example1/experimental.expected.diff.json @@ -0,0 +1,226 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[9,10)", + "modifiedRange": "[9,14)", + "innerChanges": [ + { + "originalRange": "[9,10 -> 9,10]", + "modifiedRange": "[9,10 -> 9,68]" + }, + { + "originalRange": "[9,15 -> 9,15]", + "modifiedRange": "[9,73 -> 13,16]" + }, + { + "originalRange": "[9,35 -> 9,44]", + "modifiedRange": "[13,36 -> 13,36]" + } + ] + }, + { + "originalRange": "[13,15)", + "modifiedRange": "[17,80)", + "innerChanges": [ + { + "originalRange": "[13,10 -> 13,11]", + "modifiedRange": "[17,10 -> 17,20]" + }, + { + "originalRange": "[13,12 -> 13,12]", + "modifiedRange": "[17,21 -> 17,26]" + }, + { + "originalRange": "[13,13 -> 13,13]", + "modifiedRange": "[17,27 -> 17,61]" + }, + { + "originalRange": "[13,14 -> 13,14]", + "modifiedRange": "[17,62 -> 19,5]" + }, + { + "originalRange": "[13,15 -> 13,15]", + "modifiedRange": "[19,6 -> 19,34]" + }, + { + "originalRange": "[13,18 -> 13,18]", + "modifiedRange": "[19,37 -> 20,10]" + }, + { + "originalRange": "[13,17 -> 13,18]", + "modifiedRange": "[20,9 -> 21,18]" + }, + { + "originalRange": "[13,20 -> 13,20]", + "modifiedRange": "[21,20 -> 21,62]" + }, + { + "originalRange": "[13,25 -> 13,25]", + "modifiedRange": "[21,67 -> 21,74]" + }, + { + "originalRange": "[13,26 -> 13,26]", + "modifiedRange": "[21,75 -> 26,19]" + }, + { + "originalRange": "[13,28 -> 13,29]", + "modifiedRange": "[26,21 -> 27,37]" + }, + { + "originalRange": "[13,30 -> 13,30]", + "modifiedRange": "[27,38 -> 28,12]" + }, + { + "originalRange": "[13,31 -> 13,31]", + "modifiedRange": "[28,13 -> 29,3]" + }, + { + "originalRange": "[13,32 -> 13,32]", + "modifiedRange": "[29,4 -> 29,6]" + }, + { + "originalRange": "[13,33 -> 13,33]", + "modifiedRange": "[29,7 -> 30,6]" + }, + { + "originalRange": "[13,35 -> 13,37]", + "modifiedRange": "[30,8 -> 31,4]" + }, + { + "originalRange": "[13,38 -> 13,38]", + "modifiedRange": "[31,5 -> 31,6]" + }, + { + "originalRange": "[13,39 -> 13,39]", + "modifiedRange": "[31,7 -> 31,10]" + }, + { + "originalRange": "[13,40 -> 13,40]", + "modifiedRange": "[31,11 -> 34,50]" + }, + { + "originalRange": "[13,41 -> 13,41]", + "modifiedRange": "[34,51 -> 35,18]" + }, + { + "originalRange": "[14,2 -> 14,2]", + "modifiedRange": "[36,2 -> 36,7]" + }, + { + "originalRange": "[14,3 -> 14,3]", + "modifiedRange": "[36,8 -> 39,3]" + }, + { + "originalRange": "[14,13 -> 14,14]", + "modifiedRange": "[39,13 -> 40,4]" + }, + { + "originalRange": "[14,15 -> 14,15]", + "modifiedRange": "[40,5 -> 40,16]" + }, + { + "originalRange": "[14,16 -> 14,16]", + "modifiedRange": "[40,17 -> 42,3]" + }, + { + "originalRange": "[14,17 -> 14,17]", + "modifiedRange": "[42,4 -> 42,6]" + }, + { + "originalRange": "[14,18 -> 14,18]", + "modifiedRange": "[42,7 -> 44,12]" + }, + { + "originalRange": "[14,19 -> 14,19]", + "modifiedRange": "[44,13 -> 48,21]" + }, + { + "originalRange": "[14,20 -> 14,20]", + "modifiedRange": "[48,22 -> 48,28]" + }, + { + "originalRange": "[14,21 -> 14,21]", + "modifiedRange": "[48,29 -> 48,30]" + }, + { + "originalRange": "[14,22 -> 14,22]", + "modifiedRange": "[48,31 -> 48,43]" + }, + { + "originalRange": "[14,23 -> 14,24]", + "modifiedRange": "[48,44 -> 49,12]" + }, + { + "originalRange": "[14,26 -> 14,26]", + "modifiedRange": "[49,14 -> 51,20]" + }, + { + "originalRange": "[14,27 -> 14,27]", + "modifiedRange": "[51,21 -> 51,28]" + }, + { + "originalRange": "[14,28 -> 14,28]", + "modifiedRange": "[51,29 -> 51,60]" + }, + { + "originalRange": "[14,29 -> 14,29]", + "modifiedRange": "[51,61 -> 57,21]" + }, + { + "originalRange": "[14,30 -> 14,30]", + "modifiedRange": "[57,22 -> 58,5]" + }, + { + "originalRange": "[14,31 -> 14,31]", + "modifiedRange": "[58,6 -> 58,26]" + }, + { + "originalRange": "[14,32 -> 14,32]", + "modifiedRange": "[58,27 -> 58,28]" + }, + { + "originalRange": "[14,33 -> 14,33]", + "modifiedRange": "[58,29 -> 62,7]" + }, + { + "originalRange": "[14,34 -> 14,34]", + "modifiedRange": "[62,8 -> 63,27]" + }, + { + "originalRange": "[14,35 -> 14,35]", + "modifiedRange": "[63,28 -> 69,4]" + }, + { + "originalRange": "[14,36 -> 14,36]", + "modifiedRange": "[69,5 -> 69,17]" + }, + { + "originalRange": "[14,37 -> 14,37]", + "modifiedRange": "[69,18 -> 70,4]" + }, + { + "originalRange": "[14,38 -> 14,38]", + "modifiedRange": "[70,5 -> 70,11]" + }, + { + "originalRange": "[14,39 -> 14,39]", + "modifiedRange": "[70,12 -> 75,9]" + }, + { + "originalRange": "[14,40 -> 14,40]", + "modifiedRange": "[75,10 -> 75,13]" + }, + { + "originalRange": "[14,41 -> 14,42]", + "modifiedRange": "[75,14 -> 75,48]" + }, + { + "originalRange": "[14,43 -> 14,43]", + "modifiedRange": "[75,49 -> 79,2]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-example1/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-example1/smart.expected.diff.json new file mode 100644 index 00000000000..e865b3fa365 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-example1/smart.expected.diff.json @@ -0,0 +1,38 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[9,10)", + "modifiedRange": "[9,53)", + "innerChanges": null + }, + { + "originalRange": "[11,11)", + "modifiedRange": "[54,73)", + "innerChanges": null + }, + { + "originalRange": "[13,15)", + "modifiedRange": "[75,80)", + "innerChanges": [ + { + "originalRange": "[13,10 -> 13,20]", + "modifiedRange": "[75,10 -> 77,42]" + }, + { + "originalRange": "[13,25 -> 14,9]", + "modifiedRange": "[77,47 -> 78,3]" + }, + { + "originalRange": "[14,13 -> 14,37]", + "modifiedRange": "[78,7 -> 78,112]" + }, + { + "originalRange": "[14,40 -> 14,43]", + "modifiedRange": "[78,115 -> 79,2]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-example2-ts/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-example2-ts/1.tst new file mode 100644 index 00000000000..a719676ac6a --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-example2-ts/1.tst @@ -0,0 +1,8 @@ +function cloneTypeReference(source: TypeReference): TypeReference { + const type = createType(source.flags); + type.symbol = source.symbol; + type.objectFlags = source.objectFlags; + type.target = source.target; + type.typeArguments = source.typeArguments; + return type; +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-example2-ts/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-example2-ts/2.tst new file mode 100644 index 00000000000..933eb428c05 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-example2-ts/2.tst @@ -0,0 +1,25 @@ +function cloneTypeReference(source: TypeReference): TypeReference { + const type = createType(source.flags); + type.symbol = source.symbol; + type.objectFlags = source.objectFlags; + type.target = source.target; + type.resolvedTypeArguments = source.resolvedTypeArguments; + return type; +} + +function createDeferredTypeReference(): DeferredTypeReference { + const aliasSymbol = getAliasSymbolForTypeNode(node); + const aliasTypeArguments = getTypeArgumentsForAliasSymbol(aliasSymbol); + type.target = target; + type.node = node; + type.mapper = mapper; + type.aliasSymbol = aliasSymbol; + return type; +} + +function getTypeArguments(type: TypeReference): ReadonlyArray { + if (!type.resolvedTypeArguments) { + const node = type.node; + } + return type.resolvedTypeArguments; +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-example2-ts/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-example2-ts/experimental.expected.diff.json new file mode 100644 index 00000000000..12fb2fb68e1 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-example2-ts/experimental.expected.diff.json @@ -0,0 +1,38 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[6,7)", + "modifiedRange": "[6,17)", + "innerChanges": [ + { + "originalRange": "[6,10 -> 6,11]", + "modifiedRange": "[6,10 -> 6,19]" + }, + { + "originalRange": "[6,33 -> 6,33]", + "modifiedRange": "[6,41 -> 7,12]" + }, + { + "originalRange": "[6,37 -> 6,37]", + "modifiedRange": "[7,16 -> 12,39]" + }, + { + "originalRange": "[6,46 -> 6,46]", + "modifiedRange": "[12,48 -> 16,35]" + } + ] + }, + { + "originalRange": "[9,9)", + "modifiedRange": "[19,26)", + "innerChanges": [ + { + "originalRange": "[9,1 -> 9,1]", + "modifiedRange": "[19,1 -> 26,1]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-example2-ts/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-example2-ts/smart.expected.diff.json new file mode 100644 index 00000000000..9f38ce0b43c --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-example2-ts/smart.expected.diff.json @@ -0,0 +1,33 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[6,7)", + "modifiedRange": "[6,17)", + "innerChanges": [ + { + "originalRange": "[6,10 -> 6,11]", + "modifiedRange": "[6,10 -> 6,19]" + }, + { + "originalRange": "[6,33 -> 6,33]", + "modifiedRange": "[6,41 -> 7,12]" + }, + { + "originalRange": "[6,37 -> 6,37]", + "modifiedRange": "[7,16 -> 12,20]" + }, + { + "originalRange": "[6,46 -> 6,46]", + "modifiedRange": "[12,29 -> 16,35]" + } + ] + }, + { + "originalRange": "[9,9)", + "modifiedRange": "[19,26)", + "innerChanges": null + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-experimental-bug/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-experimental-bug/1.tst new file mode 100644 index 00000000000..dd606465f8b --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-experimental-bug/1.tst @@ -0,0 +1,8 @@ +function compileProgram(): ExitStatus { + // First get any syntactic errors. + var diagnostics = program.getSyntacticDiagnostics(); + reportDiagnostics(diagnostics); + + // If we didn't have any syntactic errors, then also try getting the global and + // semantic errors. + if (diagnostics.length === 0) \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-experimental-bug/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-experimental-bug/2.tst new file mode 100644 index 00000000000..f001c8b1c9b --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-experimental-bug/2.tst @@ -0,0 +1,9 @@ +function compileProgram(): ExitStatus { + let diagnostics: Diagnostic[]; + + // First get and report any syntactic errors. + diagnostics = program.getSyntacticDiagnostics(); + + // If we didn't have any syntactic errors, then also try getting the global and + // semantic errors. + if (diagnostics.length === 0) { \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-experimental-bug/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-experimental-bug/experimental.expected.diff.json new file mode 100644 index 00000000000..533acf07537 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-experimental-bug/experimental.expected.diff.json @@ -0,0 +1,42 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[2,5)", + "modifiedRange": "[2,6)", + "innerChanges": [ + { + "originalRange": "[2,1 -> 2,1]", + "modifiedRange": "[2,1 -> 4,1]" + }, + { + "originalRange": "[2,17 -> 2,17]", + "modifiedRange": "[4,17 -> 4,28]" + }, + { + "originalRange": "[2,39 -> 2,40]", + "modifiedRange": "[4,50 -> 4,50]" + }, + { + "originalRange": "[3,5 -> 3,9]", + "modifiedRange": "[5,5 -> 5,5]" + }, + { + "originalRange": "[3,57 -> 4,36]", + "modifiedRange": "[5,53 -> 5,53]" + } + ] + }, + { + "originalRange": "[8,9)", + "modifiedRange": "[9,10)", + "innerChanges": [ + { + "originalRange": "[8,35 -> 8,35]", + "modifiedRange": "[9,35 -> 9,36]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-experimental-bug/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-experimental-bug/smart.expected.diff.json new file mode 100644 index 00000000000..ab6e1d63356 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-experimental-bug/smart.expected.diff.json @@ -0,0 +1,42 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[2,5)", + "modifiedRange": "[2,6)", + "innerChanges": [ + { + "originalRange": "[2,1 -> 2,1]", + "modifiedRange": "[2,1 -> 4,1]" + }, + { + "originalRange": "[2,20 -> 2,20]", + "modifiedRange": "[4,20 -> 4,31]" + }, + { + "originalRange": "[2,39 -> 2,40]", + "modifiedRange": "[4,50 -> 4,50]" + }, + { + "originalRange": "[3,5 -> 3,9]", + "modifiedRange": "[5,5 -> 5,5]" + }, + { + "originalRange": "[3,57 -> 4,36]", + "modifiedRange": "[5,53 -> 5,53]" + } + ] + }, + { + "originalRange": "[8,9)", + "modifiedRange": "[9,10)", + "innerChanges": [ + { + "originalRange": "[8,35 -> 8,35]", + "modifiedRange": "[9,35 -> 9,36]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing/1.tst new file mode 100644 index 00000000000..541a9211b39 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing/1.tst @@ -0,0 +1,138 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IHistoryNavigationWidget } from 'vs/base/browser/history'; +import { IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview'; +import { FindInput, IFindInputOptions } from 'vs/base/browser/ui/findinput/findInput'; +import { IReplaceInputOptions, ReplaceInput } from 'vs/base/browser/ui/findinput/replaceInput'; +import { HistoryInputBox, IHistoryInputOptions } from 'vs/base/browser/ui/inputbox/inputBox'; +import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import { ContextKeyExpr, IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { localize } from 'vs/nls'; +import { DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; + +export const historyNavigationVisible = new RawContextKey('suggestWidgetVisible', false, localize('suggestWidgetVisible', "Whether suggestion are visible")); + +const HistoryNavigationWidgetFocusContext = 'historyNavigationWidgetFocus'; +const HistoryNavigationForwardsEnablementContext = 'historyNavigationForwardsEnabled'; +const HistoryNavigationBackwardsEnablementContext = 'historyNavigationBackwardsEnabled'; + +export interface IHistoryNavigationContext extends IDisposable { + scopedContextKeyService: IContextKeyService; + historyNavigationForwardsEnablement: IContextKey; + historyNavigationBackwardsEnablement: IContextKey; +} + +let lastFocusedWidget: IHistoryNavigationWidget | undefined = undefined; +const widgets: IHistoryNavigationWidget[] = []; + +export function registerAndCreateHistoryNavigationContext(contextKeyService: IContextKeyService, widget: IHistoryNavigationWidget): IHistoryNavigationContext { + if (widgets.includes(widget)) { + throw new Error('Cannot register the same widget multiple times'); + } + + widgets.push(widget); + const disposableStore = new DisposableStore(); + const scopedContextKeyService = disposableStore.add(contextKeyService.createScoped(widget.element)); + const historyNavigationWidgetFocus = new RawContextKey(HistoryNavigationWidgetFocusContext, false).bindTo(scopedContextKeyService); + const historyNavigationForwardsEnablement = new RawContextKey(HistoryNavigationForwardsEnablementContext, true).bindTo(scopedContextKeyService); + const historyNavigationBackwardsEnablement = new RawContextKey(HistoryNavigationBackwardsEnablementContext, true).bindTo(scopedContextKeyService); + + const onDidFocus = () => { + historyNavigationWidgetFocus.set(true); + lastFocusedWidget = widget; + }; + + const onDidBlur = () => { + historyNavigationWidgetFocus.set(false); + if (lastFocusedWidget === widget) { + lastFocusedWidget = undefined; + } + }; + + // Check for currently being focused + if (widget.element === document.activeElement) { + onDidFocus(); + } + + disposableStore.add(widget.onDidFocus(() => onDidFocus())); + disposableStore.add(widget.onDidBlur(() => onDidBlur())); + disposableStore.add(toDisposable(() => { + widgets.splice(widgets.indexOf(widget), 1); + onDidBlur(); + })); + + return { + scopedContextKeyService, + historyNavigationForwardsEnablement, + historyNavigationBackwardsEnablement, + dispose() { + disposableStore.dispose(); + } + }; +} + +export class ContextScopedHistoryInputBox extends HistoryInputBox { + + constructor(container: HTMLElement, contextViewProvider: IContextViewProvider | undefined, options: IHistoryInputOptions, + @IContextKeyService contextKeyService: IContextKeyService + ) { + super(container, contextViewProvider, options); + this._register(registerAndCreateHistoryNavigationContext(contextKeyService, this)); + } + +} + +export class ContextScopedFindInput extends FindInput { + + constructor(container: HTMLElement | null, contextViewProvider: IContextViewProvider, options: IFindInputOptions, + @IContextKeyService contextKeyService: IContextKeyService + ) { + super(container, contextViewProvider, options); + this._register(registerAndCreateHistoryNavigationContext(contextKeyService, this.inputBox)); + } +} + +export class ContextScopedReplaceInput extends ReplaceInput { + + constructor(container: HTMLElement | null, contextViewProvider: IContextViewProvider | undefined, options: IReplaceInputOptions, + @IContextKeyService contextKeyService: IContextKeyService, showReplaceOptions: boolean = false + ) { + super(container, contextViewProvider, showReplaceOptions, options); + this._register(registerAndCreateHistoryNavigationContext(contextKeyService, this.inputBox)); + } + +} + +KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: 'history.showPrevious', + weight: KeybindingWeight.WorkbenchContrib, + when: ContextKeyExpr.and( + ContextKeyExpr.has(HistoryNavigationWidgetFocusContext), + ContextKeyExpr.equals(HistoryNavigationBackwardsEnablementContext, true), + historyNavigationVisible.isEqualTo(false), + ), + primary: KeyCode.UpArrow, + secondary: [KeyMod.Alt | KeyCode.UpArrow], + handler: (accessor) => { + lastFocusedWidget?.showPreviousValue(); + } +}); + +KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: 'history.showNext', + weight: KeybindingWeight.WorkbenchContrib, + when: ContextKeyExpr.and( + ContextKeyExpr.has(HistoryNavigationWidgetFocusContext), + ContextKeyExpr.equals(HistoryNavigationForwardsEnablementContext, true), + historyNavigationVisible.isEqualTo(false), + ), + primary: KeyCode.DownArrow, + secondary: [KeyMod.Alt | KeyCode.DownArrow], + handler: (accessor) => { + lastFocusedWidget?.showNextValue(); + } +}); diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing/2.tst new file mode 100644 index 00000000000..0278e0c0112 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing/2.tst @@ -0,0 +1,138 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IHistoryNavigationWidget } from 'vs/base/browser/history'; +import { IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview'; +import { FindInput, IFindInputOptions } from 'vs/base/browser/ui/findinput/findInput'; +import { IReplaceInputOptions, ReplaceInput } from 'vs/base/browser/ui/findinput/replaceInput'; +import { HistoryInputBox, IHistoryInputOptions } from 'vs/base/browser/ui/inputbox/inputBox'; +import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import { ContextKeyExpr, IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { localize } from 'vs/nls'; +import { DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; + +export const historyNavigationVisible = new RawContextKey('suggestWidgetVisible', false, localize('suggestWidgetVisible', "Whether suggestion are visible")); + +const HistoryNavigationWidgetFocusContext = 'historyNavigationWidgetFocus'; +const HistoryNavigationForwardsEnablementContext = 'historyNavigationForwardsEnabled'; +const HistoryNavigationBackwardsEnablementContext = 'historyNavigationBackwardsEnabled'; + +export interface IHistoryNavigationContext extends IDisposable { + historyNavigationForwardsEnablement: IContextKey; + historyNavigationBackwardsEnablement: IContextKey; +} + +let lastFocusedWidget: IHistoryNavigationWidget | undefined = undefined; +const widgets: IHistoryNavigationWidget[] = []; + +export function registerAndCreateHistoryNavigationContext(scopedContextKeyService: IContextKeyService, widget: IHistoryNavigationWidget): IHistoryNavigationContext { + if (widgets.includes(widget)) { + throw new Error('Cannot register the same widget multiple times'); + } + + widgets.push(widget); + const disposableStore = new DisposableStore(); + const historyNavigationWidgetFocus = new RawContextKey(HistoryNavigationWidgetFocusContext, false).bindTo(scopedContextKeyService); + const historyNavigationForwardsEnablement = new RawContextKey(HistoryNavigationForwardsEnablementContext, true).bindTo(scopedContextKeyService); + const historyNavigationBackwardsEnablement = new RawContextKey(HistoryNavigationBackwardsEnablementContext, true).bindTo(scopedContextKeyService); + + const onDidFocus = () => { + historyNavigationWidgetFocus.set(true); + lastFocusedWidget = widget; + }; + + const onDidBlur = () => { + historyNavigationWidgetFocus.set(false); + if (lastFocusedWidget === widget) { + lastFocusedWidget = undefined; + } + }; + + // Check for currently being focused + if (widget.element === document.activeElement) { + onDidFocus(); + } + + disposableStore.add(widget.onDidFocus(() => onDidFocus())); + disposableStore.add(widget.onDidBlur(() => onDidBlur())); + disposableStore.add(toDisposable(() => { + widgets.splice(widgets.indexOf(widget), 1); + onDidBlur(); + })); + + return { + historyNavigationForwardsEnablement, + historyNavigationBackwardsEnablement, + dispose() { + disposableStore.dispose(); + } + }; +} + +export class ContextScopedHistoryInputBox extends HistoryInputBox { + + constructor(container: HTMLElement, contextViewProvider: IContextViewProvider | undefined, options: IHistoryInputOptions, + @IContextKeyService contextKeyService: IContextKeyService + ) { + super(container, contextViewProvider, options); + const scopedContextKeyService = this._register(contextKeyService.createScoped(this.element)); + this._register(registerAndCreateHistoryNavigationContext(scopedContextKeyService, this)); + } + +} + +export class ContextScopedFindInput extends FindInput { + + constructor(container: HTMLElement | null, contextViewProvider: IContextViewProvider, options: IFindInputOptions, + @IContextKeyService contextKeyService: IContextKeyService + ) { + super(container, contextViewProvider, options); + const scopedContextKeyService = this._register(contextKeyService.createScoped(this.inputBox.element)); + this._register(registerAndCreateHistoryNavigationContext(scopedContextKeyService, this.inputBox)); + } +} + +export class ContextScopedReplaceInput extends ReplaceInput { + + constructor(container: HTMLElement | null, contextViewProvider: IContextViewProvider | undefined, options: IReplaceInputOptions, + @IContextKeyService contextKeyService: IContextKeyService, showReplaceOptions: boolean = false + ) { + super(container, contextViewProvider, showReplaceOptions, options); + const scopedContextKeyService = this._register(contextKeyService.createScoped(this.inputBox.element)); + this._register(registerAndCreateHistoryNavigationContext(scopedContextKeyService, this.inputBox)); + } + +} + +KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: 'history.showPrevious', + weight: KeybindingWeight.WorkbenchContrib, + when: ContextKeyExpr.and( + ContextKeyExpr.has(HistoryNavigationWidgetFocusContext), + ContextKeyExpr.equals(HistoryNavigationBackwardsEnablementContext, true), + historyNavigationVisible.isEqualTo(false), + ), + primary: KeyCode.UpArrow, + secondary: [KeyMod.Alt | KeyCode.UpArrow], + handler: (accessor) => { + lastFocusedWidget?.showPreviousValue(); + } +}); + +KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: 'history.showNext', + weight: KeybindingWeight.WorkbenchContrib, + when: ContextKeyExpr.and( + ContextKeyExpr.has(HistoryNavigationWidgetFocusContext), + ContextKeyExpr.equals(HistoryNavigationForwardsEnablementContext, true), + historyNavigationVisible.isEqualTo(false), + ), + primary: KeyCode.DownArrow, + secondary: [KeyMod.Alt | KeyCode.DownArrow], + handler: (accessor) => { + lastFocusedWidget?.showNextValue(); + } +}); diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing/experimental.expected.diff.json new file mode 100644 index 00000000000..63bf0be0819 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing/experimental.expected.diff.json @@ -0,0 +1,104 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[24,25)", + "modifiedRange": "[24,24)", + "innerChanges": [ + { + "originalRange": "[24,1 -> 25,1]", + "modifiedRange": "[24,1 -> 24,1]" + } + ] + }, + { + "originalRange": "[32,33)", + "modifiedRange": "[31,32)", + "innerChanges": [ + { + "originalRange": "[32,59 -> 32,59]", + "modifiedRange": "[31,59 -> 31,60]" + }, + { + "originalRange": "[32,60 -> 32,60]", + "modifiedRange": "[31,61 -> 31,66]" + } + ] + }, + { + "originalRange": "[39,40)", + "modifiedRange": "[38,38)", + "innerChanges": [ + { + "originalRange": "[39,1 -> 40,1]", + "modifiedRange": "[38,1 -> 38,1]" + } + ] + }, + { + "originalRange": "[69,70)", + "modifiedRange": "[67,67)", + "innerChanges": [ + { + "originalRange": "[69,1 -> 70,1]", + "modifiedRange": "[67,1 -> 67,1]" + } + ] + }, + { + "originalRange": "[84,85)", + "modifiedRange": "[81,83)", + "innerChanges": [ + { + "originalRange": "[84,1 -> 84,1]", + "modifiedRange": "[81,1 -> 82,1]" + }, + { + "originalRange": "[84,60 -> 84,60]", + "modifiedRange": "[82,60 -> 82,61]" + }, + { + "originalRange": "[84,61 -> 84,61]", + "modifiedRange": "[82,62 -> 82,67]" + } + ] + }, + { + "originalRange": "[95,96)", + "modifiedRange": "[93,95)", + "innerChanges": [ + { + "originalRange": "[95,1 -> 95,1]", + "modifiedRange": "[93,1 -> 94,1]" + }, + { + "originalRange": "[95,60 -> 95,60]", + "modifiedRange": "[94,60 -> 94,61]" + }, + { + "originalRange": "[95,61 -> 95,61]", + "modifiedRange": "[94,62 -> 94,67]" + } + ] + }, + { + "originalRange": "[105,106)", + "modifiedRange": "[104,106)", + "innerChanges": [ + { + "originalRange": "[105,1 -> 105,1]", + "modifiedRange": "[104,1 -> 105,1]" + }, + { + "originalRange": "[105,60 -> 105,60]", + "modifiedRange": "[105,60 -> 105,61]" + }, + { + "originalRange": "[105,61 -> 105,61]", + "modifiedRange": "[105,62 -> 105,67]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing/smart.expected.diff.json new file mode 100644 index 00000000000..239c6fd8899 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing/smart.expected.diff.json @@ -0,0 +1,73 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[24,25)", + "modifiedRange": "[24,24)", + "innerChanges": null + }, + { + "originalRange": "[32,33)", + "modifiedRange": "[31,32)", + "innerChanges": [ + { + "originalRange": "[32,59 -> 32,61]", + "modifiedRange": "[31,59 -> 31,67]" + } + ] + }, + { + "originalRange": "[39,40)", + "modifiedRange": "[38,38)", + "innerChanges": null + }, + { + "originalRange": "[69,70)", + "modifiedRange": "[67,67)", + "innerChanges": null + }, + { + "originalRange": "[84,85)", + "modifiedRange": "[81,83)", + "innerChanges": [ + { + "originalRange": "[84,1 -> 84,1]", + "modifiedRange": "[81,1 -> 82,1]" + }, + { + "originalRange": "[84,60 -> 84,62]", + "modifiedRange": "[82,60 -> 82,68]" + } + ] + }, + { + "originalRange": "[95,96)", + "modifiedRange": "[93,95)", + "innerChanges": [ + { + "originalRange": "[95,1 -> 95,1]", + "modifiedRange": "[93,1 -> 94,1]" + }, + { + "originalRange": "[95,60 -> 95,62]", + "modifiedRange": "[94,60 -> 94,68]" + } + ] + }, + { + "originalRange": "[105,106)", + "modifiedRange": "[104,106)", + "innerChanges": [ + { + "originalRange": "[105,1 -> 105,1]", + "modifiedRange": "[104,1 -> 105,1]" + }, + { + "originalRange": "[105,60 -> 105,62]", + "modifiedRange": "[105,60 -> 105,68]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing2/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing2/1.tst new file mode 100644 index 00000000000..7cdc8bb2e94 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing2/1.tst @@ -0,0 +1,6 @@ +import { assertIsDefined } from 'vs/base/common/types'; +import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { MenuId, Action2, IAction2Options, IMenuService, SubmenuItemAction } from 'vs/platform/actions/common/actions'; +import { createActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { parseLinkedText } from 'vs/base/common/linkedText'; +import { IOpenerService } from 'vs/platform/opener/common/opener'; \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing2/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing2/2.tst new file mode 100644 index 00000000000..22f196b132b --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing2/2.tst @@ -0,0 +1,6 @@ +import { assertIsDefined } from 'vs/base/common/types'; +import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { MenuId, Action2, IAction2Options, SubmenuItemAction } from 'vs/platform/actions/common/actions'; +import { createActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { parseLinkedText } from 'vs/base/common/linkedText'; +import { IOpenerService } from 'vs/platform/opener/common/opener'; \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing2/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing2/experimental.expected.diff.json new file mode 100644 index 00000000000..e77975d759a --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing2/experimental.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[3,4)", + "modifiedRange": "[3,4)", + "innerChanges": [ + { + "originalRange": "[3,43 -> 3,57]", + "modifiedRange": "[3,43 -> 3,43]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing2/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing2/smart.expected.diff.json new file mode 100644 index 00000000000..396591fc4dc --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing2/smart.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[3,4)", + "modifiedRange": "[3,4)", + "innerChanges": [ + { + "originalRange": "[3,44 -> 3,58]", + "modifiedRange": "[3,44 -> 3,44]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing3/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing3/1.tst new file mode 100644 index 00000000000..87b71c28531 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing3/1.tst @@ -0,0 +1,9 @@ +import { assertIsDefined } from 'vs/base/common/types'; +import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { MenuId, Action2, IAction2Options, IMenuServiceFooManager, ServiceManagerLocator } from 'vs/platform/actions/common/actions'; +import { createActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { parseLinkedText } from 'vs/base/common/linkedText'; +import { IOpenerService } from 'vs/platform/opener/common/opener'; +ISFM,SML,SFMKL + +console.log(MenuId, Action2, IAction2Options, IMenuServiceFooManager, ServiceManagerLocator); \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing3/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing3/2.tst new file mode 100644 index 00000000000..97340f5c4ba --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing3/2.tst @@ -0,0 +1,9 @@ +import { assertIsDefined } from 'vs/base/common/types'; +import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { MenuId, Action2, IAction2Options, ServiceManagerLocator } from 'vs/platform/actions/common/actions'; +import { createActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { parseLinkedText } from 'vs/base/common/linkedText'; +import { IOpenerService } from 'vs/platform/opener/common/opener'; +SML + +console.log(MenuId, Action2, IAction2Options, ServiceManagerLocator); \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing3/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing3/experimental.expected.diff.json new file mode 100644 index 00000000000..af483c2217d --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing3/experimental.expected.diff.json @@ -0,0 +1,40 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[3,4)", + "modifiedRange": "[3,4)", + "innerChanges": [ + { + "originalRange": "[3,43 -> 3,67]", + "modifiedRange": "[3,43 -> 3,43]" + } + ] + }, + { + "originalRange": "[7,8)", + "modifiedRange": "[7,8)", + "innerChanges": [ + { + "originalRange": "[7,1 -> 7,6]", + "modifiedRange": "[7,1 -> 7,1]" + }, + { + "originalRange": "[7,9 -> 7,15]", + "modifiedRange": "[7,4 -> 7,4]" + } + ] + }, + { + "originalRange": "[9,10)", + "modifiedRange": "[9,10)", + "innerChanges": [ + { + "originalRange": "[9,46 -> 9,70]", + "modifiedRange": "[9,46 -> 9,46]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing3/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing3/smart.expected.diff.json new file mode 100644 index 00000000000..e8211fc3870 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-fragmented-eager-diffing3/smart.expected.diff.json @@ -0,0 +1,40 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[3,4)", + "modifiedRange": "[3,4)", + "innerChanges": [ + { + "originalRange": "[3,44 -> 3,68]", + "modifiedRange": "[3,44 -> 3,44]" + } + ] + }, + { + "originalRange": "[7,8)", + "modifiedRange": "[7,8)", + "innerChanges": [ + { + "originalRange": "[7,1 -> 7,6]", + "modifiedRange": "[7,1 -> 7,1]" + }, + { + "originalRange": "[7,9 -> 7,15]", + "modifiedRange": "[7,4 -> 7,4]" + } + ] + }, + { + "originalRange": "[9,10)", + "modifiedRange": "[9,10)", + "innerChanges": [ + { + "originalRange": "[9,47 -> 9,71]", + "modifiedRange": "[9,47 -> 9,47]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-import-ws-affinity/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-import-ws-affinity/1.tst new file mode 100644 index 00000000000..29c4af7cfa7 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-import-ws-affinity/1.tst @@ -0,0 +1,3 @@ +import { handledConflictMinimapOverViewRulerColor, unhandledConflictMinimapOverViewRulerColor } from 'vs/workbench/contrib/mergeEditor/browser/view/colors'; +import { EditorGutter, IGutterItemInfo, IGutterItemView } from '../editorGutter'; +import { CodeEditorView } from './codeEditorView'; diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-import-ws-affinity/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-import-ws-affinity/2.tst new file mode 100644 index 00000000000..154166e11fc --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-import-ws-affinity/2.tst @@ -0,0 +1,3 @@ +import { handledConflictMinimapOverViewRulerColor, unhandledConflictMinimapOverViewRulerColor } from 'vs/workbench/contrib/mergeEditor/browser/view/colors'; +import { EditorGutter, IGutterItemInfo, IGutterItemView } from '../editorGutter'; +import { CodeEditorView, TitleMenu } from './codeEditorView'; diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-import-ws-affinity/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-import-ws-affinity/experimental.expected.diff.json new file mode 100644 index 00000000000..322bb5fc3be --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-import-ws-affinity/experimental.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[3,4)", + "modifiedRange": "[3,4)", + "innerChanges": [ + { + "originalRange": "[3,24 -> 3,24]", + "modifiedRange": "[3,24 -> 3,35]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-import-ws-affinity/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-import-ws-affinity/smart.expected.diff.json new file mode 100644 index 00000000000..322bb5fc3be --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-import-ws-affinity/smart.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[3,4)", + "modifiedRange": "[3,4)", + "innerChanges": [ + { + "originalRange": "[3,24 -> 3,24]", + "modifiedRange": "[3,24 -> 3,35]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-insert/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-insert/1.tst new file mode 100644 index 00000000000..5b19ed203f4 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-insert/1.tst @@ -0,0 +1 @@ +const sequence2 = new SequenceFromIntArray(tgtDocLines); \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-insert/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-insert/2.tst new file mode 100644 index 00000000000..7e50aad3276 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-insert/2.tst @@ -0,0 +1 @@ +const sequence2 = new LineSequence(tgtDocLines, modifiedLines); \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-insert/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-insert/experimental.expected.diff.json new file mode 100644 index 00000000000..d7b3e05ef3a --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-insert/experimental.expected.diff.json @@ -0,0 +1,24 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[1,2)", + "modifiedRange": "[1,2)", + "innerChanges": [ + { + "originalRange": "[1,23 -> 1,23]", + "modifiedRange": "[1,23 -> 1,27]" + }, + { + "originalRange": "[1,31 -> 1,43]", + "modifiedRange": "[1,35 -> 1,35]" + }, + { + "originalRange": "[1,55 -> 1,55]", + "modifiedRange": "[1,47 -> 1,62]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-insert/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-insert/smart.expected.diff.json new file mode 100644 index 00000000000..d7b3e05ef3a --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-insert/smart.expected.diff.json @@ -0,0 +1,24 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[1,2)", + "modifiedRange": "[1,2)", + "innerChanges": [ + { + "originalRange": "[1,23 -> 1,23]", + "modifiedRange": "[1,23 -> 1,27]" + }, + { + "originalRange": "[1,31 -> 1,43]", + "modifiedRange": "[1,35 -> 1,35]" + }, + { + "originalRange": "[1,55 -> 1,55]", + "modifiedRange": "[1,47 -> 1,62]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-methods/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-methods/1.tst new file mode 100644 index 00000000000..795319a6f1e --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-methods/1.tst @@ -0,0 +1,5 @@ +interface Test { + getDecorationsInViewport(visibleRange: Range): ViewModelDecoration[]; + getViewLineRenderingData(visibleRange: Range, lineNumber: number): ViewLineRenderingData; + getViewLineData(lineNumber: number): ViewLineData; +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-methods/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-methods/2.tst new file mode 100644 index 00000000000..0a28ea569d5 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-methods/2.tst @@ -0,0 +1,6 @@ +interface Test { + getDecorationsInViewport(visibleRange: Range): ViewModelDecoration[]; + getViewportViewLineRenderingData(visibleRange: Range, lineNumber: number): ViewLineRenderingData; + getViewLineRenderingData(lineNumber: number): ViewLineRenderingData; + getViewLineData(lineNumber: number): ViewLineData; +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-methods/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-methods/experimental.expected.diff.json new file mode 100644 index 00000000000..e5e8876bd55 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-methods/experimental.expected.diff.json @@ -0,0 +1,24 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[3,4)", + "modifiedRange": "[3,5)", + "innerChanges": [ + { + "originalRange": "[3,1 -> 3,2]", + "modifiedRange": "[3,1 -> 3,5]" + }, + { + "originalRange": "[3,4 -> 3,4]", + "modifiedRange": "[3,7 -> 3,15]" + }, + { + "originalRange": "[3,91 -> 3,91]", + "modifiedRange": "[3,102 -> 4,73]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-methods/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-methods/smart.expected.diff.json new file mode 100644 index 00000000000..69e0286f34d --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-methods/smart.expected.diff.json @@ -0,0 +1,24 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[3,4)", + "modifiedRange": "[3,5)", + "innerChanges": [ + { + "originalRange": "[3,1 -> 3,2]", + "modifiedRange": "[3,1 -> 3,5]" + }, + { + "originalRange": "[3,9 -> 3,9]", + "modifiedRange": "[3,12 -> 3,20]" + }, + { + "originalRange": "[3,91 -> 3,91]", + "modifiedRange": "[3,102 -> 4,73]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-shift-to-ws/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-shift-to-ws/1.tst new file mode 100644 index 00000000000..3dc9ae9bef7 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-shift-to-ws/1.tst @@ -0,0 +1,12 @@ +const childEndsAfterEnd = lengthGreaterThanEqual(nodeOffsetEnd, endOffset); +if (childEndsAfterEnd) { + // No child after this child in the requested window, don't recurse + node = child; + level++; + continue whileLoop; +} + +const shouldContinue = collectBrackets(child, nodeOffsetStart, nodeOffsetEnd, startOffset, endOffset, push, level + 1, levelPerBracketType); +if (!shouldContinue) { + return false; +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-shift-to-ws/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-shift-to-ws/2.tst new file mode 100644 index 00000000000..ab46b84fb0b --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-shift-to-ws/2.tst @@ -0,0 +1,12 @@ +const childEndsAfterEnd = lengthGreaterThanEqual(nodeOffsetEnd, endOffset); +if (childEndsAfterEnd) { + // No child after this child in the requested window, don't recurse + node = child; + level++; + continue whileLoop; +} + +const shouldContinue = collectBrackets(child, nodeOffsetStart, nodeOffsetEnd, startOffset, endOffset, push, level + 1, levelPerBracket + 1, levelPerBracketType); +if (!shouldContinue) { + return false; +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-shift-to-ws/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-shift-to-ws/experimental.expected.diff.json new file mode 100644 index 00000000000..807bbb2dcd9 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-shift-to-ws/experimental.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[9,10)", + "modifiedRange": "[9,10)", + "innerChanges": [ + { + "originalRange": "[9,116 -> 9,116]", + "modifiedRange": "[9,116 -> 9,137]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-shift-to-ws/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-shift-to-ws/smart.expected.diff.json new file mode 100644 index 00000000000..e155ae69309 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-shift-to-ws/smart.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[9,10)", + "modifiedRange": "[9,10)", + "innerChanges": [ + { + "originalRange": "[9,135 -> 9,135]", + "modifiedRange": "[9,135 -> 9,156]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-shifting/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-shifting/1.tst new file mode 100644 index 00000000000..868802afac9 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-shifting/1.tst @@ -0,0 +1,28 @@ +[ + { + "identifier": { + "id": "pflannery.vscode-versionlens", + "uuid": "07fc4a0a-11fc-4121-ba9a-f0d534c729d8" + }, + "preRelease": false, + "version": "1.0.9", + "installed": true + }, + { + "identifier": { + "id": "sumneko.lua", + "uuid": "3a15b5a7-be12-47e3-8445-88ee3eabc8b2" + }, + "preRelease": false, + "version": "3.5.6", + "installed": true + }, + { + "identifier": { + "id": "vscode.bat", + "uuid": "5ef96c58-076f-4167-8e40-62c9deb00496" + }, + "preRelease": false, + "version": "1.0.0" + } +] \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-shifting/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-shifting/2.tst new file mode 100644 index 00000000000..ef593d66917 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-shifting/2.tst @@ -0,0 +1,19 @@ +[ + { + "identifier": { + "id": "pflannery.vscode-versionlens", + "uuid": "07fc4a0a-11fc-4121-ba9a-f0d534c729d8" + }, + "preRelease": false, + "version": "1.0.9", + "installed": true + }, + { + "identifier": { + "id": "vscode.bat", + "uuid": "5ef96c58-076f-4167-8e40-62c9deb00496" + }, + "preRelease": false, + "version": "1.0.0" + } +] \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-shifting/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-shifting/experimental.expected.diff.json new file mode 100644 index 00000000000..7cae68fdc45 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-shifting/experimental.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[11,20)", + "modifiedRange": "[11,11)", + "innerChanges": [ + { + "originalRange": "[11,1 -> 20,1]", + "modifiedRange": "[11,1 -> 11,1]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-shifting/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-shifting/smart.expected.diff.json new file mode 100644 index 00000000000..32fdb9dbdd9 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-shifting/smart.expected.diff.json @@ -0,0 +1,11 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[13,22)", + "modifiedRange": "[13,13)", + "innerChanges": null + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-strings/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-strings/1.tst new file mode 100644 index 00000000000..8a2d25d99ac --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-strings/1.tst @@ -0,0 +1,7 @@ +interface Test { + /** + * Controls whether the fold actions in the gutter stay always visible or hide unless the mouse is over the gutter. + * Defaults to 'mouseover'. + */ + showFoldingControls?: 'always' | 'mouseover'; +} diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-strings/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-strings/2.tst new file mode 100644 index 00000000000..1a03e3ab270 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-strings/2.tst @@ -0,0 +1,7 @@ +interface Test { + /** + * Controls whether the fold actions in the gutter stay always visible or hide unless the mouse is over the gutter. + * Defaults to 'mouseover'. + */ + showFoldingControls?: 'always' | 'never' | 'mouseover'; +} diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-strings/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-strings/experimental.expected.diff.json new file mode 100644 index 00000000000..1781d792519 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-strings/experimental.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[6,7)", + "modifiedRange": "[6,7)", + "innerChanges": [ + { + "originalRange": "[6,35 -> 6,35]", + "modifiedRange": "[6,35 -> 6,45]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-strings/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-strings/smart.expected.diff.json new file mode 100644 index 00000000000..eccec9997d5 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-strings/smart.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[6,7)", + "modifiedRange": "[6,7)", + "innerChanges": [ + { + "originalRange": "[6,39 -> 6,39]", + "modifiedRange": "[6,39 -> 6,49]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-too-much-minimization/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-too-much-minimization/1.tst new file mode 100644 index 00000000000..0436fa2afb8 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-too-much-minimization/1.tst @@ -0,0 +1,20 @@ +class Test { + protected readonly checkboxesVisible = observableFromEvent( + this.configurationService.onDidChangeConfiguration, + () => /** @description checkboxesVisible */ this.configurationService.getValue('mergeEditor.showCheckboxes') ?? false + ); + + protected readonly showDeletionMarkers = observableFromEvent( + this.configurationService.onDidChangeConfiguration, + () => /** @description showDeletionMarkers */ this.configurationService.getValue('mergeEditor.showDeletionMarkers') + ); + + public readonly editor = this.instantiationService.createInstance( + CodeEditorWidget, + this.htmlElements.editor, + {}, + { + contributions: this.getEditorContributions(), + } + ); +} diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-too-much-minimization/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-too-much-minimization/2.tst new file mode 100644 index 00000000000..554f356ffd5 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-too-much-minimization/2.tst @@ -0,0 +1,25 @@ +class Test { + protected readonly checkboxesVisible = observableFromEvent( + this.configurationService.onDidChangeConfiguration, + () => /** @description checkboxesVisible */ this.configurationService.getValue('mergeEditor.showCheckboxes') ?? false + ); + + protected readonly showDeletionMarkers = observableFromEvent( + this.configurationService.onDidChangeConfiguration, + () => /** @description showDeletionMarkers */ this.configurationService.getValue('mergeEditor.showDeletionMarkers') ?? true + ); + + protected readonly useSimplifiedDecorations = observableFromEvent( + this.configurationService.onDidChangeConfiguration, + () => /** @description useSimplifiedDecorations */ this.configurationService.getValue('mergeEditor.useSimplifiedDecorations') ?? false + ); + + public readonly editor = this.instantiationService.createInstance( + CodeEditorWidget, + this.htmlElements.editor, + {}, + { + contributions: this.getEditorContributions(), + } + ); +} diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-too-much-minimization/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-too-much-minimization/experimental.expected.diff.json new file mode 100644 index 00000000000..7edda326b75 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-too-much-minimization/experimental.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[9,10)", + "modifiedRange": "[9,15)", + "innerChanges": [ + { + "originalRange": "[9,124 -> 9,124]", + "modifiedRange": "[9,124 -> 14,143]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-too-much-minimization/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-too-much-minimization/smart.expected.diff.json new file mode 100644 index 00000000000..7edda326b75 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-too-much-minimization/smart.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[9,10)", + "modifiedRange": "[9,15)", + "innerChanges": [ + { + "originalRange": "[9,124 -> 9,124]", + "modifiedRange": "[9,124 -> 14,143]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-unfragmented-diffing/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-unfragmented-diffing/1.tst new file mode 100644 index 00000000000..c7454793249 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-unfragmented-diffing/1.tst @@ -0,0 +1,14 @@ +import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { EditorAction, EditorCommand, registerEditorAction, registerEditorCommand, registerEditorContribution, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; +import { IEditorContribution } from 'vs/editor/common/editorCommon'; +import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; +import * as languages from 'vs/editor/common/languages'; +import { TriggerContext } from 'vs/editor/contrib/parameterHints/browser/parameterHintsModel'; +import { Context } from 'vs/editor/contrib/parameterHints/browser/provideSignatureHelp'; +import * as nls from 'vs/nls'; +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { ParameterHintsWidget } from './parameterHintsWidget'; diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-unfragmented-diffing/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-unfragmented-diffing/2.tst new file mode 100644 index 00000000000..f08a014aafe --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-unfragmented-diffing/2.tst @@ -0,0 +1,16 @@ +import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import { Lazy } from 'vs/base/common/lazy'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { EditorAction, EditorCommand, registerEditorAction, registerEditorCommand, registerEditorContribution, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; +import { IEditorContribution } from 'vs/editor/common/editorCommon'; +import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; +import * as languages from 'vs/editor/common/languages'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { ParameterHintsModel, TriggerContext } from 'vs/editor/contrib/parameterHints/browser/parameterHintsModel'; +import { Context } from 'vs/editor/contrib/parameterHints/browser/provideSignatureHelp'; +import * as nls from 'vs/nls'; +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { ParameterHintsWidget } from './parameterHintsWidget'; diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-unfragmented-diffing/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-unfragmented-diffing/experimental.expected.diff.json new file mode 100644 index 00000000000..5d7e0b3c24d --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-unfragmented-diffing/experimental.expected.diff.json @@ -0,0 +1,30 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[2,2)", + "modifiedRange": "[2,3)", + "innerChanges": [ + { + "originalRange": "[2,1 -> 2,1]", + "modifiedRange": "[2,1 -> 3,1]" + } + ] + }, + { + "originalRange": "[8,9)", + "modifiedRange": "[9,11)", + "innerChanges": [ + { + "originalRange": "[8,8 -> 8,8]", + "modifiedRange": "[9,8 -> 10,8]" + }, + { + "originalRange": "[8,9 -> 8,9]", + "modifiedRange": "[10,9 -> 10,30]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-unfragmented-diffing/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-unfragmented-diffing/smart.expected.diff.json new file mode 100644 index 00000000000..9f3b700c75e --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-unfragmented-diffing/smart.expected.diff.json @@ -0,0 +1,21 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[2,2)", + "modifiedRange": "[2,3)", + "innerChanges": null + }, + { + "originalRange": "[8,9)", + "modifiedRange": "[9,11)", + "innerChanges": [ + { + "originalRange": "[8,10 -> 8,10]", + "modifiedRange": "[9,10 -> 10,31]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-unit-test/1.tst b/src/vs/editor/test/node/diffing/fixtures/ts-unit-test/1.tst new file mode 100644 index 00000000000..d32a16fbbd3 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-unit-test/1.tst @@ -0,0 +1,17 @@ +test(() => { + it(() => { + console.log(1); + }) + + it(() => { + }) +}); + +test(() => { + it(() => { + console.log(1); + }) + + it(() => { + }) +}); \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-unit-test/2.tst b/src/vs/editor/test/node/diffing/fixtures/ts-unit-test/2.tst new file mode 100644 index 00000000000..ded30de58ef --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-unit-test/2.tst @@ -0,0 +1,26 @@ +test(() => { + it(() => { + console.log(1); + }) + + it(() => { +2 console.log(2); + }) + + it(() => { + + }) +}); + +test(() => { + it(() => { + console.log(1); + }) + + it(() => { + }) + + it(() => { + + }) +}); \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-unit-test/experimental.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-unit-test/experimental.expected.diff.json new file mode 100644 index 00000000000..a37e3ebe187 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-unit-test/experimental.expected.diff.json @@ -0,0 +1,26 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[7,7)", + "modifiedRange": "[7,12)", + "innerChanges": [ + { + "originalRange": "[7,1 -> 7,1]", + "modifiedRange": "[7,1 -> 12,1]" + } + ] + }, + { + "originalRange": "[17,17)", + "modifiedRange": "[22,26)", + "innerChanges": [ + { + "originalRange": "[17,1 -> 17,1]", + "modifiedRange": "[22,1 -> 26,1]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/ts-unit-test/smart.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/ts-unit-test/smart.expected.diff.json new file mode 100644 index 00000000000..4c25222b3b4 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/ts-unit-test/smart.expected.diff.json @@ -0,0 +1,16 @@ +{ + "originalFileName": "./1.tst", + "modifiedFileName": "./2.tst", + "diffs": [ + { + "originalRange": "[7,7)", + "modifiedRange": "[7,12)", + "innerChanges": null + }, + { + "originalRange": "[17,17)", + "modifiedRange": "[22,26)", + "innerChanges": null + } + ] +} \ No newline at end of file