diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index c735f1bb1e..ad08c28e6c 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -626,12 +626,6 @@ module ts { Parameters, // Parameters in parameter list } - enum TrailingCommaBehavior { - Disallow, - Allow, - Preserve - } - // Tracks whether we nested (directly or indirectly) in a certain control block. // Used for validating break and continue statements. enum ControlBlockContext { @@ -1203,7 +1197,7 @@ module ts { } // Parses a comma-delimited list of elements - function parseDelimitedList(kind: ParsingContext, parseElement: () => T, trailingCommaBehavior: TrailingCommaBehavior): NodeArray { + function parseDelimitedList(kind: ParsingContext, parseElement: () => T, allowTrailingComma: boolean, preserveTrailingComma: boolean): NodeArray { var saveParsingContext = parsingContext; parsingContext |= 1 << kind; var result = >[]; @@ -1228,13 +1222,13 @@ module ts { else if (isListTerminator(kind)) { // Check if the last token was a comma. if (commaStart >= 0) { - if (trailingCommaBehavior === TrailingCommaBehavior.Disallow) { + if (!allowTrailingComma) { if (file.syntacticErrors.length === errorCountBeforeParsingList) { // Report a grammar error so we don't affect lookahead grammarErrorAtPos(commaStart, scanner.getStartPos() - commaStart, Diagnostics.Trailing_comma_not_allowed); } } - else if (trailingCommaBehavior === TrailingCommaBehavior.Preserve) { + else if (preserveTrailingComma) { result.push(createNode(SyntaxKind.OmittedExpression)); } } @@ -1271,7 +1265,7 @@ module ts { function parseBracketedList(kind: ParsingContext, parseElement: () => T, startToken: SyntaxKind, endToken: SyntaxKind): NodeArray { if (parseExpected(startToken)) { - var result = parseDelimitedList(kind, parseElement, TrailingCommaBehavior.Disallow); + var result = parseDelimitedList(kind, parseElement, /*allowTrailingComma*/ false, /*preserveTrailingComma*/ false); parseExpected(endToken); return result; } @@ -2307,7 +2301,8 @@ module ts { else { parseExpected(SyntaxKind.OpenParenToken); } - callExpr.arguments = parseDelimitedList(ParsingContext.ArgumentExpressions, parseAssignmentExpression, TrailingCommaBehavior.Disallow); + callExpr.arguments = parseDelimitedList(ParsingContext.ArgumentExpressions, + parseAssignmentExpression, /*allowTrailingComma*/ false, /*preserveTrailingComma*/ false); parseExpected(SyntaxKind.CloseParenToken); expr = finishNode(callExpr); continue; @@ -2384,7 +2379,8 @@ module ts { var node = createNode(SyntaxKind.ArrayLiteral); parseExpected(SyntaxKind.OpenBracketToken); if (scanner.hasPrecedingLineBreak()) node.flags |= NodeFlags.MultiLine; - node.elements = parseDelimitedList(ParsingContext.ArrayLiteralMembers, parseArrayLiteralElement, TrailingCommaBehavior.Preserve); + node.elements = parseDelimitedList(ParsingContext.ArrayLiteralMembers, + parseArrayLiteralElement, /*allowTrailingComma*/ true, /*preserveTrailingComma*/ true); parseExpected(SyntaxKind.CloseBracketToken); return finishNode(node); } @@ -2427,9 +2423,9 @@ module ts { } // 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; + var preserveTrailingComma = languageVersion !== ScriptTarget.ES3; - node.properties = parseDelimitedList(ParsingContext.ObjectLiteralMembers, parseObjectLiteralMember, trailingCommaBehavior); + node.properties = parseDelimitedList(ParsingContext.ObjectLiteralMembers, parseObjectLiteralMember, /*allowTrailingComma*/ true, preserveTrailingComma); parseExpected(SyntaxKind.CloseBraceToken); var seen: Map = {}; @@ -2518,7 +2514,8 @@ module ts { parseExpected(SyntaxKind.NewKeyword); node.func = parseCallAndAccess(parsePrimaryExpression(), /* inNewExpression */ true); if (parseOptional(SyntaxKind.OpenParenToken) || token === SyntaxKind.LessThanToken && (node.typeArguments = tryParse(parseTypeArgumentsAndOpenParen))) { - node.arguments = parseDelimitedList(ParsingContext.ArgumentExpressions, parseAssignmentExpression, TrailingCommaBehavior.Disallow); + node.arguments = parseDelimitedList(ParsingContext.ArgumentExpressions, + parseAssignmentExpression, /*allowTrailingComma*/ false, /*preserveTrailingComma*/ false); parseExpected(SyntaxKind.CloseParenToken); } return finishNode(node); @@ -3087,7 +3084,8 @@ module ts { } function parseVariableDeclarationList(flags: NodeFlags, noIn?: boolean): NodeArray { - return parseDelimitedList(ParsingContext.VariableDeclarations, () => parseVariableDeclaration(flags, noIn), TrailingCommaBehavior.Disallow); + return parseDelimitedList(ParsingContext.VariableDeclarations, + () => parseVariableDeclaration(flags, noIn), /*allowTrailingComma*/ false, /*preserveTrailingComma*/ false); } function parseVariableStatement(pos?: number, flags?: NodeFlags): VariableStatement { @@ -3486,7 +3484,8 @@ module ts { var implementsKeywordLength: number; if (parseOptional(SyntaxKind.ImplementsKeyword)) { implementsKeywordLength = scanner.getStartPos() - implementsKeywordStart; - node.implementedTypes = parseDelimitedList(ParsingContext.BaseTypeReferences, parseTypeReference, TrailingCommaBehavior.Disallow); + node.implementedTypes = parseDelimitedList(ParsingContext.BaseTypeReferences, + parseTypeReference, /*allowTrailingComma*/ false, /*preserveTrailingComma*/ false); } var errorCountBeforeClassBody = file.syntacticErrors.length; if (parseExpected(SyntaxKind.OpenBraceToken)) { @@ -3514,7 +3513,8 @@ module ts { var extendsKeywordLength: number; if (parseOptional(SyntaxKind.ExtendsKeyword)) { extendsKeywordLength = scanner.getStartPos() - extendsKeywordStart; - node.baseTypes = parseDelimitedList(ParsingContext.BaseTypeReferences, parseTypeReference, TrailingCommaBehavior.Disallow); + node.baseTypes = parseDelimitedList(ParsingContext.BaseTypeReferences, + parseTypeReference, /*allowTrailingComma*/ false, /*preserveTrailingComma*/ false); } var errorCountBeforeInterfaceBody = file.syntacticErrors.length; node.members = parseTypeLiteral().members; @@ -3578,7 +3578,8 @@ module ts { parseExpected(SyntaxKind.EnumKeyword); node.name = parseIdentifier(); if (parseExpected(SyntaxKind.OpenBraceToken)) { - node.members = parseDelimitedList(ParsingContext.EnumMembers, parseAndCheckEnumMember, TrailingCommaBehavior.Allow); + node.members = parseDelimitedList(ParsingContext.EnumMembers, + parseAndCheckEnumMember, /*allowTrailingComma*/ true, /*preserveTrailingComma*/ false); parseExpected(SyntaxKind.CloseBraceToken); } else {