| File: System\Xml\Xsl\QIL\QilExpression.cs | Web Access |
| Project: src\runtime\src\libraries\System.Private.Xml\src\System.Private.Xml.csproj (System.Private.Xml) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; using System.Xml.Xsl.Runtime; namespace System.Xml.Xsl.Qil { /// <summary> /// The CQR implementation of QilExpression. /// </summary> /// <remarks> /// <p>QilExpression is the XML Query Intermediate Language invented by Michael Brundage and Chris Suver. /// QilExpression is an intermediate representation (IR) for all XML query and view languages. QilExpression is /// designed for optimization, composition with virtual XML views, translation into other forms, /// and direct execution. See also <a href="http://dynamo/qil/qil.xml">the QIL specification</a>.</p> /// </remarks> internal sealed class QilExpression : QilNode { private QilFactory _factory; private QilNode _isDebug; private QilNode _defWSet; private QilNode _wsRules; private QilNode _gloVars; private QilNode _gloParams; private QilNode _earlBnd; private QilNode _funList; private QilNode _rootNod; /// <summary> /// Construct QIL from a rooted graph of QilNodes with a specific factory. /// </summary> public QilExpression(QilNodeType nodeType, QilNode root, QilFactory factory) : base(nodeType) { _factory = factory; _isDebug = factory.False(); XmlWriterSettings settings = new XmlWriterSettings(); settings.ConformanceLevel = ConformanceLevel.Auto; _defWSet = factory.LiteralObject(settings); _wsRules = factory.LiteralObject(new List<WhitespaceRule>()); _gloVars = factory.GlobalVariableList(); _gloParams = factory.GlobalParameterList(); _earlBnd = factory.LiteralObject(new List<EarlyBoundInfo>()); _funList = factory.FunctionList(); _rootNod = root; } //----------------------------------------------- // IList<QilNode> methods -- override //----------------------------------------------- public override int Count { get { return 8; } } public override QilNode this[int index] { get { return index switch { 0 => _isDebug, 1 => _defWSet, 2 => _wsRules, 3 => _gloParams, 4 => _gloVars, 5 => _earlBnd, 6 => _funList, 7 => _rootNod, _ => throw new IndexOutOfRangeException(), }; } set { switch (index) { case 0: _isDebug = value; break; case 1: _defWSet = value; break; case 2: _wsRules = value; break; case 3: _gloParams = value; break; case 4: _gloVars = value; break; case 5: _earlBnd = value; break; case 6: _funList = value; break; case 7: _rootNod = value; break; default: throw new IndexOutOfRangeException(); } } } //----------------------------------------------- // QilExpression methods //----------------------------------------------- /// <summary> /// QilFactory to be used in constructing nodes in this graph. /// </summary> public QilFactory Factory { get { return _factory; } set { _factory = value; } } /// <summary> /// True if this expression contains debugging information. /// </summary> public bool IsDebug { get { return _isDebug.NodeType == QilNodeType.True; } set { _isDebug = value ? _factory.True() : _factory.False(); } } /// <summary> /// Default serialization options that will be used if the user does not supply a writer at execution time. /// </summary> public XmlWriterSettings DefaultWriterSettings { get { return (XmlWriterSettings)((QilLiteral)_defWSet).Value!; } set { value.ReadOnly = true; ((QilLiteral)_defWSet).Value = value; } } /// <summary> /// Xslt whitespace strip/preserve rules. /// </summary> public IList<WhitespaceRule> WhitespaceRules { get { return (IList<WhitespaceRule>)((QilLiteral)_wsRules).Value!; } set { ((QilLiteral)_wsRules).Value = value; } } /// <summary> /// External parameters. /// </summary> public QilList GlobalParameterList { get { return (QilList)_gloParams; } set { _gloParams = value; } } /// <summary> /// Global variables. /// </summary> public QilList GlobalVariableList { get { return (QilList)_gloVars; } set { _gloVars = value; } } /// <summary> /// Early bound function objects. /// </summary> public IList<EarlyBoundInfo> EarlyBoundTypes { get { return (IList<EarlyBoundInfo>)((QilLiteral)_earlBnd).Value!; } set { ((QilLiteral)_earlBnd).Value = value; } } /// <summary> /// Function definitions. /// </summary> public QilList FunctionList { get { return (QilList)_funList; } set { _funList = value; } } /// <summary> /// The root node of the QilExpression graph /// </summary> public QilNode Root { get { return _rootNod; } set { _rootNod = value; } } } }