Skip to content

Commit 0c46fdc

Browse files
author
pi1024e
committed
Fixes JS region collapse area after carriage return
1 parent 2ea1283 commit 0c46fdc

File tree

3 files changed

+31
-29
lines changed

3 files changed

+31
-29
lines changed

src/compiler/scanner.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1435,7 +1435,7 @@ namespace ts {
14351435

14361436
function scan(): SyntaxKind {
14371437
startPos = pos;
1438-
tokenFlags = 0;
1438+
tokenFlags = TokenFlags.None;
14391439
let asteriskSeen = false;
14401440
while (true) {
14411441
tokenPos = pos;
@@ -2052,7 +2052,7 @@ namespace ts {
20522052

20532053
function scanJsDocToken(): JSDocSyntaxKind {
20542054
startPos = tokenPos = pos;
2055-
tokenFlags = 0;
2055+
tokenFlags = TokenFlags.None;
20562056
if (pos >= end) {
20572057
return token = SyntaxKind.EndOfFileToken;
20582058
}
@@ -2192,7 +2192,7 @@ namespace ts {
21922192
tokenPos = textPos;
21932193
token = SyntaxKind.Unknown;
21942194
tokenValue = undefined!;
2195-
tokenFlags = 0;
2195+
tokenFlags = TokenFlags.None;
21962196
}
21972197

21982198
function setInJSDocType(inType: boolean) {

src/services/codefixes/fixSpelling.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,14 @@ namespace ts.codefix {
8181
return flags;
8282
}
8383

84-
function getResolvedSourceFileFromImportDeclaration (sourceFile: SourceFile, context: CodeFixContextBase, importDeclaration: ImportDeclaration): SourceFile | undefined {
85-
if (!importDeclaration || !isStringLiteralLike(importDeclaration.moduleSpecifier)) return undefined;
84+
function getResolvedSourceFileFromImportDeclaration(sourceFile: SourceFile, context: CodeFixContextBase, importDeclaration: ImportDeclaration): SourceFile | undefined {
85+
if (!(importDeclaration && isStringLiteralLike(importDeclaration.moduleSpecifier))) return undefined;
8686

8787
const resolvedModule = getResolvedModule(sourceFile, importDeclaration.moduleSpecifier.text);
88-
if (!resolvedModule) return undefined;
88+
if (resolvedModule) return context.program.getSourceFile(resolvedModule.resolvedFileName);
89+
90+
return undefined;
91+
8992

90-
return context.program.getSourceFile(resolvedModule.resolvedFileName);
9193
}
9294
}

src/services/outliningElementsCollector.ts

+22-22
Original file line numberDiff line numberDiff line change
@@ -73,32 +73,30 @@ namespace ts.OutliningElementsCollector {
7373
const lineStarts = sourceFile.getLineStarts();
7474
for (let i = 0; i < lineStarts.length; i++) {
7575
const currentLineStart = lineStarts[i];
76-
const lineEnd = i + 1 === lineStarts.length ? sourceFile.getEnd() : lineStarts[i + 1] - 1;
76+
const newlinePosition = i + 1 === lineStarts.length ? sourceFile.getEnd() : lineStarts[i + 1] - 1;
77+
// If the character before \n is \r, decrement line end by 1.
78+
const lineEnd = sourceFile.text.charCodeAt(newlinePosition - 1) === CharacterCodes.carriageReturn ? newlinePosition - 1 : newlinePosition;
7779
const lineText = sourceFile.text.substring(currentLineStart, lineEnd);
78-
const result = isRegionDelimiter(lineText);
79-
if (!result || isInComment(sourceFile, currentLineStart)) {
80-
continue;
81-
}
82-
83-
if (!result[1]) {
84-
const span = createTextSpanFromBounds(sourceFile.text.indexOf("//", currentLineStart), lineEnd);
85-
regions.push(createOutliningSpan(span, OutliningSpanKind.Region, span, /*autoCollapse*/ false, result[2] || "#region"));
86-
}
87-
else {
88-
const region = regions.pop();
89-
if (region) {
90-
region.textSpan.length = lineEnd - region.textSpan.start;
91-
region.hintSpan.length = lineEnd - region.textSpan.start;
92-
out.push(region);
80+
const regionDelimiterRegExp = /^\s*\/\/\s*#(end)?region(?:\s+(.*))?(?:\r)?$/;
81+
const result = regionDelimiterRegExp.exec(lineText);
82+
if (result && !isInComment(sourceFile, currentLineStart)) {
83+
if (result[1]) {
84+
const region = regions.pop();
85+
if (region) {
86+
region.textSpan.length = lineEnd - region.textSpan.start;
87+
region.hintSpan.length = lineEnd - region.textSpan.start;
88+
out.push(region);
89+
}
90+
}
91+
else {
92+
const span = createTextSpanFromBounds(sourceFile.text.indexOf("//", currentLineStart), lineEnd);
93+
regions.push(createOutliningSpan(span, OutliningSpanKind.Region, span, /*autoCollapse*/ false, result[2] || "#region"));
9394
}
9495
}
9596
}
9697
}
9798

98-
const regionDelimiterRegExp = /^\s*\/\/\s*#(end)?region(?:\s+(.*))?(?:\r)?$/;
99-
function isRegionDelimiter(lineText: string) {
100-
return regionDelimiterRegExp.exec(lineText);
101-
}
99+
102100

103101
function addOutliningForLeadingCommentsForNode(n: Node, sourceFile: SourceFile, cancellationToken: CancellationToken, out: Push<OutliningSpan>): void {
104102
const comments = getLeadingCommentRangesOfNode(n, sourceFile);
@@ -113,7 +111,9 @@ namespace ts.OutliningElementsCollector {
113111
case SyntaxKind.SingleLineCommentTrivia:
114112
// never fold region delimiters into single-line comment regions
115113
const commentText = sourceText.slice(pos, end);
116-
if (isRegionDelimiter(commentText)) {
114+
const regionDelimiterRegExp = /^\s*\/\/\s*#(end)?region(?:\s+(.*))?(?:\r)?$/;
115+
const result = regionDelimiterRegExp.exec(commentText);
116+
if (result) {
117117
combineAndAddMultipleSingleLineComments();
118118
singleLineCommentCount = 0;
119119
break;
@@ -178,7 +178,7 @@ namespace ts.OutliningElementsCollector {
178178
else if (tryStatement.finallyBlock === n) {
179179
return spanForNode(findChildOfKind(tryStatement, SyntaxKind.FinallyKeyword, sourceFile)!);
180180
}
181-
// falls through
181+
// falls through
182182
default:
183183
// Block was a standalone block. In this case we want to only collapse
184184
// the span of the block, independent of any parent span.

0 commit comments

Comments
 (0)