private ExpressionSyntax ParseCastOrParenthesizedExpression()
{
Debug.Assert(Current.Kind == SyntaxKind.OpenParenToken);
var resetPoint = GetResetPoint();
// We have a decision to make -- is this a cast, or is it a parenthesized
// expression? Because look-ahead is cheap with our token stream, we check
// to see if this "looks like" a cast (without constructing any parse trees)
// to help us make the decision.
if (ScanCast())
{
// Looks like a cast, so parse it as one.
Reset(ref resetPoint);
var openParen = Match(SyntaxKind.OpenParenToken);
List<ArrayRankSpecifierSyntax> arrayRankSpecifiers;
var type = ParseTypeForCast(out arrayRankSpecifiers);
var closeParen = Match(SyntaxKind.CloseParenToken);
var expr = ParseSubExpression(SyntaxFacts.GetOperatorPrecedence(SyntaxKind.CastExpression));
return new CastExpressionSyntax(openParen, type, arrayRankSpecifiers, closeParen, expr);
}
// Doesn't look like a cast, so parse this as a parenthesized expression.
{
Reset(ref resetPoint);
var openParen = Match(SyntaxKind.OpenParenToken);
try
{
CommaIsSeparatorStack.Push(false);
var expression = ParseSubExpression(0);
var closeParen = Match(SyntaxKind.CloseParenToken);
return new ParenthesizedExpressionSyntax(openParen, expression, closeParen);
}
finally
{
CommaIsSeparatorStack.Pop();
}
}
}