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