Exemplo n.º 1
0
 public static void ReplaceChildNode(
     ExprNode parentNode,
     ExprNode nodeToReplace,
     ExprNode newNode)
 {
     var index = FindChildNode(parentNode, nodeToReplace);
     if (index == -1) {
         parentNode.ReplaceUnlistedChildNode(nodeToReplace, newNode);
     }
     else {
         parentNode.SetChildNode(index, newNode);
     }
 }
Exemplo n.º 2
0
        /// <summary>A recursive function that works on the child nodes of a given node, replacing any instances of the node representing the name, and visiting the children of all other nodes. </summary>
        /// <param name="node">the node whose children are to be examined for names</param>
        /// <param name="name">the name to replace</param>
        /// <param name="fullExpr">the full expression corresponding to the name</param>
        private static void VisitChildren(ExprNode node, String name, ExprNode fullExpr)
        {
            var childNodes = node.ChildNodes;

            for (int i = 0; i < childNodes.Count; i++)
            {
                ExprNode childNode = childNodes[i];
                if (IsColumnNameNode(childNode, name))
                {
                    node.SetChildNode(i, fullExpr);
                }
                else
                {
                    VisitChildren(childNode, name, fullExpr);
                }
            }
        }
Exemplo n.º 3
0
        private static ExprNode GetValidatedSubtreeInternal(
            ExprNode exprNode,
            ExprValidationContext validationContext,
            bool isTopLevel)
        {
            ExprNode result = exprNode;
            if (exprNode is ExprLambdaGoesNode) {
                return exprNode;
            }

            for (int i = 0; i < exprNode.ChildNodes.Length; i++) {
                ExprNode childNode = exprNode.ChildNodes[i];
                if (childNode is ExprDeclaredOrLambdaNode node) {
                    if (node.IsValidated) {
                        continue;
                    }
                }

                ExprNode childNodeValidated = GetValidatedSubtreeInternal(childNode, validationContext, false);
                exprNode.SetChildNode(i, childNodeValidated);
            }

            try {
                ExprNode optionalReplacement = exprNode.Validate(validationContext);
                if (optionalReplacement != null) {
                    return GetValidatedSubtreeInternal(optionalReplacement, validationContext, isTopLevel);
                }
            }
            catch (ExprValidationException e) {
                if (exprNode is ExprIdentNode identNode) {
                    try {
                        result = ResolveStaticMethodOrField(identNode, e, validationContext);
                    }
                    catch (ExprValidationException) {
                        var resolutionStream = ResolveAsStreamName(identNode, validationContext);
                        if (resolutionStream.First == false) {
                            throw;
                        }

                        result = resolutionStream.Second;
                    }
                }
                else {
                    throw;
                }
            }

            // For top-level expressions check if we perform audit
            if (isTopLevel) {
                if (validationContext.IsExpressionAudit) {
                    return (ExprNode) ExprNodeProxy.NewInstance(result);
                }
            }
            else {
                if (validationContext.IsExpressionNestedAudit &&
                    !(result is ExprIdentNode) &&
                    !(ExprNodeUtilityQuery.IsConstant(result))) {
                    return (ExprNode) ExprNodeProxy.NewInstance(result);
                }
            }

            return result;
        }