Move missing argument checks to the grammar walker.

This commit is contained in:
Cyrus Najmabadi
2014-11-19 17:57:35 -08:00
parent 7a414fc308
commit 76f88392a4
5 changed files with 43 additions and 23 deletions

View File

@@ -2376,25 +2376,18 @@ module ts {
return finishNode(node);
}
function parseAssignmentExpressionOrOmittedExpression(omittedExpressionDiagnostic: DiagnosticMessage): Expression {
if (token === SyntaxKind.CommaToken) {
if (omittedExpressionDiagnostic) {
var errorStart = scanner.getTokenPos();
var errorLength = scanner.getTextPos() - errorStart;
grammarErrorAtPos(errorStart, errorLength, omittedExpressionDiagnostic);
}
return createNode(SyntaxKind.OmittedExpression);
}
return parseAssignmentExpression();
function parseAssignmentExpressionOrOmittedExpression(): Expression {
return token === SyntaxKind.CommaToken
? createNode(SyntaxKind.OmittedExpression)
: parseAssignmentExpression();
}
function parseArrayLiteralElement(): Expression {
return parseAssignmentExpressionOrOmittedExpression(/*omittedExpressionDiagnostic*/ undefined);
return parseAssignmentExpressionOrOmittedExpression();
}
function parseArgumentExpression(): Expression {
return parseAssignmentExpressionOrOmittedExpression(Diagnostics.Argument_expression_expected);
return parseAssignmentExpressionOrOmittedExpression();
}
function parseArrayLiteral(): ArrayLiteral {
@@ -3922,7 +3915,12 @@ module ts {
function visitCallExpression(node: CallExpression) {
checkTypeArguments(node.typeArguments) ||
checkForTrailingComma(node.arguments);
checkArguments(node.arguments);
}
function checkArguments(arguments: NodeArray<Expression>) {
return checkForTrailingComma(arguments) ||
checkForOmittedArgument(arguments);
}
function checkTypeArguments(typeArguments: NodeArray<TypeNode>) {
@@ -3931,6 +3929,17 @@ module ts {
checkForMissingTypeArgument(typeArguments);
}
function checkForOmittedArgument(arguments: NodeArray<Expression>) {
if (arguments) {
for (var i = 0, n = arguments.length; i < n; i++) {
var arg = arguments[i];
if (arg.kind === SyntaxKind.OmittedExpression) {
return grammarErrorAtPos(arg.pos, 0, Diagnostics.Argument_expression_expected);
}
}
}
}
function checkForMissingTypeArgument(typeArguments: NodeArray<TypeNode>) {
if (typeArguments) {
for (var i = 0, n = typeArguments.length; i < n; i++) {
@@ -4203,7 +4212,7 @@ module ts {
function visitNewExpression(node: NewExpression): void {
checkTypeArguments(node.typeArguments) ||
checkForTrailingComma(node.arguments);
checkArguments(node.arguments);
}
function visitObjectLiteral(node: ObjectLiteral): void {