The Labs \ Source Viewer \ SSCLI \ System.Xml.Xsl.Qil \ QilNode

  1. //------------------------------------------------------------------------------
  2. // <copyright file="QilNode.cs" company="Microsoft">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. using System;
  16. using System.Collections;
  17. using System.Collections.Generic;
  18. using System.Diagnostics;
  19. using System.Globalization;
  20. using System.Xml;
  21. using System.Xml.Schema;
  22. using System.Xml.Xsl;
  23. namespace System.Xml.Xsl.Qil
  24. {
  25.    
  26.     /// <summary>
  27.     /// A node in the QIL tree.
  28.     /// </summary>
  29.     /// <remarks>
  30.     /// Don't construct QIL nodes directly; instead, use the <see cref="QilFactory">QilFactory</see>.
  31.     /// This base internal class is not abstract and may be instantiated in some cases (for example, true/false boolean literals).
  32.     /// </remarks>
  33.     internal class QilNode : IList<QilNode>
  34.     {
  35.         protected QilNodeType nodeType;
  36.         protected XmlQueryType xmlType;
  37.         protected ISourceLineInfo sourceLine;
  38.         protected object annotation;
  39.        
  40.         //-----------------------------------------------
  41.         // Constructor
  42.         //-----------------------------------------------
  43.        
  44.         /// <summary>
  45.         /// Construct a new node
  46.         /// </summary>
  47.         public QilNode(QilNodeType nodeType)
  48.         {
  49.             this.nodeType = nodeType;
  50.         }
  51.        
  52.         /// <summary>
  53.         /// Construct a new node
  54.         /// </summary>
  55.         public QilNode(QilNodeType nodeType, XmlQueryType xmlType)
  56.         {
  57.             this.nodeType = nodeType;
  58.             this.xmlType = xmlType;
  59.         }
  60.        
  61.        
  62.         //-----------------------------------------------
  63.         // QilNode methods
  64.         //-----------------------------------------------
  65.        
  66.         /// <summary>
  67.         /// Access the QIL node type.
  68.         /// </summary>
  69.         public QilNodeType NodeType {
  70.             get { return this.nodeType; }
  71.             set { this.nodeType = value; }
  72.         }
  73.        
  74.         /// <summary>
  75.         /// Access the QIL type.
  76.         /// </summary>
  77.         public virtual XmlQueryType XmlType {
  78.             get { return this.xmlType; }
  79.             set { this.xmlType = value; }
  80.         }
  81.        
  82.         /// <summary>
  83.         /// Line info information for tools support.
  84.         /// </summary>
  85.         public ISourceLineInfo SourceLine {
  86.             get { return this.sourceLine; }
  87.             set { this.sourceLine = value; }
  88.         }
  89.        
  90.         /// <summary>
  91.         /// Access an annotation which may have been attached to this node.
  92.         /// </summary>
  93.         public object Annotation {
  94.             get { return this.annotation; }
  95.             set { this.annotation = value; }
  96.         }
  97.        
  98.         /// <summary>
  99.         /// Create a new deep copy of this node.
  100.         /// </summary>
  101.         public virtual QilNode DeepClone(QilFactory f)
  102.         {
  103.             return new QilCloneVisitor(f).Clone(this);
  104.         }
  105.        
  106.         /// <summary>
  107.         /// Create a shallow copy of this node, copying all the fields.
  108.         /// </summary>
  109.         public virtual QilNode ShallowClone(QilFactory f)
  110.         {
  111.             QilNode n = (QilNode)MemberwiseClone();
  112.             f.TraceNode(n);
  113.             return n;
  114.         }
  115.        
  116.        
  117.         //-----------------------------------------------
  118.         // IList<QilNode> methods -- override
  119.         //-----------------------------------------------
  120.        
  121.         public virtual int Count {
  122.             get { return 0; }
  123.         }
  124.        
  125.         public virtual QilNode this[int index]
  126.         {
  127.             get {
  128.                 throw new IndexOutOfRangeException();
  129.             }
  130.             set {
  131.                 throw new IndexOutOfRangeException();
  132.             }
  133.         }
  134.        
  135.         public virtual void Insert(int index, QilNode node)
  136.         {
  137.             throw new NotSupportedException();
  138.         }
  139.        
  140.         public virtual void RemoveAt(int index)
  141.         {
  142.             throw new NotSupportedException();
  143.         }
  144.        
  145.        
  146.         //-----------------------------------------------
  147.         // IList<QilNode> methods -- no need to override
  148.         //-----------------------------------------------
  149.        
  150.         public IEnumerator<QilNode> GetEnumerator()
  151.         {
  152.             return new IListEnumerator<QilNode>(this);
  153.         }
  154.        
  155.         IEnumerator IEnumerable.GetEnumerator()
  156.         {
  157.             return new IListEnumerator<QilNode>(this);
  158.         }
  159.        
  160.         public virtual bool IsReadOnly {
  161.             get { return false; }
  162.         }
  163.        
  164.         public virtual void Add(QilNode node)
  165.         {
  166.             Insert(Count, node);
  167.         }
  168.        
  169.         public virtual void Add(IList<QilNode> list)
  170.         {
  171.             for (int i = 0; i < list.Count; i++)
  172.                 Insert(Count, list[i]);
  173.         }
  174.        
  175.         public virtual void Clear()
  176.         {
  177.             for (int index = Count - 1; index >= 0; index--)
  178.                 RemoveAt(index);
  179.         }
  180.        
  181.         public virtual bool Contains(QilNode node)
  182.         {
  183.             return IndexOf(node) != -1;
  184.         }
  185.        
  186.         public virtual void CopyTo(QilNode[] array, int index)
  187.         {
  188.             for (int i = 0; i < Count; i++)
  189.                 array[index + i] = this[i];
  190.         }
  191.        
  192.         public virtual bool Remove(QilNode node)
  193.         {
  194.             int index = IndexOf(node);
  195.             if (index >= 0) {
  196.                 RemoveAt(index);
  197.                 return true;
  198.             }
  199.             return false;
  200.         }
  201.        
  202.         public virtual int IndexOf(QilNode node)
  203.         {
  204.             for (int i = 0; i < Count; i++)
  205.                 if (node.Equals(this[i]))
  206.                     return i;
  207.            
  208.             return -1;
  209.         }
  210.        
  211.        
  212.         //-----------------------------------------------
  213.         // Debug
  214.         //-----------------------------------------------
  215.        
  216.         #if QIL_TRACE_NODE_CREATION
  217.         private int nodeId;
  218.         private string nodeLoc;
  219.        
  220.         public int NodeId {
  221.             get { return nodeId; }
  222.             set { nodeId = value; }
  223.         }
  224.        
  225.         public string NodeLocation {
  226.             get { return nodeLoc; }
  227.             set { nodeLoc = value; }
  228.         }
  229.         #endif
  230.     }
  231. }

Developer Fusion