Merge pull request #13916 from Microsoft/master-fix13602

[Master] Fix 13602 preserve comment following element in node list
This commit is contained in:
Yui 2017-02-09 12:51:22 -08:00 committed by GitHub
commit f7b20624cf
46 changed files with 496 additions and 20 deletions

View file

@ -9,6 +9,7 @@ namespace ts {
emitNodeWithComments(hint: EmitHint, node: Node, emitCallback: (hint: EmitHint, node: Node) => void): void;
emitBodyWithDetachedComments(node: Node, detachedRange: TextRange, emitCallback: (node: Node) => void): void;
emitTrailingCommentsOfPosition(pos: number): void;
emitLeadingCommentsOfPosition(pos: number): void;
}
export function createCommentWriter(printerOptions: PrinterOptions, emitPos: ((pos: number) => void) | undefined): CommentWriter {
@ -32,6 +33,7 @@ namespace ts {
emitNodeWithComments,
emitBodyWithDetachedComments,
emitTrailingCommentsOfPosition,
emitLeadingCommentsOfPosition,
};
function emitNodeWithComments(hint: EmitHint, node: Node, emitCallback: (hint: EmitHint, node: Node) => void) {
@ -210,6 +212,14 @@ namespace ts {
}
}
function emitLeadingCommentsOfPosition(pos: number) {
if (disabled || pos === -1) {
return;
}
emitLeadingComments(pos, /*isEmittedNode*/ true);
}
function emitTrailingComments(pos: number) {
forEachTrailingCommentToEmit(pos, emitTrailingComment);
}

View file

@ -1,4 +1,4 @@
/// <reference path="checker.ts" />
/// <reference path="checker.ts" />
/// <reference path="transformer.ts" />
/// <reference path="declarationEmitter.ts" />
/// <reference path="sourcemap.ts" />
@ -211,6 +211,7 @@ namespace ts {
emitNodeWithComments,
emitBodyWithDetachedComments,
emitTrailingCommentsOfPosition,
emitLeadingCommentsOfPosition,
} = comments;
let currentSourceFile: SourceFile;
@ -1346,6 +1347,10 @@ namespace ts {
else {
writeToken(SyntaxKind.OpenBraceToken, node.pos, /*contextNode*/ node);
emitBlockStatements(node);
// We have to call emitLeadingComments explicitly here because otherwise leading comments of the close brace token will not be emitted
increaseIndent();
emitLeadingCommentsOfPosition(node.statements.end);
decreaseIndent();
writeToken(SyntaxKind.CloseBraceToken, node.statements.end, /*contextNode*/ node);
}
}
@ -2228,6 +2233,15 @@ namespace ts {
// Write the delimiter if this is not the first node.
if (previousSibling) {
// i.e
// function commentedParameters(
// /* Parameter a */
// a
// /* End of parameter a */ -> this comment isn't considered to be trailing comment of parameter "a" due to newline
// ,
if (delimiter && previousSibling.end !== parentNode.end) {
emitLeadingCommentsOfPosition(previousSibling.end);
}
write(delimiter);
// Write either a line terminator or whitespace to separate the elements.
@ -2274,6 +2288,17 @@ namespace ts {
write(",");
}
// Emit any trailing comment of the last element in the list
// i.e
// var array = [...
// 2
// /* end of element 2 */
// ];
if (previousSibling && delimiter && previousSibling.end !== parentNode.end) {
emitLeadingCommentsOfPosition(previousSibling.end);
}
// Decrease the indent, if requested.
if (format & ListFormat.Indented) {
decreaseIndent();

View file

@ -26,5 +26,6 @@ define(["require", "exports"], function (require, exports) {
define(["require", "exports", "./foo_0"], function (require, exports, foo) {
"use strict";
if (foo.E1.A === 0) {
// Should cause runtime import - interesting optimization possibility, as gets inlined to 0.
}
});

View file

@ -17,6 +17,7 @@ var C = (function () {
}
C.prototype.P = function (ii, j, k) {
for (var i = 0; i < arguments.length; i++) {
// WScript.Echo("param: " + arguments[i]);
}
};
return C;

View file

@ -83,7 +83,9 @@ f(// comment 1
// comment 2
function () {
// comment 4
});
}
// comment 5
);
// body is not a block
f(function (_) { return 1 +
2; });

View file

@ -0,0 +1,24 @@
//// [commentLeadingCloseBrace.ts]
declare function commentedParameters(...args): any;
function ifelse() {
if (commentedParameters(1, 2)) {
/*comment1*/
commentedParameters(3, 4);
/*comment2*/
} else {
commentedParameters(5, 6);
}
}
//// [commentLeadingCloseBrace.js]
function ifelse() {
if (commentedParameters(1, 2)) {
/*comment1*/
commentedParameters(3, 4);
/*comment2*/
}
else {
commentedParameters(5, 6);
}
}

View file

@ -0,0 +1,21 @@
=== tests/cases/compiler/commentLeadingCloseBrace.ts ===
declare function commentedParameters(...args): any;
>commentedParameters : Symbol(commentedParameters, Decl(commentLeadingCloseBrace.ts, 0, 0))
>args : Symbol(args, Decl(commentLeadingCloseBrace.ts, 0, 37))
function ifelse() {
>ifelse : Symbol(ifelse, Decl(commentLeadingCloseBrace.ts, 0, 51))
if (commentedParameters(1, 2)) {
>commentedParameters : Symbol(commentedParameters, Decl(commentLeadingCloseBrace.ts, 0, 0))
/*comment1*/
commentedParameters(3, 4);
>commentedParameters : Symbol(commentedParameters, Decl(commentLeadingCloseBrace.ts, 0, 0))
/*comment2*/
} else {
commentedParameters(5, 6);
>commentedParameters : Symbol(commentedParameters, Decl(commentLeadingCloseBrace.ts, 0, 0))
}
}

View file

@ -0,0 +1,30 @@
=== tests/cases/compiler/commentLeadingCloseBrace.ts ===
declare function commentedParameters(...args): any;
>commentedParameters : (...args: any[]) => any
>args : any[]
function ifelse() {
>ifelse : () => void
if (commentedParameters(1, 2)) {
>commentedParameters(1, 2) : any
>commentedParameters : (...args: any[]) => any
>1 : 1
>2 : 2
/*comment1*/
commentedParameters(3, 4);
>commentedParameters(3, 4) : any
>commentedParameters : (...args: any[]) => any
>3 : 3
>4 : 4
/*comment2*/
} else {
commentedParameters(5, 6);
>commentedParameters(5, 6) : any
>commentedParameters : (...args: any[]) => any
>5 : 5
>6 : 6
}
}

View file

@ -0,0 +1,17 @@
//// [commentOnArrayElement1.ts]
var array = [
/* element 1*/
1
/* end of element 1 */,
2
/* end of element 2 */
];
//// [commentOnArrayElement1.js]
var array = [
/* element 1*/
1
/* end of element 1 */ ,
2
/* end of element 2 */
];

View file

@ -0,0 +1,10 @@
=== tests/cases/compiler/commentOnArrayElement1.ts ===
var array = [
>array : Symbol(array, Decl(commentOnArrayElement1.ts, 0, 3))
/* element 1*/
1
/* end of element 1 */,
2
/* end of element 2 */
];

View file

@ -0,0 +1,15 @@
=== tests/cases/compiler/commentOnArrayElement1.ts ===
var array = [
>array : number[]
>[ /* element 1*/ 1 /* end of element 1 */, 2 /* end of element 2 */] : number[]
/* element 1*/
1
>1 : 1
/* end of element 1 */,
2
>2 : 2
/* end of element 2 */
];

View file

@ -0,0 +1,15 @@
//// [commentOnArrayElement2.ts]
var array = [
/* element 1*/
1 /* end of element 1 */,
2
/* end of element 2 */
];
//// [commentOnArrayElement2.js]
var array = [
/* element 1*/
1 /* end of element 1 */,
2
/* end of element 2 */
];

View file

@ -0,0 +1,9 @@
=== tests/cases/compiler/commentOnArrayElement2.ts ===
var array = [
>array : Symbol(array, Decl(commentOnArrayElement2.ts, 0, 3))
/* element 1*/
1 /* end of element 1 */,
2
/* end of element 2 */
];

View file

@ -0,0 +1,14 @@
=== tests/cases/compiler/commentOnArrayElement2.ts ===
var array = [
>array : number[]
>[ /* element 1*/ 1 /* end of element 1 */, 2 /* end of element 2 */] : number[]
/* element 1*/
1 /* end of element 1 */,
>1 : 1
2
>2 : 2
/* end of element 2 */
];

View file

@ -0,0 +1,19 @@
//// [commentOnArrayElement3.ts]
var array = [
/* element 1*/
1
/* end of element 1 */,
2
/* end of element 2 */, ,
/* extra comment */
];
//// [commentOnArrayElement3.js]
var array = [
/* element 1*/
1
/* end of element 1 */ ,
2
/* end of element 2 */ ,
,
];

View file

@ -0,0 +1,11 @@
=== tests/cases/compiler/commentOnArrayElement3.ts ===
var array = [
>array : Symbol(array, Decl(commentOnArrayElement3.ts, 0, 3))
/* element 1*/
1
/* end of element 1 */,
2
/* end of element 2 */, ,
/* extra comment */
];

View file

@ -0,0 +1,18 @@
=== tests/cases/compiler/commentOnArrayElement3.ts ===
var array = [
>array : number[]
>[ /* element 1*/ 1 /* end of element 1 */, 2 /* end of element 2 */, , /* extra comment */] : number[]
/* element 1*/
1
>1 : 1
/* end of element 1 */,
2
>2 : 2
/* end of element 2 */, ,
> : undefined
/* extra comment */
];

View file

@ -0,0 +1,20 @@
//// [commentOnParameter1.ts]
function commentedParameters(
/* Parameter a */
a
/* End of parameter a */
/* Parameter b */
,
b
/* End of parameter b */
){}
//// [commentOnParameter1.js]
function commentedParameters(
/* Parameter a */
a
/* End of parameter a */
/* Parameter b */
, b
/* End of parameter b */
) { }

View file

@ -0,0 +1,16 @@
=== tests/cases/compiler/commentOnParameter1.ts ===
function commentedParameters(
>commentedParameters : Symbol(commentedParameters, Decl(commentOnParameter1.ts, 0, 0))
/* Parameter a */
a
>a : Symbol(a, Decl(commentOnParameter1.ts, 0, 29))
/* End of parameter a */
/* Parameter b */
,
b
>b : Symbol(b, Decl(commentOnParameter1.ts, 5, 1))
/* End of parameter b */
){}

View file

@ -0,0 +1,16 @@
=== tests/cases/compiler/commentOnParameter1.ts ===
function commentedParameters(
>commentedParameters : (a: any, b: any) => void
/* Parameter a */
a
>a : any
/* End of parameter a */
/* Parameter b */
,
b
>b : any
/* End of parameter b */
){}

View file

@ -0,0 +1,18 @@
//// [commentOnParameter2.ts]
function commentedParameters(
/* Parameter a */
a /* End of parameter a */
/* Parameter b */
,
b
/* End of parameter b */
){}
//// [commentOnParameter2.js]
function commentedParameters(
/* Parameter a */
a /* End of parameter a */
/* Parameter b */
, b
/* End of parameter b */
) { }

View file

@ -0,0 +1,15 @@
=== tests/cases/compiler/commentOnParameter2.ts ===
function commentedParameters(
>commentedParameters : Symbol(commentedParameters, Decl(commentOnParameter2.ts, 0, 0))
/* Parameter a */
a /* End of parameter a */
>a : Symbol(a, Decl(commentOnParameter2.ts, 0, 29))
/* Parameter b */
,
b
>b : Symbol(b, Decl(commentOnParameter2.ts, 4, 1))
/* End of parameter b */
){}

View file

@ -0,0 +1,15 @@
=== tests/cases/compiler/commentOnParameter2.ts ===
function commentedParameters(
>commentedParameters : (a: any, b: any) => void
/* Parameter a */
a /* End of parameter a */
>a : any
/* Parameter b */
,
b
>b : any
/* End of parameter b */
){}

View file

@ -0,0 +1,9 @@
//// [commentOnParameter3.ts]
function commentedParameters(
a /* parameter a */,
b /* parameter b */,
/* extra comment */
) { }
//// [commentOnParameter3.js]
function commentedParameters(a /* parameter a */, b /* parameter b */) { }

View file

@ -0,0 +1,12 @@
=== tests/cases/compiler/commentOnParameter3.ts ===
function commentedParameters(
>commentedParameters : Symbol(commentedParameters, Decl(commentOnParameter3.ts, 0, 0))
a /* parameter a */,
>a : Symbol(a, Decl(commentOnParameter3.ts, 0, 29))
b /* parameter b */,
>b : Symbol(b, Decl(commentOnParameter3.ts, 1, 20))
/* extra comment */
) { }

View file

@ -0,0 +1,12 @@
=== tests/cases/compiler/commentOnParameter3.ts ===
function commentedParameters(
>commentedParameters : (a: any, b: any) => void
a /* parameter a */,
>a : any
b /* parameter b */,
>b : any
/* extra comment */
) { }

View file

@ -27,4 +27,5 @@ exports.C1 = C1;
"use strict";
var foo = require("./foo_0");
if (foo.C1.s1) {
// Should cause runtime import
}

View file

@ -391,6 +391,7 @@ var TestRunner = (function () {
}
}
if (testResult === false) {
//console.log(e.message);
}
}
if ((testcase.errorMessageRegEx !== undefined) && !exception) {

View file

@ -9,5 +9,6 @@ function foo(a) {
//// [out.js]
function foo(a) {
for (var a_1 = 0; a_1 < 10; a_1++) {
// do something
}
}

View file

@ -27,6 +27,7 @@ function tryCatch() {
//// [narrowExceptionVariableInCatchClause.js]
function tryCatch() {
try {
// do stuff...
}
catch (err) {
if (isFooError(err)) {

View file

@ -8,7 +8,9 @@ try {
//// [noCatchBlock.js]
try {
// ...
}
finally {
// N.B. No 'catch' block
}
//# sourceMappingURL=noCatchBlock.js.map

View file

@ -1,2 +1,2 @@
//// [noCatchBlock.js.map]
{"version":3,"file":"noCatchBlock.js","sourceRoot":"","sources":["noCatchBlock.ts"],"names":[],"mappings":"AACA,IAAI,CAAC;AAEL,CAAC;QAAS,CAAC;AAEX,CAAC"}
{"version":3,"file":"noCatchBlock.js","sourceRoot":"","sources":["noCatchBlock.ts"],"names":[],"mappings":"AACA,IAAI,CAAC;IACJ,MAAM;AACP,CAAC;QAAS,CAAC;IACV,wBAAwB;AACzB,CAAC"}

View file

@ -12,6 +12,7 @@ sourceFile:noCatchBlock.ts
1 >
2 >^^^^
3 > ^
4 > ^^^^^^->
1 >
>
2 >try
@ -20,34 +21,51 @@ sourceFile:noCatchBlock.ts
2 >Emitted(1, 5) Source(2, 5) + SourceIndex(0)
3 >Emitted(1, 6) Source(2, 6) + SourceIndex(0)
---
>>> // ...
1->^^^^
2 > ^^^^^^
1->
>
2 > // ...
1->Emitted(2, 5) Source(3, 2) + SourceIndex(0)
2 >Emitted(2, 11) Source(3, 8) + SourceIndex(0)
---
>>>}
1 >
2 >^
3 > ^^^^^^^^^->
1 >
> // ...
>
2 >}
1 >Emitted(2, 1) Source(4, 1) + SourceIndex(0)
2 >Emitted(2, 2) Source(4, 2) + SourceIndex(0)
1 >Emitted(3, 1) Source(4, 1) + SourceIndex(0)
2 >Emitted(3, 2) Source(4, 2) + SourceIndex(0)
---
>>>finally {
1->^^^^^^^^
2 > ^
3 > ^^^^^^^^^^^^^^^^^^^^->
1-> finally
2 > {
1->Emitted(3, 9) Source(4, 11) + SourceIndex(0)
2 >Emitted(3, 10) Source(4, 12) + SourceIndex(0)
1->Emitted(4, 9) Source(4, 11) + SourceIndex(0)
2 >Emitted(4, 10) Source(4, 12) + SourceIndex(0)
---
>>> // N.B. No 'catch' block
1->^^^^
2 > ^^^^^^^^^^^^^^^^^^^^^^^^
1->
>
2 > // N.B. No 'catch' block
1->Emitted(5, 5) Source(5, 2) + SourceIndex(0)
2 >Emitted(5, 29) Source(5, 26) + SourceIndex(0)
---
>>>}
1 >
2 >^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1 >
> // N.B. No 'catch' block
>
2 >}
1 >Emitted(4, 1) Source(6, 1) + SourceIndex(0)
2 >Emitted(4, 2) Source(6, 2) + SourceIndex(0)
1 >Emitted(6, 1) Source(6, 1) + SourceIndex(0)
2 >Emitted(6, 2) Source(6, 2) + SourceIndex(0)
---
>>>//# sourceMappingURL=noCatchBlock.js.map

View file

@ -37,4 +37,5 @@ for (let _b of array) {
}
for (const norest of array.map(a => (Object.assign({}, a, { x: 'a string' })))) {
[norest.x, norest.y];
// x is now a string. who knows why.
}

View file

@ -1011,6 +1011,7 @@ var TypeScript;
ctx.path.push(cur);
}
else {
//logger.log("TODO: Ignoring node because minChar, limChar not better than previous node in stack");
}
}
// The AST walker skips comments, but we might be in one, so check the pre/post comments for this node manually

View file

@ -23,6 +23,7 @@ function R1() {
function R2() { R2(); }
function R3(n) {
if (n == 0) {
//return;
}
else {
R3(n--);

View file

@ -7,7 +7,9 @@ try {
//// [sourceMap-SkippedNode.js]
try {
// ...
}
finally {
// N.B. No 'catch' block
}
//# sourceMappingURL=sourceMap-SkippedNode.js.map

View file

@ -1,2 +1,2 @@
//// [sourceMap-SkippedNode.js.map]
{"version":3,"file":"sourceMap-SkippedNode.js","sourceRoot":"","sources":["sourceMap-SkippedNode.ts"],"names":[],"mappings":"AAAA,IAAI,CAAC;AAEL,CAAC;QAAS,CAAC;AAEX,CAAC"}
{"version":3,"file":"sourceMap-SkippedNode.js","sourceRoot":"","sources":["sourceMap-SkippedNode.ts"],"names":[],"mappings":"AAAA,IAAI,CAAC;IACL,MAAM;AACN,CAAC;QAAS,CAAC;IACX,wBAAwB;AACxB,CAAC"}

View file

@ -12,6 +12,7 @@ sourceFile:sourceMap-SkippedNode.ts
1 >
2 >^^^^
3 > ^
4 > ^^^^^^->
1 >
2 >try
3 > {
@ -19,34 +20,51 @@ sourceFile:sourceMap-SkippedNode.ts
2 >Emitted(1, 5) Source(1, 5) + SourceIndex(0)
3 >Emitted(1, 6) Source(1, 6) + SourceIndex(0)
---
>>> // ...
1->^^^^
2 > ^^^^^^
1->
>
2 > // ...
1->Emitted(2, 5) Source(2, 1) + SourceIndex(0)
2 >Emitted(2, 11) Source(2, 7) + SourceIndex(0)
---
>>>}
1 >
2 >^
3 > ^^^^^^^^^->
1 >
>// ...
>
2 >}
1 >Emitted(2, 1) Source(3, 1) + SourceIndex(0)
2 >Emitted(2, 2) Source(3, 2) + SourceIndex(0)
1 >Emitted(3, 1) Source(3, 1) + SourceIndex(0)
2 >Emitted(3, 2) Source(3, 2) + SourceIndex(0)
---
>>>finally {
1->^^^^^^^^
2 > ^
3 > ^^^^^^^^^^^^^^^^^^^^->
1-> finally
2 > {
1->Emitted(3, 9) Source(3, 11) + SourceIndex(0)
2 >Emitted(3, 10) Source(3, 12) + SourceIndex(0)
1->Emitted(4, 9) Source(3, 11) + SourceIndex(0)
2 >Emitted(4, 10) Source(3, 12) + SourceIndex(0)
---
>>> // N.B. No 'catch' block
1->^^^^
2 > ^^^^^^^^^^^^^^^^^^^^^^^^
1->
>
2 > // N.B. No 'catch' block
1->Emitted(5, 5) Source(4, 1) + SourceIndex(0)
2 >Emitted(5, 29) Source(4, 25) + SourceIndex(0)
---
>>>}
1 >
2 >^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1 >
>// N.B. No 'catch' block
>
2 >}
1 >Emitted(4, 1) Source(5, 1) + SourceIndex(0)
2 >Emitted(4, 2) Source(5, 2) + SourceIndex(0)
1 >Emitted(6, 1) Source(5, 1) + SourceIndex(0)
2 >Emitted(6, 2) Source(5, 2) + SourceIndex(0)
---
>>>//# sourceMappingURL=sourceMap-SkippedNode.js.map

View file

@ -0,0 +1,11 @@
declare function commentedParameters(...args): any;
function ifelse() {
if (commentedParameters(1, 2)) {
/*comment1*/
commentedParameters(3, 4);
/*comment2*/
} else {
commentedParameters(5, 6);
}
}

View file

@ -0,0 +1,7 @@
var array = [
/* element 1*/
1
/* end of element 1 */,
2
/* end of element 2 */
];

View file

@ -0,0 +1,6 @@
var array = [
/* element 1*/
1 /* end of element 1 */,
2
/* end of element 2 */
];

View file

@ -0,0 +1,8 @@
var array = [
/* element 1*/
1
/* end of element 1 */,
2
/* end of element 2 */, ,
/* extra comment */
];

View file

@ -0,0 +1,9 @@
function commentedParameters(
/* Parameter a */
a
/* End of parameter a */
/* Parameter b */
,
b
/* End of parameter b */
){}

View file

@ -0,0 +1,8 @@
function commentedParameters(
/* Parameter a */
a /* End of parameter a */
/* Parameter b */
,
b
/* End of parameter b */
){}

View file

@ -0,0 +1,5 @@
function commentedParameters(
a /* parameter a */,
b /* parameter b */,
/* extra comment */
) { }