mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Co-authored-by: Isabel Duan <isabelduan@microsoft.com> Co-authored-by: Daniel Rosenwasser <DanielRosenwasser@users.noreply.github.com>
This commit is contained in:
co-authored by
Isabel Duan
Daniel Rosenwasser
parent
c8da9d59fe
commit
a360d9fb3a
@@ -3576,6 +3576,73 @@ export class TestState {
|
||||
}
|
||||
}
|
||||
|
||||
public baselineLinkedEditing(): void {
|
||||
const baselineFile = this.getBaselineFileNameForContainingTestFile(".linkedEditing.txt");
|
||||
const files = this.testData.files;
|
||||
|
||||
let baselineContent = "";
|
||||
let offset = 0;
|
||||
for (const f of files) {
|
||||
const result = getLinkedEditingBaselineWorker(f, offset, this.languageService);
|
||||
baselineContent += result.baselineContent + `\n\n\n`;
|
||||
offset = result.offset;
|
||||
}
|
||||
|
||||
Harness.Baseline.runBaseline(baselineFile, baselineContent);
|
||||
|
||||
function getLinkedEditingBaselineWorker(activeFile: FourSlashFile, offset: number, languageService: ts.LanguageService) {
|
||||
const fileName = activeFile.fileName;
|
||||
let baselineContent = `=== ${fileName} ===\n`;
|
||||
|
||||
// get linkedEdit at every position in the file, then group positions by their linkedEdit
|
||||
const linkedEditsInFile = new Map<string, number[]>();
|
||||
for(let pos = 0; pos < activeFile.content.length; pos++) {
|
||||
const linkedEditAtPosition = languageService.getLinkedEditingRangeAtPosition(fileName, pos);
|
||||
if (!linkedEditAtPosition) continue;
|
||||
|
||||
const linkedEditString = JSON.stringify(linkedEditAtPosition);
|
||||
const existingPositions = linkedEditsInFile.get(linkedEditString) ?? [];
|
||||
linkedEditsInFile.set(linkedEditString, [...existingPositions, pos]);
|
||||
}
|
||||
|
||||
const linkedEditsByRange = [...linkedEditsInFile.entries()].sort((a, b) => a[1][0] - b[1][0]);
|
||||
if (linkedEditsByRange.length === 0) {
|
||||
return { baselineContent: baselineContent + activeFile.content + `\n\n--No linked edits found--`, offset };
|
||||
}
|
||||
|
||||
let inlineLinkedEditBaselines: { start: number, end: number, index: number }[] = [];
|
||||
let linkedEditInfoBaseline = "";
|
||||
for (const edit of linkedEditsByRange) {
|
||||
const [linkedEdit, positions] = edit;
|
||||
let rangeStart = 0;
|
||||
for (let j = 0; j < positions.length - 1; j++) {
|
||||
// for each distinct range in the list of positions, add an entry to the list of places that need to be annotated in the baseline
|
||||
if (positions[j] + 1 !== positions[j + 1]) {
|
||||
inlineLinkedEditBaselines.push({ start: positions[rangeStart], end: positions[j], index: offset });
|
||||
rangeStart = j + 1;
|
||||
}
|
||||
}
|
||||
inlineLinkedEditBaselines.push({ start: positions[rangeStart], end: positions[positions.length - 1], index: offset });
|
||||
|
||||
// add the LinkedEditInfo with its index to the baseline
|
||||
linkedEditInfoBaseline += `\n\n=== ${offset} ===\n` + linkedEdit;
|
||||
offset++;
|
||||
}
|
||||
|
||||
inlineLinkedEditBaselines = inlineLinkedEditBaselines.sort((a, b) => a.start - b.start);
|
||||
const fileText = activeFile.content;
|
||||
baselineContent += fileText.slice(0, inlineLinkedEditBaselines[0].start);
|
||||
for (let i = 0; i < inlineLinkedEditBaselines.length; i++) {
|
||||
const e = inlineLinkedEditBaselines[i];
|
||||
const sliceEnd = inlineLinkedEditBaselines[i + 1]?.start;
|
||||
baselineContent += `[|/*${e.index}*/` + fileText.slice(e.start, e.end) + `|]` + fileText.slice(e.end, sliceEnd);
|
||||
}
|
||||
|
||||
baselineContent += linkedEditInfoBaseline;
|
||||
return { baselineContent, offset };
|
||||
}
|
||||
}
|
||||
|
||||
public verifyMatchingBracePosition(bracePosition: number, expectedMatchPosition: number) {
|
||||
const actual = this.languageService.getBraceMatchingAtPosition(this.activeFile.fileName, bracePosition);
|
||||
|
||||
|
||||
@@ -181,6 +181,10 @@ export class VerifyNegatable {
|
||||
this.state.verifyLinkedEditingRange(map);
|
||||
}
|
||||
|
||||
public baselineLinkedEditing(): void {
|
||||
this.state.baselineLinkedEditing();
|
||||
}
|
||||
|
||||
public isInCommentAtPosition(onlyMultiLineDiverges?: boolean) {
|
||||
this.state.verifySpanOfEnclosingComment(this.negative, onlyMultiLineDiverges);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user