Пример #1
0
 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;
     }
 }
Пример #2
0
 public void VisitComplex(ComplexExpressionBase ComplexExpression)
 {
     foreach (Expression expr in ComplexExpression.ConstructorArguments)
     {
         Visit(expr);
     }
 }
Пример #3
0
 public virtual void Visit(ComplexExpressionBase expression)
 {
     foreach (Expression expr in expression.ConstructorArguments)
     {
         expr.Accept(this);
     }
 }
Пример #4
0
        /// <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);
        }
 public virtual void Visit(ComplexExpressionBase expression)
 {
     foreach (Expression expr in expression.ConstructorArguments)
     {
         expr.Accept(this);
     }
 }
Пример #6
0
        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;
     }
 }
Пример #8
0
        /// <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);
 }