/* **************************************************************************** * * Copyright (c) Microsoft Corporation. * * This source code is subject to terms and conditions of the Apache License, Version 2.0. A * copy of the license can be found in the License.html file at the root of this distribution. If * you cannot locate the Apache License, Version 2.0, please send an email to * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound * by the terms of the Apache License, Version 2.0. * * You must not remove this notice, or any other, from this software. * * * ***************************************************************************/ using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Dynamic.Utils; using System.Runtime.CompilerServices; #if CLR2 namespace Microsoft.Scripting.Ast { #else namespace System.Linq.Expressions { #endif /// /// An expression that provides runtime read/write access to variables. /// Needed to implement "eval" in some dynamic languages. /// Evaluates to an instance of when executed. /// #if !SILVERLIGHT [DebuggerTypeProxy(typeof(Expression.RuntimeVariablesExpressionProxy))] #endif public sealed class RuntimeVariablesExpression : Expression { private readonly ReadOnlyCollection _variables; internal RuntimeVariablesExpression(ReadOnlyCollection variables) { _variables = variables; } /// /// Gets the static type of the expression that this represents. /// /// The that represents the static type of the expression. public sealed override Type Type { get { return typeof(IRuntimeVariables); } } /// /// Returns the node type of this Expression. Extension nodes should return /// ExpressionType.Extension when overriding this method. /// /// The of the expression. public sealed override ExpressionType NodeType { get { return ExpressionType.RuntimeVariables; } } /// /// The variables or parameters to which to provide runtime access. /// public ReadOnlyCollection Variables { get { return _variables; } } /// /// Dispatches to the specific visit method for this node type. /// protected internal override Expression Accept(ExpressionVisitor visitor) { return visitor.VisitRuntimeVariables(this); } /// /// Creates a new expression that is like this one, but using the /// supplied children. If all of the children are the same, it will /// return this expression. /// /// The property of the result. /// This expression if no children changed, or an expression with the updated children. public RuntimeVariablesExpression Update(IEnumerable variables) { if (variables == Variables) { return this; } return Expression.RuntimeVariables(variables); } } public partial class Expression { /// /// Creates an instance of . /// /// An array of objects to use to populate the collection. /// An instance of that has the property equal to and the property set to the specified value. public static RuntimeVariablesExpression RuntimeVariables(params ParameterExpression[] variables) { return RuntimeVariables((IEnumerable)variables); } /// /// Creates an instance of . /// /// A collection of objects to use to populate the collection. /// An instance of that has the property equal to and the property set to the specified value. public static RuntimeVariablesExpression RuntimeVariables(IEnumerable variables) { ContractUtils.RequiresNotNull(variables, "variables"); var vars = variables.ToReadOnly(); for (int i = 0; i < vars.Count; i++) { Expression v = vars[i]; if (v == null) { throw new ArgumentNullException("variables[" + i + "]"); } } return new RuntimeVariablesExpression(vars); } } }