2016-08-03 10:59:49 +00:00
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// <copyright file="QilNode.cs" company="Microsoft">
|
|
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
// </copyright>
|
2017-08-21 15:34:15 +00:00
|
|
|
// <owner current="true" primary="true">Microsoft</owner>
|
2016-08-03 10:59:49 +00:00
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
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
|
|
|
|
}
|
|
|
|
}
|