Adds floating block comments to the outlining spans response (#36880)

* Adds floating block comments to the outlining spans response

* Only use one route for grabbing outline nodes, which now includes special casing the EOF token
This commit is contained in:
Orta 2020-02-25 17:09:16 -05:00 committed by GitHub
parent 43863cafe2
commit 8a797cad2b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 45 additions and 8 deletions

View File

@ -2500,18 +2500,35 @@ namespace FourSlash {
public printOutliningSpans() {
const spans = this.languageService.getOutliningSpans(this.activeFile.fileName);
Harness.IO.log(`Outlining spans (${spans.length} items)`);
Harness.IO.log(`Outlining spans (${spans.length} items)\nResults:`);
Harness.IO.log(stringify(spans));
this.printOutliningSpansInline(spans);
}
private printOutliningSpansInline(spans: ts.OutliningSpan[]) {
const allSpanInsets = [] as { text: string, pos: number }[];
let annotated = this.activeFile.content;
ts.forEach(spans, span => {
allSpanInsets.push({ text: "[|", pos: span.textSpan.start });
allSpanInsets.push({ text: "|]", pos: span.textSpan.start + span.textSpan.length });
});
const reverseSpans = allSpanInsets.sort((l, r) => r.pos - l.pos);
ts.forEach(reverseSpans, span => {
annotated = annotated.slice(0, span.pos) + span.text + annotated.slice(span.pos);
});
Harness.IO.log(`\nMockup:\n${annotated}`);
}
public verifyOutliningSpans(spans: Range[], kind?: "comment" | "region" | "code" | "imports") {
const actual = this.languageService.getOutliningSpans(this.activeFile.fileName);
if (actual.length !== spans.length) {
this.raiseError(`verifyOutliningSpans failed - expected total spans to be ${spans.length}, but was ${actual.length}`);
const filterActual = ts.filter(actual, f => kind === undefined ? true : f.kind === kind);
if (filterActual.length !== spans.length) {
this.raiseError(`verifyOutliningSpans failed - expected total spans to be ${spans.length}, but was ${actual.length}\n\nFound Spans:\n\n${this.printOutliningSpansInline(actual)}`);
}
ts.zipWith(spans, actual, (expectedSpan, actualSpan, i) => {
ts.zipWith(spans, filterActual, (expectedSpan, actualSpan, i) => {
if (expectedSpan.pos !== actualSpan.textSpan.start || expectedSpan.end !== ts.textSpanEnd(actualSpan.textSpan)) {
return this.raiseError(`verifyOutliningSpans failed - span ${(i + 1)} expected: (${expectedSpan.pos},${expectedSpan.end}), actual: (${actualSpan.textSpan.start},${ts.textSpanEnd(actualSpan.textSpan)})`);
}

View File

@ -10,7 +10,8 @@ namespace ts.OutliningElementsCollector {
function addNodeOutliningSpans(sourceFile: SourceFile, cancellationToken: CancellationToken, out: Push<OutliningSpan>): void {
let depthRemaining = 40;
let current = 0;
const statements = sourceFile.statements;
// Includes the EOF Token so that comments which aren't attached to statements are included
const statements = [...sourceFile.statements, sourceFile.endOfFileToken];
const n = statements.length;
while (current < n) {
while (current < n && !isAnyImportSyntax(statements[current])) {
@ -33,7 +34,7 @@ namespace ts.OutliningElementsCollector {
if (depthRemaining === 0) return;
cancellationToken.throwIfCancellationRequested();
if (isDeclaration(n)) {
if (isDeclaration(n) || n.kind === SyntaxKind.EndOfFileToken) {
addOutliningForLeadingCommentsForNode(n, sourceFile, cancellationToken, out);
}

View File

@ -317,7 +317,7 @@ declare namespace FourSlashInterface {
baselineQuickInfo(): void;
baselineSmartSelection(): void;
nameOrDottedNameSpanTextIs(text: string): void;
outliningSpansInCurrentFile(spans: Range[]): void;
outliningSpansInCurrentFile(spans: Range[], kind?: "comment" | "region" | "code" | "imports"): void;
outliningHintSpansInCurrentFile(spans: Range[]): void;
todoCommentsInCurrentFile(descriptors: string[]): void;
matchingBracePositionInCurrentFile(bracePosition: number, expectedMatchPosition: number): void;

View File

@ -0,0 +1,9 @@
/// <reference path="fourslash.ts"/>
// #22732
////[|/*
///// * Some text
//// */|]
verify.outliningHintSpansInCurrentFile(test.ranges());

View File

@ -0,0 +1,10 @@
/// <reference path="fourslash.ts"/>
// #22732
////console.log(0);
////[|/*
///// * Some text
//// */|]
verify.outliningHintSpansInCurrentFile(test.ranges());

View File

@ -48,4 +48,4 @@
////// #endregion
////*/
verify.outliningSpansInCurrentFile(test.ranges(), "region");
verify.outliningSpansInCurrentFile(test.ranges(), "region");