private Expression ParseCallOrMemberTail(Expression ret) { while (true) { if (MaybeEat(TokenKind.LeftParenthesis)) { List<Arg> arguments = new List<Arg>(); if (!MaybeEat(TokenKind.RightParenthesis)) { do { arguments.Add(ParseArg()); } while (MaybeEat(TokenKind.Comma)); Eat(TokenKind.RightParenthesis); } ret = new CallExpression(ret, arguments.ToArray()); ret.SetLoc(_globalParent, ret.StartIndex, GetEnd()); } else if (MaybeEat(TokenKind.Dot)) { ret = new MemberExpression(ret, ((NameToken)NextToken()).Name); ret.SetLoc(_globalParent, ret.StartIndex, GetEnd()); } else if (MaybeEat(TokenKind.LeftBracket)) { ret = new IndexExpression(ret, new[] { ParseExpression() }); // TODO: make possible with multiple indexes ret.SetLoc(_globalParent, ret.StartIndex, GetEnd()); Eat(TokenKind.RightBracket); } else return ret; } }
private CallExpression ParseSingleCall(Expression target) { Eat(TokenKind.LeftParenthesis); List<Arg> arguments = new List<Arg>(); if (!MaybeEat(TokenKind.RightParenthesis)) { do { arguments.Add(ParseArg()); } while (MaybeEat(TokenKind.Comma)); Eat(TokenKind.RightParenthesis); } var ret = new CallExpression(target, arguments.ToArray()); ret.SetLoc(_globalParent, target.StartIndex, GetEnd()); return ret; }
public Arg(string name, Expression expression) { _name = name; _expression = expression; }
public NewExpression(Expression target, Arg[] args) { _target = target; _args = args; }
public Arg(Expression expression) : this(null, expression) { }