public void VisitComplexBase(ComplexExpressionBase expression) { if (_refID.Top == JsonPath.Root) { if (expression.Parent != null) { throw new ArgumentException("Reference for this passed to object that is not at the root", "refID"); } } else { // have to assume that the parent checked that we were the right reference // should only get here if we have a parent, if no parent we're not valid if (expression.Parent == null) { throw new ArgumentException("Invalid reference", "refID"); } } // it is this object, check if we need to go further _refID = _refID.ChildReference(); if (_refID.IsEmpty) { _expr = expression; } }
public void VisitComplex(ComplexExpressionBase ComplexExpression) { foreach (Expression expr in ComplexExpression.ConstructorArguments) { Visit(expr); } }
public virtual void Visit(ComplexExpressionBase expression) { foreach (Expression expr in expression.ConstructorArguments) { expr.Accept(this); } }
/// <summary> /// Parses a constructor expression /// </summary> /// <returns>complex expression</returns> /// <example> /// new MyType("arg1", "arg2") /// new MyType("argA", "argB") { "argC": "C", "argD": "D" } /// </example> private ComplexExpressionBase ParseConstructedObject() { Token tok = ReadToken(); // should be the new keyword Debug.Assert(tok == NewToken); Type t = ParseTypeSpecifier(); tok = ReadToken(); RequireToken(LParenToken, tok, "Missing constructor arguments"); Expression arg; List <Expression> ConstructorArgs = new List <Expression>(); while (ReadAhead(CommaToken, RParenToken, new ExpressionMethod(ParseExpression), out arg)) { ConstructorArgs.Add(arg); } ComplexExpressionBase value = null; if (PeekToken() == LSquareToken || PeekToken() == LBraceToken) { value = (ComplexExpressionBase)ParseExpression(); } else { value = new ObjectExpression(); } value.ResultType = t; value.ConstructorArguments = ConstructorArgs; return(value); }
private JsonPath GetPath(Expression expression) { if (expression.Parent == null) { return(new JsonPath()); } Expression parent = GetRealExpression(expression.Parent); if (parent is ComplexExpressionBase) { ComplexExpressionBase complexParent = (ComplexExpressionBase)parent; JsonPath path = GetPath(parent); if (parent is ArrayExpression) { ArrayExpression parentArray = (ArrayExpression)parent; for (int i = 0; i < parentArray.Items.Count; i++) { if (ExpressionEqual(parentArray.Items[i], expression)) { return(path.Append(i)); } } } else if (parent is ObjectExpression) { ObjectExpression parentObject = (ObjectExpression)parent; foreach (KeyValueExpression kve in parentObject.Properties) { if (ExpressionEqual(kve.KeyExpression, expression) || ExpressionEqual(kve.ValueExpression, expression)) { return(path.Append(kve.Key)); } } } for (int i = 0; i < complexParent.ConstructorArguments.Count; i++) { if (ExpressionEqual(complexParent.ConstructorArguments[i], expression)) { return(path.Append("carg" + i)); } } } return(null); }
public void VisitComplexBase(ComplexExpressionBase expression) { if (_refID.Top == JsonPath.Root) { if (expression.Parent != null) { throw new ArgumentException("Reference for this passed to object that is not at the root", "refID"); } } else { // have to assume that the parent checked that we were the right reference // should only get here if we have a parent, if no parent we're not valid if (expression.Parent == null) throw new ArgumentException("Invalid reference", "refID"); } // it is this object, check if we need to go further _refID = _refID.ChildReference(); if (_refID.IsEmpty) { _expr = expression; } }
/// <summary> /// Parses a constructor expression /// </summary> /// <returns>complex expression</returns> /// <example> /// new MyType("arg1", "arg2") /// new MyType("argA", "argB") { "argC": "C", "argD": "D" } /// </example> private Expression ParseConstructedObject() { Token tok = ReadToken(); // should be the new keyword Debug.Assert(tok == NewToken); Type t = ParseTypeSpecifier(); int line = tok.linenumber; int pos = tok.position; tok = ReadToken(); RequireToken(LParenToken, tok, "Missing constructor arguments"); Expression arg; List <Expression> ConstructorArgs = new List <Expression>(); bool first = true; while (ReadAhead(CommaToken, RParenToken, new ExpressionMethod(ParseExpression), out arg, ref first)) { ConstructorArgs.Add(arg); } ComplexExpressionBase value = null; if (PeekToken() == LSquareToken || PeekToken() == LBraceToken) { value = (ComplexExpressionBase)ParseExpression(); } else { value = new ObjectExpression(); } value.ResultType = t; value.ConstructorArguments = ConstructorArgs; value.LineNumber = line; value.CharacterPosition = pos; // insert Cast to keep type from being overwritten return(new CastExpression(t, value)); }
public void VisitComplex(ComplexExpressionBase ComplexExpression) { foreach (Expression expr in ComplexExpression.ConstructorArguments) Visit(expr); }