Skip to content

Commit 6fc2e4a

Browse files
committed
Add custom baseline format for smart selection
1 parent f0a3d2b commit 6fc2e4a

File tree

2 files changed

+46
-9
lines changed

2 files changed

+46
-9
lines changed

src/harness/fourslash.ts

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1417,12 +1417,7 @@ Actual: ${stringify(fullActual)}`);
14171417
}
14181418

14191419
public baselineCurrentFileBreakpointLocations() {
1420-
let baselineFile = this.testData.globalOptions[MetadataOptionNames.baselineFile];
1421-
if (!baselineFile) {
1422-
baselineFile = this.activeFile.fileName.replace(this.basePath + "/breakpointValidation", "bpSpan");
1423-
baselineFile = baselineFile.replace(ts.Extension.Ts, ".baseline");
1424-
1425-
}
1420+
const baselineFile = this.getBaselineFileName().replace(this.basePath + "/breakpointValidation", "bpSpan");
14261421
Harness.Baseline.runBaseline(baselineFile, this.baselineCurrentFileLocations(pos => this.getBreakpointStatementLocation(pos)!));
14271422
}
14281423

@@ -1497,8 +1492,7 @@ Actual: ${stringify(fullActual)}`);
14971492
}
14981493

14991494
public baselineQuickInfo() {
1500-
const baselineFile = this.testData.globalOptions[MetadataOptionNames.baselineFile] ||
1501-
ts.getBaseFileName(this.activeFile.fileName).replace(ts.Extension.Ts, ".baseline");
1495+
const baselineFile = this.getBaselineFileName();
15021496
Harness.Baseline.runBaseline(
15031497
baselineFile,
15041498
stringify(
@@ -1508,6 +1502,39 @@ Actual: ${stringify(fullActual)}`);
15081502
}))));
15091503
}
15101504

1505+
public baselineSmartSelection() {
1506+
const n = ts.sys.newLine;
1507+
const baselineFile = this.getBaselineFileName();
1508+
const markers = this.getMarkers();
1509+
const fileContent = this.activeFile.content;
1510+
const text = markers.map(marker => {
1511+
const baselineContent = [fileContent.slice(0, marker.position) + "/**/" + fileContent.slice(marker.position) + n];
1512+
let selectionRange: ts.SelectionRange | undefined = this.languageService.getSmartSelectionRange(this.activeFile.fileName, marker.position);
1513+
while (selectionRange) {
1514+
const { textSpan } = selectionRange;
1515+
let masked = Array.from(fileContent).map((char, index) => {
1516+
const charCode = char.charCodeAt(0);
1517+
if (index >= textSpan.start && index < ts.textSpanEnd(textSpan)) {
1518+
return char === " " ? "•" : ts.isLineBreak(charCode) ? `↲${n}` : char;
1519+
}
1520+
return ts.isLineBreak(charCode) ? char : " ";
1521+
}).join("");
1522+
masked = masked.replace(/^\s*$\r?\n?/gm, ""); // Remove blank lines
1523+
const isRealCharacter = (char: string) => char !== "•" && char !== "↲" && !ts.isWhiteSpaceLike(char.charCodeAt(0));
1524+
const leadingWidth = Array.from(masked).findIndex(isRealCharacter);
1525+
const trailingWidth = ts.findLastIndex(Array.from(masked), isRealCharacter);
1526+
masked = masked.slice(0, leadingWidth)
1527+
+ masked.slice(leadingWidth, trailingWidth).replace(//g, " ").replace(//g, "")
1528+
+ masked.slice(trailingWidth);
1529+
baselineContent.push(masked);
1530+
selectionRange = selectionRange.parent;
1531+
}
1532+
return baselineContent.join(n);
1533+
}).join(n.repeat(2) + "=".repeat(80) + n.repeat(2));
1534+
1535+
Harness.Baseline.runBaseline(baselineFile, text);
1536+
}
1537+
15111538
public printBreakpointLocation(pos: number) {
15121539
Harness.IO.log("\n**Pos: " + pos + " " + this.spanInfoToString(this.getBreakpointStatementLocation(pos)!, " "));
15131540
}
@@ -1562,6 +1589,11 @@ Actual: ${stringify(fullActual)}`);
15621589
Harness.IO.log(stringify(help.items[help.selectedItemIndex]));
15631590
}
15641591

1592+
private getBaselineFileName() {
1593+
return this.testData.globalOptions[MetadataOptionNames.baselineFile] ||
1594+
ts.getBaseFileName(this.activeFile.fileName).replace(ts.Extension.Ts, ".baseline");
1595+
}
1596+
15651597
private getSignatureHelp({ triggerReason }: FourSlashInterface.VerifySignatureHelpOptions): ts.SignatureHelpItems | undefined {
15661598
return this.languageService.getSignatureHelpItems(this.activeFile.fileName, this.currentCaretPosition, {
15671599
triggerReason
@@ -3973,6 +4005,10 @@ namespace FourSlashInterface {
39734005
this.state.baselineQuickInfo();
39744006
}
39754007

4008+
public baselineSmartSelection() {
4009+
this.state.baselineSmartSelection();
4010+
}
4011+
39764012
public nameOrDottedNameSpanTextIs(text: string) {
39774013
this.state.verifyCurrentNameOrDottedNameSpanText(text);
39784014
}

tests/cases/fourslash/fourslash.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ declare namespace FourSlashInterface {
244244
baselineGetEmitOutput(insertResultsIntoVfs?: boolean): void;
245245
getEmitOutput(expectedOutputFiles: ReadonlyArray<string>): void;
246246
baselineQuickInfo(): void;
247+
baselineSmartSelection(): void;
247248
nameOrDottedNameSpanTextIs(text: string): void;
248249
outliningSpansInCurrentFile(spans: Range[]): void;
249250
todoCommentsInCurrentFile(descriptors: string[]): void;
@@ -508,7 +509,7 @@ declare namespace FourSlashInterface {
508509
readonly importModuleSpecifierEnding?: "minimal" | "index" | "js";
509510
}
510511
interface CompletionsOptions {
511-
readonly marker?: ArrayOrSingle<string | Marker>,
512+
readonly marker?: ArrayOrSingle<string | Marker>;
512513
readonly isNewIdentifierLocation?: boolean;
513514
readonly isGlobalCompletion?: boolean;
514515
readonly exact?: ArrayOrSingle<ExpectedCompletionEntry>;

0 commit comments

Comments
 (0)