/// <summary> /// Evaluate object[index] /// </summary> /// <returns></returns> public object VisitIndex(IndexExpr expr) { var ndxVal = expr.IndexExp.Evaluate(this); var listObject = expr.VarExp.Evaluate(this); // Check for empty objects. ExceptionHelper.NotNull(expr, listObject, "indexing"); ExceptionHelper.NotNull(expr, ndxVal, "indexing"); var lobj = (LObject)listObject; // CASE 1. Access // e.g. Array: users[0] // e.g. Map: users['total'] if (!expr.IsAssignment) { var result = EvalHelper.AccessIndex(Ctx.Methods, expr, lobj, (LObject)ndxVal); return result; } // CASE 2. Assignment // e.g. Array: users[0] = 'john' // e.g. Map: users['total'] = 200 // NOTE: In this case of assignment, return back a MemberAccess object descripting what is assign var indexAccess = new IndexAccess(); indexAccess.Instance = lobj; indexAccess.MemberName = (LObject)ndxVal; return indexAccess; }
/// <summary> /// Creates an index expression from the parameters supplied. /// </summary> /// <param name="varExp"></param> /// <param name="indexExp"></param> /// <param name="isAssignment"></param> /// <param name="token"></param> /// <returns></returns> public static Expr Index(Expr varExp, Expr indexExp, bool isAssignment, TokenData token) { var exp = new IndexExpr(); exp.IsAssignment = isAssignment; exp.VarExp = varExp; exp.IndexExp = indexExp; SetupContext(exp, token); return exp; }
/// <summary> /// Visits the function call expression tree /// </summary> /// <param name="exp"></param> public object VisitIndex(IndexExpr exp) { _callBackOnNodeStart(exp); _callBackOnNodeStart(exp.VarExp); _callBackOnNodeStart(exp.IndexExp); return null; }