diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 4a0b03f7285..e4fb282f22f 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -5121,6 +5121,11 @@ export function createPrinter(printerOptions: PrinterOptions = {}, handlers: Pri shouldDecreaseIndentAfterEmit = true; } + if (shouldEmitInterveningComments && format & ListFormat.DelimitersMask && !positionIsSynthesized(child.pos)) { + const commentRange = getCommentRange(child); + emitTrailingCommentsOfPosition(commentRange.pos, /*prefixSpace*/ !!(format & ListFormat.SpaceBetweenSiblings), /*forceNoNewline*/ true); + } + writeLine(separatingLineTerminatorCount); shouldEmitInterveningComments = false; } diff --git a/tests/baselines/reference/arrowFunctionParsingDoesNotConfuseParenthesizedObjectForArrowHead.js b/tests/baselines/reference/arrowFunctionParsingDoesNotConfuseParenthesizedObjectForArrowHead.js index abf6e9e184d..5e99656ebde 100644 --- a/tests/baselines/reference/arrowFunctionParsingDoesNotConfuseParenthesizedObjectForArrowHead.js +++ b/tests/baselines/reference/arrowFunctionParsingDoesNotConfuseParenthesizedObjectForArrowHead.js @@ -20,7 +20,7 @@ const test = () => ({ //// [arrowFunctionParsingDoesNotConfuseParenthesizedObjectForArrowHead.js] var test = function () { return ({ // "Identifier expected." error on "!" and two "Duplicate identifier '(Missing)'." errors on space. - prop: !value, + prop: !value, // remove ! to see that errors will be gone run: function () { // comment next line or remove "()" to see that errors will be gone if (!a.b()) { diff --git a/tests/baselines/reference/assignmentCompatBug3.js b/tests/baselines/reference/assignmentCompatBug3.js index f56bd9b492e..b0497db1715 100644 --- a/tests/baselines/reference/assignmentCompatBug3.js +++ b/tests/baselines/reference/assignmentCompatBug3.js @@ -30,8 +30,8 @@ foo(x + y); //// [assignmentCompatBug3.js] function makePoint(x, y) { return { - get x() { return x; }, - get y() { return y; }, + get x() { return x; }, // shouldn't be "void" + get y() { return y; }, // shouldn't be "void" //x: "yo", //y: "boo", dist: function () { diff --git a/tests/baselines/reference/bindingPatternCannotBeOnlyInferenceSource.js b/tests/baselines/reference/bindingPatternCannotBeOnlyInferenceSource.js index d188000eb4f..a1f2c641c8f 100644 --- a/tests/baselines/reference/bindingPatternCannotBeOnlyInferenceSource.js +++ b/tests/baselines/reference/bindingPatternCannotBeOnlyInferenceSource.js @@ -45,7 +45,7 @@ var _d = useReduxDispatch1(function (d, f) { return ({ p[_i] = arguments[_i]; } return d(f.funcA.apply(f, p)); - }, + }, // p should be inferrable funcB: function () { var p = []; for (var _i = 0; _i < arguments.length; _i++) { diff --git a/tests/baselines/reference/callSignaturesWithParameterInitializers2.js b/tests/baselines/reference/callSignaturesWithParameterInitializers2.js index d3fe83f04af..b792b96dec6 100644 --- a/tests/baselines/reference/callSignaturesWithParameterInitializers2.js +++ b/tests/baselines/reference/callSignaturesWithParameterInitializers2.js @@ -49,7 +49,7 @@ c.foo(1); var b = { foo: function (x) { if (x === void 0) { x = 1; } - }, + }, // error foo: function (x) { if (x === void 0) { x = 1; } }, diff --git a/tests/baselines/reference/circularResolvedSignature.js b/tests/baselines/reference/circularResolvedSignature.js index 891f2a17732..a7d67877584 100644 --- a/tests/baselines/reference/circularResolvedSignature.js +++ b/tests/baselines/reference/circularResolvedSignature.js @@ -24,7 +24,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.Component = void 0; function Component() { var _a = useState(function () { return ({ - value: "string", + value: "string", // this should be a number foo: function (arg) { return setState(arg); }, bar: function (arg) { return setState(arg); }, }); }), state = _a[0], setState = _a[1]; diff --git a/tests/baselines/reference/commentsOnObjectLiteral5.js b/tests/baselines/reference/commentsOnObjectLiteral5.js new file mode 100644 index 00000000000..0bb52c712a2 --- /dev/null +++ b/tests/baselines/reference/commentsOnObjectLiteral5.js @@ -0,0 +1,18 @@ +//// [tests/cases/compiler/commentsOnObjectLiteral5.ts] //// + +//// [commentsOnObjectLiteral5.ts] +const a = { + p0: 0, // Comment 0 + p1: 0, /* Comment 1 + A multiline comment. */ + p2: 0, // Comment 2 +}; + + +//// [commentsOnObjectLiteral5.js] +var a = { + p0: 0, // Comment 0 + p1: 0, /* Comment 1 + A multiline comment. */ + p2: 0, // Comment 2 +}; diff --git a/tests/baselines/reference/commentsOnObjectLiteral5.symbols b/tests/baselines/reference/commentsOnObjectLiteral5.symbols new file mode 100644 index 00000000000..c3bbeb3365b --- /dev/null +++ b/tests/baselines/reference/commentsOnObjectLiteral5.symbols @@ -0,0 +1,18 @@ +//// [tests/cases/compiler/commentsOnObjectLiteral5.ts] //// + +=== commentsOnObjectLiteral5.ts === +const a = { +>a : Symbol(a, Decl(commentsOnObjectLiteral5.ts, 0, 5)) + + p0: 0, // Comment 0 +>p0 : Symbol(p0, Decl(commentsOnObjectLiteral5.ts, 0, 11)) + + p1: 0, /* Comment 1 +>p1 : Symbol(p1, Decl(commentsOnObjectLiteral5.ts, 1, 10)) + + A multiline comment. */ + p2: 0, // Comment 2 +>p2 : Symbol(p2, Decl(commentsOnObjectLiteral5.ts, 2, 10)) + +}; + diff --git a/tests/baselines/reference/commentsOnObjectLiteral5.types b/tests/baselines/reference/commentsOnObjectLiteral5.types new file mode 100644 index 00000000000..df998cf963f --- /dev/null +++ b/tests/baselines/reference/commentsOnObjectLiteral5.types @@ -0,0 +1,22 @@ +//// [tests/cases/compiler/commentsOnObjectLiteral5.ts] //// + +=== commentsOnObjectLiteral5.ts === +const a = { +>a : { p0: number; p1: number; p2: number; } +>{ p0: 0, // Comment 0 p1: 0, /* Comment 1 A multiline comment. */ p2: 0, // Comment 2} : { p0: number; p1: number; p2: number; } + + p0: 0, // Comment 0 +>p0 : number +>0 : 0 + + p1: 0, /* Comment 1 +>p1 : number +>0 : 0 + + A multiline comment. */ + p2: 0, // Comment 2 +>p2 : number +>0 : 0 + +}; + diff --git a/tests/baselines/reference/divergentAccessorsTypes6.js b/tests/baselines/reference/divergentAccessorsTypes6.js index ad1f727efab..f425a69223b 100644 --- a/tests/baselines/reference/divergentAccessorsTypes6.js +++ b/tests/baselines/reference/divergentAccessorsTypes6.js @@ -49,9 +49,9 @@ var o1 = { }; // A setter annotation still implies the getter return type. var o2 = { - get p1() { return 0; }, + get p1() { return 0; }, // error - no annotation means type is implied from the setter annotation set p1(value) { }, - get p2() { return 0; }, + get p2() { return 0; }, // ok - explicit annotation set p2(value) { }, }; diff --git a/tests/baselines/reference/duplicateObjectLiteralProperty.js b/tests/baselines/reference/duplicateObjectLiteralProperty.js index eebc221b84a..c4b2b29293d 100644 --- a/tests/baselines/reference/duplicateObjectLiteralProperty.js +++ b/tests/baselines/reference/duplicateObjectLiteralProperty.js @@ -23,9 +23,9 @@ var y = { //// [duplicateObjectLiteralProperty.js] var x = { a: 1, - b: true, - a: 56, - \u0061: "ss", + b: true, // OK + a: 56, // Duplicate + \u0061: "ss", // Duplicate a: { c: 1, "c": 56, // Duplicate diff --git a/tests/baselines/reference/excessPropertyCheckWithMultipleDiscriminants.js b/tests/baselines/reference/excessPropertyCheckWithMultipleDiscriminants.js index 63f22539315..af0b2f4ee8c 100644 --- a/tests/baselines/reference/excessPropertyCheckWithMultipleDiscriminants.js +++ b/tests/baselines/reference/excessPropertyCheckWithMultipleDiscriminants.js @@ -149,7 +149,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); var foo = { type: "number", value: 10, - multipleOf: 5, + multipleOf: 5, // excess property format: "what?" }; // This has excess error because variant three is the only applicable case. diff --git a/tests/baselines/reference/excessPropertyCheckWithNestedArrayIntersection.js b/tests/baselines/reference/excessPropertyCheckWithNestedArrayIntersection.js index 400291c42ba..45856ab77d7 100644 --- a/tests/baselines/reference/excessPropertyCheckWithNestedArrayIntersection.js +++ b/tests/baselines/reference/excessPropertyCheckWithNestedArrayIntersection.js @@ -29,7 +29,7 @@ const repro: BugRepro = { var repro = { dataType: { fields: [{ - key: 'bla', + key: 'bla', // should be OK: Not excess value: null, }], } diff --git a/tests/baselines/reference/indexSignatures1.js b/tests/baselines/reference/indexSignatures1.js index 8fe8b097cd3..68035dcd392 100644 --- a/tests/baselines/reference/indexSignatures1.js +++ b/tests/baselines/reference/indexSignatures1.js @@ -356,7 +356,7 @@ const y2 = dom.data123; dom = { data123: 'hello' }; dom = { date123: 'hello' }; // Error const funcs = { - sfoo: x => x.length, + sfoo: x => x.length, // x: string nfoo: x => x * 2, // n: number }; i1[s0]; // Error diff --git a/tests/baselines/reference/namespaceImportTypeQuery2.js b/tests/baselines/reference/namespaceImportTypeQuery2.js index 76be90d8beb..b72e8c28a65 100644 --- a/tests/baselines/reference/namespaceImportTypeQuery2.js +++ b/tests/baselines/reference/namespaceImportTypeQuery2.js @@ -38,6 +38,6 @@ exports.B = B; "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var t = { - A: undefined, + A: undefined, // ok B: undefined, }; diff --git a/tests/baselines/reference/namespaceImportTypeQuery3.js b/tests/baselines/reference/namespaceImportTypeQuery3.js index d206a9fc2c7..af70b797591 100644 --- a/tests/baselines/reference/namespaceImportTypeQuery3.js +++ b/tests/baselines/reference/namespaceImportTypeQuery3.js @@ -31,6 +31,6 @@ exports.B = B; "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var t = { - A: undefined, + A: undefined, // ok B: undefined, }; diff --git a/tests/baselines/reference/namespaceImportTypeQuery4.js b/tests/baselines/reference/namespaceImportTypeQuery4.js index 0390f537218..ef360640097 100644 --- a/tests/baselines/reference/namespaceImportTypeQuery4.js +++ b/tests/baselines/reference/namespaceImportTypeQuery4.js @@ -29,6 +29,6 @@ exports.B = B; "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var t = { - A: undefined, + A: undefined, // error B: undefined, }; diff --git a/tests/baselines/reference/objectLitArrayDeclNoNew.js b/tests/baselines/reference/objectLitArrayDeclNoNew.js index 0f287bc965a..7fd3705cbdd 100644 --- a/tests/baselines/reference/objectLitArrayDeclNoNew.js +++ b/tests/baselines/reference/objectLitArrayDeclNoNew.js @@ -43,7 +43,7 @@ var Test; function bug() { var state = null; return { - tokens: Gar[], + tokens: Gar[], //IToken[], // Missing new. Correct syntax is: tokens: new IToken[] endState: state }; } diff --git a/tests/baselines/reference/objectLiteralShorthandPropertiesErrorFromNoneExistingIdentifier.js b/tests/baselines/reference/objectLiteralShorthandPropertiesErrorFromNoneExistingIdentifier.js index 4bbb4ad22df..037e1037f1c 100644 --- a/tests/baselines/reference/objectLiteralShorthandPropertiesErrorFromNoneExistingIdentifier.js +++ b/tests/baselines/reference/objectLiteralShorthandPropertiesErrorFromNoneExistingIdentifier.js @@ -9,6 +9,6 @@ var x = { //// [objectLiteralShorthandPropertiesErrorFromNoneExistingIdentifier.js] var x = { - x: x, + x: x, // OK undefinedVariable: undefinedVariable // Error }; diff --git a/tests/baselines/reference/privateNameBadDeclaration.js b/tests/baselines/reference/privateNameBadDeclaration.js index 713c306d5b4..a50cca6788f 100644 --- a/tests/baselines/reference/privateNameBadDeclaration.js +++ b/tests/baselines/reference/privateNameBadDeclaration.js @@ -22,8 +22,8 @@ class C { //// [privateNameBadDeclaration.js] function A() { } A.prototype = { - : 1, - : function () { }, + : 1, // Error + : function () { }, // Error get () { return ""; } // Error }; var B = /** @class */ (function () { @@ -32,8 +32,8 @@ var B = /** @class */ (function () { return B; }()); B.prototype = { - : 2, - : function () { }, + : 2, // Error + : function () { }, // Error get () { return ""; } // Error }; var C = /** @class */ (function () { diff --git a/tests/baselines/reference/thisTypeInFunctions.js b/tests/baselines/reference/thisTypeInFunctions.js index e4bb20031cf..a2c96374334 100644 --- a/tests/baselines/reference/thisTypeInFunctions.js +++ b/tests/baselines/reference/thisTypeInFunctions.js @@ -254,7 +254,7 @@ function implicitThis(n) { } var impl = { a: 12, - explicitVoid2: function () { return _this.a; }, + explicitVoid2: function () { return _this.a; }, // ok, this: any because it refers to some outer object (window?) explicitVoid1: function () { return 12; }, explicitStructural: function () { return this.a; diff --git a/tests/baselines/reference/thisTypeInFunctionsNegative.js b/tests/baselines/reference/thisTypeInFunctionsNegative.js index 786f9959409..15163fcf27a 100644 --- a/tests/baselines/reference/thisTypeInFunctionsNegative.js +++ b/tests/baselines/reference/thisTypeInFunctionsNegative.js @@ -227,7 +227,7 @@ let impl = { explicitVoid1() { return this.a; // error, no 'a' in 'void' }, - explicitVoid2: () => this.a, + explicitVoid2: () => this.a, // ok, `this:any` because it refers to an outer object explicitStructural: () => 12, explicitInterface: () => 12, explicitThis() { diff --git a/tests/baselines/reference/typeSatisfaction_contextualTyping2.js b/tests/baselines/reference/typeSatisfaction_contextualTyping2.js index eb64d29940b..c7a2c0bc5b5 100644 --- a/tests/baselines/reference/typeSatisfaction_contextualTyping2.js +++ b/tests/baselines/reference/typeSatisfaction_contextualTyping2.js @@ -13,7 +13,7 @@ let obj: { f(s: string): void } & Record = { //// [typeSatisfaction_contextualTyping2.js] "use strict"; var obj = { - f: function (s) { }, + f: function (s) { }, // "incorrect" implicit any on 's' g: function (s) { } }; // This needs to not crash (outer node is not expression) diff --git a/tests/baselines/reference/typeSatisfaction_propertyValueConformance3.js b/tests/baselines/reference/typeSatisfaction_propertyValueConformance3.js index c232746984d..c474d13bbfe 100644 --- a/tests/baselines/reference/typeSatisfaction_propertyValueConformance3.js +++ b/tests/baselines/reference/typeSatisfaction_propertyValueConformance3.js @@ -18,6 +18,6 @@ exports.Palette = void 0; // All of these should be Colors, but I only use some of them here. exports.Palette = { white: { r: 255, g: 255, b: 255 }, - black: { r: 0, g: 0, d: 0 }, + black: { r: 0, g: 0, d: 0 }, // <- oops! 'd' in place of 'b' blue: { r: 0, g: 0, b: 255 }, }; diff --git a/tests/baselines/reference/variableDeclaratorResolvedDuringContextualTyping.js b/tests/baselines/reference/variableDeclaratorResolvedDuringContextualTyping.js index 1de04aa686b..f6979d12611 100644 --- a/tests/baselines/reference/variableDeclaratorResolvedDuringContextualTyping.js +++ b/tests/baselines/reference/variableDeclaratorResolvedDuringContextualTyping.js @@ -153,7 +153,7 @@ var FileService = /** @class */ (function () { data: "someData" }).then(function (response) { var result = { - stat: _this.jsonToStat(newFilePath, "someString"), + stat: _this.jsonToStat(newFilePath, "someString"), // _this needs to be emitted to the js file isNew: response.status === 201 }; return WinJS.TPromise.as(result); diff --git a/tests/cases/compiler/commentsOnObjectLiteral5.ts b/tests/cases/compiler/commentsOnObjectLiteral5.ts new file mode 100644 index 00000000000..726b429a711 --- /dev/null +++ b/tests/cases/compiler/commentsOnObjectLiteral5.ts @@ -0,0 +1,9 @@ +// @removeComments: false +// @target: ES5 + +const a = { + p0: 0, // Comment 0 + p1: 0, /* Comment 1 + A multiline comment. */ + p2: 0, // Comment 2 +};