File: System\Xml\Xsl\QIL\QilNode.cs
Project: ndp\fx\src\XmlUtils\System.Data.SqlXml.csproj (System.Data.SqlXml)
//------------------------------------------------------------------------------
// <copyright file="QilNode.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
// <owner current="true" primary="true">Microsoft</owner>
//------------------------------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Xsl;
 
namespace System.Xml.Xsl.Qil {    
 
    /// <summary>
    /// A node in the QIL tree.
    /// </summary>
    /// <remarks>
    /// Don't construct QIL nodes directly; instead, use the <see cref="QilFactory">QilFactory</see>.
    /// This base internal class is not abstract and may be instantiated in some cases (for example, true/false boolean literals).
    /// </remarks>
    internal class QilNode : IList<QilNode> {
        protected QilNodeType nodeType;
        protected XmlQueryType xmlType;
        protected ISourceLineInfo sourceLine;
        protected object annotation;
 
        //-----------------------------------------------
        // Constructor
        //-----------------------------------------------
 
        /// <summary>
        /// Construct a new node
        /// </summary>
        public QilNode(QilNodeType nodeType) {
            this.nodeType = nodeType;
        }
 
        /// <summary>
        /// Construct a new node
        /// </summary>
        public QilNode(QilNodeType nodeType, XmlQueryType xmlType) {
            this.nodeType = nodeType;
            this.xmlType = xmlType;
        }
 
 
        //-----------------------------------------------
        // QilNode methods
        //-----------------------------------------------
 
        /// <summary>
        /// Access the QIL node type.
        /// </summary>
        public QilNodeType NodeType {
            get { return this.nodeType; }
            set { this.nodeType = value; }
        }
 
        /// <summary>
        /// Access the QIL type.
        /// </summary>
        public virtual XmlQueryType XmlType {
            get { return this.xmlType; }
            set { this.xmlType = value; }
        }
 
        /// <summary>
        /// Line info information for tools support.
        /// </summary>
        public ISourceLineInfo SourceLine {
            get { return this.sourceLine; }
            set { this.sourceLine = value; }
        }
 
        /// <summary>
        /// Access an annotation which may have been attached to this node.
        /// </summary>
        public object Annotation {
            get { return this.annotation; }
            set { this.annotation = value; }
        }
 
        /// <summary>
        /// Create a new deep copy of this node.
        /// </summary>
        public virtual QilNode DeepClone(QilFactory f) {
            return new QilCloneVisitor(f).Clone(this);
        }
 
        /// <summary>
        /// Create a shallow copy of this node, copying all the fields.
        /// </summary>
        public virtual QilNode ShallowClone(QilFactory f) {
            QilNode n = (QilNode) MemberwiseClone();
            f.TraceNode(n);
            return n;
        }
 
 
        //-----------------------------------------------
        // IList<QilNode> methods -- override
        //-----------------------------------------------
 
        public virtual int Count {
            get { return 0; }
        }
 
        public virtual QilNode this[int index] {
            get { throw new IndexOutOfRangeException(); }
            set { throw new IndexOutOfRangeException(); }
        }
 
        public virtual void Insert(int index, QilNode node) {
            throw new NotSupportedException();
        }
 
        public virtual void RemoveAt(int index) {
            throw new NotSupportedException();
        }
 
 
        //-----------------------------------------------
        // IList<QilNode> methods -- no need to override
        //-----------------------------------------------
 
        public IEnumerator<QilNode> GetEnumerator() {
            return new IListEnumerator<QilNode>(this);
        }
 
        IEnumerator IEnumerable.GetEnumerator() {
            return new IListEnumerator<QilNode>(this);
        }
 
        public virtual bool IsReadOnly {
            get { return false; }
        }
 
        public virtual void Add(QilNode node) {
            Insert(Count, node);
        }
 
        public virtual void Add(IList<QilNode> list) {
            for (int i = 0; i < list.Count; i++)
                Insert(Count, list[i]);
        }
 
        public virtual void Clear() {
            for (int index = Count - 1; index >= 0; index--)
                RemoveAt(index);
        }
 
        public virtual bool Contains(QilNode node) {
            return IndexOf(node) != -1;
        }
 
        public virtual void CopyTo(QilNode[] array, int index) {
            for (int i = 0; i < Count; i++)
                array[index + i] = this[i];
        }
 
        public virtual bool Remove(QilNode node) {
            int index = IndexOf(node);
            if (index >= 0) {
                RemoveAt(index);
                return true;
            }
            return false;
        }
 
        public virtual int IndexOf(QilNode node) {
            for (int i = 0; i < Count; i++)
                if (node.Equals(this[i]))
                    return i;
 
            return -1;
        }
 
 
        //-----------------------------------------------
        // Debug
        //-----------------------------------------------
 
#if QIL_TRACE_NODE_CREATION
        private int nodeId;
        private string nodeLoc;
 
        public int NodeId {
            get { return nodeId; }
            set { nodeId = value; }
        }
 
        public string NodeLocation {
            get { return nodeLoc; }
            set { nodeLoc = value; }
        }
#endif
    }
}