Skip to content

Commit 5d2142e

Browse files
committed
Retain comments inside return statements by including the return keyword in the parse tree
1 parent 2c2df9e commit 5d2142e

File tree

11 files changed

+59
-8
lines changed

11 files changed

+59
-8
lines changed

src/compiler/binder.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,6 +1001,7 @@ namespace ts {
10011001
function bindReturnOrThrow(node: ReturnStatement | ThrowStatement): void {
10021002
bind(node.expression);
10031003
if (node.kind === SyntaxKind.ReturnStatement) {
1004+
bind(node.returnKeyword);
10041005
hasExplicitReturn = true;
10051006
if (currentReturnTarget) {
10061007
addAntecedent(currentReturnTarget, currentFlow);

src/compiler/emitter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1571,7 +1571,7 @@ namespace ts {
15711571
}
15721572

15731573
function emitReturnStatement(node: ReturnStatement) {
1574-
writeToken(SyntaxKind.ReturnKeyword, node.pos, /*contextNode*/ node);
1574+
emit(node.returnKeyword);
15751575
emitExpressionWithPrefix(" ", node.expression);
15761576
write(";");
15771577
}

src/compiler/factory.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,15 +1460,17 @@ namespace ts {
14601460
: node;
14611461
}
14621462

1463-
export function createReturn(expression?: Expression): ReturnStatement {
1463+
export function createReturn(expression?: Expression, returnKeyword: Token<SyntaxKind.ReturnKeyword> = createToken(SyntaxKind.ReturnKeyword)): ReturnStatement {
14641464
const node = <ReturnStatement>createSynthesizedNode(SyntaxKind.ReturnStatement);
1465+
node.returnKeyword = returnKeyword;
14651466
node.expression = expression;
14661467
return node;
14671468
}
14681469

1469-
export function updateReturn(node: ReturnStatement, expression: Expression | undefined) {
1470-
return node.expression !== expression
1471-
? updateNode(createReturn(expression), node)
1470+
export function updateReturn(node: ReturnStatement, returnKeyword: Token<SyntaxKind.ReturnKeyword>, expression: Expression | undefined) {
1471+
return node.expression !== expression ||
1472+
node.returnKeyword !== returnKeyword
1473+
? updateNode(createReturn(expression, returnKeyword), node)
14721474
: node;
14731475
}
14741476

src/compiler/parser.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,8 @@ namespace ts {
259259
case SyntaxKind.BreakStatement:
260260
return visitNode(cbNode, (<BreakOrContinueStatement>node).label);
261261
case SyntaxKind.ReturnStatement:
262-
return visitNode(cbNode, (<ReturnStatement>node).expression);
262+
return visitNode(cbNode, (<ReturnStatement>node).returnKeyword) ||
263+
visitNode(cbNode, (<ReturnStatement>node).expression);
263264
case SyntaxKind.WithStatement:
264265
return visitNode(cbNode, (<WithStatement>node).expression) ||
265266
visitNode(cbNode, (<WithStatement>node).statement);
@@ -4687,7 +4688,7 @@ namespace ts {
46874688
function parseReturnStatement(): ReturnStatement {
46884689
const node = <ReturnStatement>createNode(SyntaxKind.ReturnStatement);
46894690

4690-
parseExpected(SyntaxKind.ReturnKeyword);
4691+
node.returnKeyword = parseExpectedToken(SyntaxKind.ReturnKeyword, /*reportAtCurrentPosition*/ true, Diagnostics._0_expected, "return");
46914692
if (!canParseSemicolon()) {
46924693
node.expression = allowInAnd(parseExpression);
46934694
}

src/compiler/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1750,6 +1750,7 @@ namespace ts {
17501750

17511751
export interface ReturnStatement extends Statement {
17521752
kind: SyntaxKind.ReturnStatement;
1753+
returnKeyword: Token<SyntaxKind.ReturnKeyword>;
17531754
expression?: Expression;
17541755
}
17551756

src/compiler/visitor.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,7 @@ namespace ts {
634634

635635
case SyntaxKind.ReturnStatement:
636636
return updateReturn(<ReturnStatement>node,
637+
visitNode((<ReturnStatement>node).returnKeyword, visitor, isToken),
637638
visitNode((<ReturnStatement>node).expression, visitor, isExpression));
638639

639640
case SyntaxKind.WithStatement:

src/harness/unittests/incrementalParser.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ module m3 { }\
647647
const oldText = ScriptSnapshot.fromString(source);
648648
const newTextAndChange = withInsert(oldText, 0, "");
649649

650-
compareTrees(oldText, newTextAndChange.text, newTextAndChange.textChangeRange, 7);
650+
compareTrees(oldText, newTextAndChange.text, newTextAndChange.textChangeRange, 8);
651651
});
652652

653653
it("Class to interface", () => {
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//// [jsdocCastCommentEmit.ts]
2+
// allowJs: true
3+
// checkJs: true
4+
// outDir: out/
5+
// filename: input.js
6+
function f() {
7+
return /* @type {number} */ 42;
8+
}
9+
10+
//// [jsdocCastCommentEmit.js]
11+
// allowJs: true
12+
// checkJs: true
13+
// outDir: out/
14+
// filename: input.js
15+
function f() {
16+
return /* @type {number} */ 42;
17+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
=== tests/cases/compiler/jsdocCastCommentEmit.ts ===
2+
// allowJs: true
3+
// checkJs: true
4+
// outDir: out/
5+
// filename: input.js
6+
function f() {
7+
>f : Symbol(f, Decl(jsdocCastCommentEmit.ts, 0, 0))
8+
9+
return /* @type {number} */ 42;
10+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
=== tests/cases/compiler/jsdocCastCommentEmit.ts ===
2+
// allowJs: true
3+
// checkJs: true
4+
// outDir: out/
5+
// filename: input.js
6+
function f() {
7+
>f : () => number
8+
9+
return /* @type {number} */ 42;
10+
>42 : 42
11+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// allowJs: true
2+
// checkJs: true
3+
// outDir: out/
4+
// filename: input.js
5+
function f() {
6+
return /* @type {number} */ 42;
7+
}

0 commit comments

Comments
 (0)