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); } }
/// <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); } } }
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; }