public ExprNode ParseLeftHandSideExpression()
{
var callExp = new CallExpression { Token = Next() };
callExp.Member = ParseMemberExpression();
if (Next().IsNot(TokenType.LeftParen))
return callExp.Member;
callExp.Arguments = ParseArguments();
while (true)
{
switch (Next().Type)
{
case TokenType.LeftParen:
callExp.Suffixes.Add(ParseArguments());
break;
case TokenType.LeftBracket:
callExp.Suffixes.Add(ParseIndexSuffix());
break;
case TokenType.Dot:
callExp.Suffixes.Add(ParsePropertyReferenceSuffix());
break;
case TokenType.LessThan:
Node node;
if (Speculate(ParseTypeDescriptorSuffix, out node))
{
callExp.Suffixes.Add(node);
}
else
{
return callExp;
}
break;
default:
return callExp;
}
}
}