diff --git a/src/services/outliningElementsCollector.ts b/src/services/outliningElementsCollector.ts index 91754e2ac76..bae6bc7222c 100644 --- a/src/services/outliningElementsCollector.ts +++ b/src/services/outliningElementsCollector.ts @@ -63,7 +63,7 @@ namespace ts.OutliningElementsCollector { const currentLineStart = lineStarts[i]; const lineEnd = i + 1 === lineStarts.length ? sourceFile.getEnd() : lineStarts[i + 1] - 1; const lineText = sourceFile.text.substring(currentLineStart, lineEnd); - const result = lineText.match(/^\s*\/\/\s*#(end)?region(?:\s+(.*))?(?:\r)?$/); + const result = isRegionDelimiter(lineText); if (!result || isInComment(sourceFile, currentLineStart)) { continue; } @@ -83,16 +83,30 @@ namespace ts.OutliningElementsCollector { } } + const regionDelimiterRegExp = /^\s*\/\/\s*#(end)?region(?:\s+(.*))?(?:\r)?$/; + function isRegionDelimiter(lineText: string) { + return regionDelimiterRegExp.exec(lineText); + } + function addOutliningForLeadingCommentsForNode(n: Node, sourceFile: SourceFile, cancellationToken: CancellationToken, out: Push): void { const comments = getLeadingCommentRangesOfNode(n, sourceFile); if (!comments) return; let firstSingleLineCommentStart = -1; let lastSingleLineCommentEnd = -1; let singleLineCommentCount = 0; + const sourceText = sourceFile.getFullText(); for (const { kind, pos, end } of comments) { cancellationToken.throwIfCancellationRequested(); switch (kind) { case SyntaxKind.SingleLineCommentTrivia: + // never fold region delimiters into single-line comment regions + const commentText = sourceText.slice(pos, end); + if (isRegionDelimiter(commentText)) { + combineAndAddMultipleSingleLineComments(); + singleLineCommentCount = 0; + break; + } + // For single line comments, combine consecutive ones (2 or more) into // a single span from the start of the first till the end of the last if (singleLineCommentCount === 0) { diff --git a/tests/cases/fourslash/server/getOutliningSpansForRegionsNoSingleLineFolds.ts b/tests/cases/fourslash/server/getOutliningSpansForRegionsNoSingleLineFolds.ts new file mode 100644 index 00000000000..c2ee165e919 --- /dev/null +++ b/tests/cases/fourslash/server/getOutliningSpansForRegionsNoSingleLineFolds.ts @@ -0,0 +1,17 @@ +////[|//#region +////function foo()[| { +//// +////}|] +////[|//these +//////should|] +//////#endregion not you|] +////[|// be +////// together|] +//// +////[|//#region bla bla bla +//// +////function bar()[| { }|] +//// +//////#endregion|] + +verify.outliningSpansInCurrentFile(test.ranges()); \ No newline at end of file