LoopExpression.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / Microsoft / Scripting / Ast / LoopExpression.cs / 1305376 / LoopExpression.cs

                            /* **************************************************************************** 
 *
 * Copyright (c) Microsoft Corporation.
 *
 * This source code is subject to terms and conditions of the Microsoft Public License. A 
 * copy of the license can be found in the License.html file at the root of this distribution. If
 * you cannot locate the  Microsoft Public License, 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 Microsoft Public License.
 * 
 * You must not remove this notice, or any other, from this software.
 *
 *
 * ***************************************************************************/ 

using System.Diagnostics; 
using System.Dynamic.Utils; 

#if SILVERLIGHT 
using System.Core;
#endif

namespace System.Linq.Expressions { 
    /// 
    /// Represents an infinite loop. It can be exited with "break". 
    ///  
#if !SILVERLIGHT
    [DebuggerTypeProxy(typeof(Expression.LoopExpressionProxy))] 
#endif
    public sealed class LoopExpression : Expression {
        private readonly Expression _body;
        private readonly LabelTarget _break; 
        private readonly LabelTarget _continue;
 
        internal LoopExpression(Expression body, LabelTarget @break, LabelTarget @continue) { 
            _body = body;
            _break = @break; 
            _continue = @continue;
        }

        ///  
        /// 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 _break == null ? typeof(void) : _break.Type; } 
        }

        /// 
        /// 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.Loop; } 
        }

        /// 
        /// Gets the  that is the body of the loop. 
        /// 
        public Expression Body { 
            get { return _body; } 
        }
 
        /// 
        /// Gets the  that is used by the loop body as a break statement target.
        /// 
        public LabelTarget BreakLabel { 
            get { return _break; }
        } 
 
        /// 
        /// Gets the  that is used by the loop body as a continue statement target. 
        /// 
        public LabelTarget ContinueLabel {
            get { return _continue; }
        } 

        ///  
        /// Dispatches to the specific visit method for this node type. 
        /// 
        protected internal override Expression Accept(ExpressionVisitor visitor) { 
            return visitor.VisitLoop(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. 
        /// The  property of the result.
        /// The  property of the result.
        /// This expression if no children changed, or an expression with the updated children.
        public LoopExpression Update(LabelTarget breakLabel, LabelTarget continueLabel, Expression body) { 
            if (breakLabel == BreakLabel && continueLabel == ContinueLabel && body == Body) {
                return this; 
            } 
            return Expression.Loop(body, breakLabel, continueLabel);
        } 
    }

    public partial class Expression {
        ///  
        /// Creates a  with the given body.
        ///  
        /// The body of the loop. 
        /// The created .
        public static LoopExpression Loop(Expression body) { 
            return Loop(body, null);
        }

        ///  
        /// Creates a  with the given body and break target.
        ///  
        /// The body of the loop. 
        /// The break target used by the loop body.
        /// The created . 
        public static LoopExpression Loop(Expression body, LabelTarget @break) {
            return Loop(body, @break, null);
        }
 
        /// 
        /// Creates a  with the given body. 
        ///  
        /// The body of the loop.
        /// The break target used by the loop body. 
        /// The continue target used by the loop body.
        /// The created .
        public static LoopExpression Loop(Expression body, LabelTarget @break, LabelTarget @continue) {
            RequiresCanRead(body, "body"); 
            if (@continue != null && @continue.Type != typeof(void)) throw Error.LabelTypeMustBeVoid();
            return new LoopExpression(body, @break, @continue); 
        } 
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.


                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK