From fe4c738b01daea80f95feeff5adc0baf9cf366fb Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Mon, 28 Jul 2014 11:34:30 -0700 Subject: [PATCH 1/2] No longer emit trailing comma on object literals. This was done because trailing commas in object literals are not accepted by ES3. Fixes #271. --- src/compiler/parser.ts | 2 +- tests/baselines/reference/assignmentCompatBug2.js | 10 +++++----- tests/baselines/reference/commentsOnObjectLiteral2.js | 2 +- tests/baselines/reference/convertKeywordsYes.js | 2 +- .../declFileModuleAssignmentInObjectLiteralProperty.js | 2 +- .../reference/objectLitIndexerContextualType.js | 8 ++++---- .../reference/objectLiteralParameterResolution.js | 2 +- ...ctTypeWithStringNamedPropertyOfIllegalCharacters.js | 2 +- .../stringLiteralTypesInImplementationSignatures2.js | 2 +- .../reference/thisInPropertyBoundDeclarations.js | 4 ++-- 10 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 20bd662166d..eec1b10b421 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -2107,7 +2107,7 @@ module ts { var node = createNode(SyntaxKind.ObjectLiteral); parseExpected(SyntaxKind.OpenBraceToken); if (scanner.hasPrecedingLineBreak()) node.flags |= NodeFlags.MultiLine; - node.properties = parseDelimitedList(ParsingContext.ObjectLiteralMembers, parseObjectLiteralMember, TrailingCommaBehavior.Preserve); + node.properties = parseDelimitedList(ParsingContext.ObjectLiteralMembers, parseObjectLiteralMember, TrailingCommaBehavior.Allow); parseExpected(SyntaxKind.CloseBraceToken); var seen: Map = {}; diff --git a/tests/baselines/reference/assignmentCompatBug2.js b/tests/baselines/reference/assignmentCompatBug2.js index f7b4ea9b490..10c2a090ca5 100644 --- a/tests/baselines/reference/assignmentCompatBug2.js +++ b/tests/baselines/reference/assignmentCompatBug2.js @@ -50,7 +50,7 @@ b3 = { g: function (s) { return 0; }, - m: 0, + m: 0 }; b3 = { f: function (n) { @@ -58,13 +58,13 @@ b3 = { }, g: function (s) { return 0; - }, + } }; b3 = { f: function (n) { return 0; }, - m: 0, + m: 0 }; b3 = { f: function (n) { @@ -77,7 +77,7 @@ b3 = { n: 0, k: function (a) { return null; - }, + } }; b3 = { f: function (n) { @@ -89,5 +89,5 @@ b3 = { n: 0, k: function (a) { return null; - }, + } }; diff --git a/tests/baselines/reference/commentsOnObjectLiteral2.js b/tests/baselines/reference/commentsOnObjectLiteral2.js index 0bdab49ed8f..cc64db96c01 100644 --- a/tests/baselines/reference/commentsOnObjectLiteral2.js +++ b/tests/baselines/reference/commentsOnObjectLiteral2.js @@ -16,5 +16,5 @@ var Person = makeClass( var Person = makeClass({ initialize: function (name) { this.name = name; - }, + } }); diff --git a/tests/baselines/reference/convertKeywordsYes.js b/tests/baselines/reference/convertKeywordsYes.js index 8055b8dff24..b6572cf9cf9 100644 --- a/tests/baselines/reference/convertKeywordsYes.js +++ b/tests/baselines/reference/convertKeywordsYes.js @@ -380,7 +380,7 @@ var bigObject = { var: 0, void: 0, while: 0, - with: 0, + with: 0 }; var bigClass = (function () { function bigClass() { diff --git a/tests/baselines/reference/declFileModuleAssignmentInObjectLiteralProperty.js b/tests/baselines/reference/declFileModuleAssignmentInObjectLiteralProperty.js index 1b361e9e048..443933069da 100644 --- a/tests/baselines/reference/declFileModuleAssignmentInObjectLiteralProperty.js +++ b/tests/baselines/reference/declFileModuleAssignmentInObjectLiteralProperty.js @@ -21,7 +21,7 @@ var m1; })(m1 || (m1 = {})); var d = { m1: { m: m1 }, - m2: { c: m1.c }, + m2: { c: m1.c } }; diff --git a/tests/baselines/reference/objectLitIndexerContextualType.js b/tests/baselines/reference/objectLitIndexerContextualType.js index 4f03dec3594..f0cf90724b3 100644 --- a/tests/baselines/reference/objectLitIndexerContextualType.js +++ b/tests/baselines/reference/objectLitIndexerContextualType.js @@ -26,14 +26,14 @@ y = { var x; var y; x = { - s: function (t) { return t * t; }, + s: function (t) { return t * t; } }; x = { - 0: function (t) { return t * t; }, + 0: function (t) { return t * t; } }; y = { - s: function (t) { return t * t; }, + s: function (t) { return t * t; } }; y = { - 0: function (t) { return t * t; }, + 0: function (t) { return t * t; } }; diff --git a/tests/baselines/reference/objectLiteralParameterResolution.js b/tests/baselines/reference/objectLiteralParameterResolution.js index 81d5fb98a42..5912a2229b1 100644 --- a/tests/baselines/reference/objectLiteralParameterResolution.js +++ b/tests/baselines/reference/objectLiteralParameterResolution.js @@ -25,5 +25,5 @@ var s = $.extend({ dataType: "json", converters: { "text json": "" }, traditional: true, - timeout: 12, + timeout: 12 }, ""); diff --git a/tests/baselines/reference/objectTypeWithStringNamedPropertyOfIllegalCharacters.js b/tests/baselines/reference/objectTypeWithStringNamedPropertyOfIllegalCharacters.js index 51f6fce1d73..9c674854cdc 100644 --- a/tests/baselines/reference/objectTypeWithStringNamedPropertyOfIllegalCharacters.js +++ b/tests/baselines/reference/objectTypeWithStringNamedPropertyOfIllegalCharacters.js @@ -77,7 +77,7 @@ var r4 = a["~!@#$%^&*()_+{}|:'<>?\/.,`"]; var b = { " ": 1, "a b": "", - "~!@#$%^&*()_+{}|:'<>?\/.,`": 1, + "~!@#$%^&*()_+{}|:'<>?\/.,`": 1 }; var r = b[" "]; var r2 = b[" "]; diff --git a/tests/baselines/reference/stringLiteralTypesInImplementationSignatures2.js b/tests/baselines/reference/stringLiteralTypesInImplementationSignatures2.js index 9667537f977..577e388cc48 100644 --- a/tests/baselines/reference/stringLiteralTypesInImplementationSignatures2.js +++ b/tests/baselines/reference/stringLiteralTypesInImplementationSignatures2.js @@ -44,5 +44,5 @@ var b = { foo: function (x) { }, foo: function (x) { - }, + } }; diff --git a/tests/baselines/reference/thisInPropertyBoundDeclarations.js b/tests/baselines/reference/thisInPropertyBoundDeclarations.js index de3b081413d..f98ea85f997 100644 --- a/tests/baselines/reference/thisInPropertyBoundDeclarations.js +++ b/tests/baselines/reference/thisInPropertyBoundDeclarations.js @@ -101,13 +101,13 @@ var A = (function () { this.prop4 = { a: function () { return this; - }, + } }; this.prop5 = function () { return { a: function () { return this; - }, + } }; }; } From c5349dc95f51abfed58cc6a8254fcb272e87f654 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 29 Jul 2014 16:25:10 -0700 Subject: [PATCH 2/2] Accept object literal commas in ES3, preserve in ES5. --- src/compiler/parser.ts | 12 ++++++--- .../baselines/reference/trailingCommasES3.js | 25 +++++++++++++++++++ .../baselines/reference/trailingCommasES5.js | 25 +++++++++++++++++++ tests/cases/compiler/trailingCommasES3.ts | 13 ++++++++++ tests/cases/compiler/trailingCommasES5.ts | 13 ++++++++++ 5 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 tests/baselines/reference/trailingCommasES3.js create mode 100644 tests/baselines/reference/trailingCommasES5.js create mode 100644 tests/cases/compiler/trailingCommasES3.ts create mode 100644 tests/cases/compiler/trailingCommasES5.ts diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index eec1b10b421..22ecff19ab8 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -2106,14 +2106,20 @@ module ts { function parseObjectLiteral(): ObjectLiteral { var node = createNode(SyntaxKind.ObjectLiteral); parseExpected(SyntaxKind.OpenBraceToken); - if (scanner.hasPrecedingLineBreak()) node.flags |= NodeFlags.MultiLine; - node.properties = parseDelimitedList(ParsingContext.ObjectLiteralMembers, parseObjectLiteralMember, TrailingCommaBehavior.Allow); + if (scanner.hasPrecedingLineBreak()) { + node.flags |= NodeFlags.MultiLine; + } + + // ES3 itself does not accept a trailing comma in an object literal, however, we'd like to preserve it in ES5. + var trailingCommaBehavior = languageVersion === ScriptTarget.ES3 ? TrailingCommaBehavior.Allow : TrailingCommaBehavior.Preserve; + + node.properties = parseDelimitedList(ParsingContext.ObjectLiteralMembers, parseObjectLiteralMember, trailingCommaBehavior); parseExpected(SyntaxKind.CloseBraceToken); var seen: Map = {}; var Property = 1; var GetAccessor = 2; - var SetAccesor = 4; + var SetAccesor = 4; var GetOrSetAccessor = GetAccessor | SetAccesor; forEach(node.properties, (p: Declaration) => { if (p.kind === SyntaxKind.OmittedExpression) { diff --git a/tests/baselines/reference/trailingCommasES3.js b/tests/baselines/reference/trailingCommasES3.js new file mode 100644 index 00000000000..56e30fe5c17 --- /dev/null +++ b/tests/baselines/reference/trailingCommasES3.js @@ -0,0 +1,25 @@ +//// [trailingCommasES3.ts] + +var o1 = { a: 1, b: 2 }; +var o2 = { a: 1, b: 2, }; +var o3 = { a: 1, }; +var o4 = {}; + +var a1 = [1, 2]; +var a2 = [1, 2, ]; +var a3 = [1, ]; +var a4 = []; +var a5 = [1, , ]; +var a6 = [, , ]; + +//// [trailingCommasES3.js] +var o1 = { a: 1, b: 2 }; +var o2 = { a: 1, b: 2 }; +var o3 = { a: 1 }; +var o4 = {}; +var a1 = [1, 2]; +var a2 = [1, 2, ]; +var a3 = [1, ]; +var a4 = []; +var a5 = [1, , ]; +var a6 = [, , ]; diff --git a/tests/baselines/reference/trailingCommasES5.js b/tests/baselines/reference/trailingCommasES5.js new file mode 100644 index 00000000000..f342d9ac2d7 --- /dev/null +++ b/tests/baselines/reference/trailingCommasES5.js @@ -0,0 +1,25 @@ +//// [trailingCommasES5.ts] + +var o1 = { a: 1, b: 2 }; +var o2 = { a: 1, b: 2, }; +var o3 = { a: 1, }; +var o4 = {}; + +var a1 = [1, 2]; +var a2 = [1, 2, ]; +var a3 = [1, ]; +var a4 = []; +var a5 = [1, , ]; +var a6 = [, , ]; + +//// [trailingCommasES5.js] +var o1 = { a: 1, b: 2 }; +var o2 = { a: 1, b: 2, }; +var o3 = { a: 1, }; +var o4 = {}; +var a1 = [1, 2]; +var a2 = [1, 2, ]; +var a3 = [1, ]; +var a4 = []; +var a5 = [1, , ]; +var a6 = [, , ]; diff --git a/tests/cases/compiler/trailingCommasES3.ts b/tests/cases/compiler/trailingCommasES3.ts new file mode 100644 index 00000000000..cc35f8e4823 --- /dev/null +++ b/tests/cases/compiler/trailingCommasES3.ts @@ -0,0 +1,13 @@ +// @target: es3 + +var o1 = { a: 1, b: 2 }; +var o2 = { a: 1, b: 2, }; +var o3 = { a: 1, }; +var o4 = {}; + +var a1 = [1, 2]; +var a2 = [1, 2, ]; +var a3 = [1, ]; +var a4 = []; +var a5 = [1, , ]; +var a6 = [, , ]; \ No newline at end of file diff --git a/tests/cases/compiler/trailingCommasES5.ts b/tests/cases/compiler/trailingCommasES5.ts new file mode 100644 index 00000000000..b5518e69d90 --- /dev/null +++ b/tests/cases/compiler/trailingCommasES5.ts @@ -0,0 +1,13 @@ +// @target: es5 + +var o1 = { a: 1, b: 2 }; +var o2 = { a: 1, b: 2, }; +var o3 = { a: 1, }; +var o4 = {}; + +var a1 = [1, 2]; +var a2 = [1, 2, ]; +var a3 = [1, ]; +var a4 = []; +var a5 = [1, , ]; +var a6 = [, , ]; \ No newline at end of file