| File: System\Dynamic\Utils\ExpressionVisitorUtils.cs | Web Access |
| Project: src\runtime\src\libraries\System.Linq.Expressions\src\System.Linq.Expressions.csproj (System.Linq.Expressions) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Linq.Expressions; namespace System.Dynamic.Utils { internal static class ExpressionVisitorUtils { public static Expression[]? VisitBlockExpressions(ExpressionVisitor visitor, BlockExpression block) { Expression[]? newNodes = null; for (int i = 0, n = block.ExpressionCount; i < n; i++) { Expression curNode = block.GetExpression(i); Expression node = visitor.Visit(curNode); if (newNodes != null) { newNodes[i] = node; } else if (!object.ReferenceEquals(node, curNode)) { newNodes = new Expression[n]; for (int j = 0; j < i; j++) { newNodes[j] = block.GetExpression(j); } newNodes[i] = node; } } return newNodes; } public static ParameterExpression[]? VisitParameters(ExpressionVisitor visitor, IParameterProvider nodes, string? callerName) { ParameterExpression[]? newNodes = null; for (int i = 0, n = nodes.ParameterCount; i < n; i++) { ParameterExpression curNode = nodes.GetParameter(i); ParameterExpression node = visitor.VisitAndConvert(curNode, callerName); if (newNodes != null) { newNodes[i] = node; } else if (!object.ReferenceEquals(node, curNode)) { newNodes = new ParameterExpression[n]; for (int j = 0; j < i; j++) { newNodes[j] = nodes.GetParameter(j); } newNodes[i] = node; } } return newNodes; } public static Expression[]? VisitArguments(ExpressionVisitor visitor, IArgumentProvider nodes) { Expression[]? newNodes = null; for (int i = 0, n = nodes.ArgumentCount; i < n; i++) { Expression curNode = nodes.GetArgument(i); Expression node = visitor.Visit(curNode); if (newNodes != null) { newNodes[i] = node; } else if (!object.ReferenceEquals(node, curNode)) { newNodes = new Expression[n]; for (int j = 0; j < i; j++) { newNodes[j] = nodes.GetArgument(j); } newNodes[i] = node; } } return newNodes; } } }