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

  1. //------------------------------------------------------------------------------
  2. // <copyright file="QilPatternVisitor.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.Xml;
  20. using System.Xml.Schema;
  21. using System.Xml.Xsl;
  22. namespace System.Xml.Xsl.Qil
  23. {
  24.    
  25.     /// <summary>
  26.     /// Pattern visitor base internal class
  27.     /// </summary>
  28.     internal abstract class QilPatternVisitor : QilReplaceVisitor
  29.     {
  30.         private QilPatterns patterns;
  31.         private int replacementCnt;
  32.         private int lastReplacement;
  33.         private int threshold = Int32.MaxValue;
  34.        
  35.         /// <summary>
  36.         /// Constructor.
  37.         /// </summary>
  38.         public QilPatternVisitor(QilPatterns patterns, QilFactory f) : base(f)
  39.         {
  40.             Patterns = patterns;
  41.         }
  42.        
  43.         public QilPatterns Patterns {
  44.             get { return this.patterns; }
  45.             set { this.patterns = value; }
  46.         }
  47.        
  48.         public int Threshold {
  49.             get { return this.threshold; }
  50.             set { this.threshold = value; }
  51.         }
  52.        
  53.         public int ReplacementCount {
  54.             get { return this.replacementCnt; }
  55.         }
  56.        
  57.         public int LastReplacement {
  58.             get { return this.lastReplacement; }
  59.         }
  60.        
  61.         public bool Matching {
  62.             get { return ReplacementCount < Threshold; }
  63.         }
  64.        
  65.         /// <summary>
  66.         /// Called when a pattern has matched, but before the replacement code is executed. If this
  67.         /// method returns false, then the replacement code is skipped.
  68.         /// </summary>
  69.         protected virtual bool AllowReplace(int pattern, QilNode original)
  70.         {
  71.             // If still matching patterns,
  72.             if (Matching) {
  73.                 // Increment the replacement count
  74.                 this.replacementCnt++;
  75.                
  76.                 // Save the id of this pattern in case it's the last
  77.                 this.lastReplacement = pattern;
  78.                
  79.                 return true;
  80.             }
  81.            
  82.             return false;
  83.         }
  84.        
  85.         /// <summary>
  86.         /// Called when a pattern has matched and after replacement code is executed.
  87.         /// </summary>
  88.         protected virtual QilNode Replace(int pattern, QilNode original, QilNode replacement)
  89.         {
  90.             replacement.SourceLine = original.SourceLine;
  91.             return replacement;
  92.         }
  93.        
  94.         /// <summary>
  95.         /// Called when all replacements have already been made and all annotations are complete.
  96.         /// </summary>
  97.         protected virtual QilNode NoReplace(QilNode node)
  98.         {
  99.             return node;
  100.         }
  101.        
  102.        
  103.         //-----------------------------------------------
  104.         // QilVisitor overrides
  105.         //-----------------------------------------------
  106.        
  107.         /// <summary>
  108.         /// Visit children of this node first, then pattern match on the node itself.
  109.         /// </summary>
  110.         protected override QilNode Visit(QilNode node)
  111.         {
  112.             if (node == null)
  113.                 return VisitNull();
  114.            
  115.             node = VisitChildren(node);
  116.             return base.Visit(node);
  117.         }
  118.        
  119.         // Do not edit this region
  120.         #region AUTOGENERATED
  121.         #region meta
  122.         protected override QilNode VisitQilExpression(QilExpression n)
  123.         {
  124.             return NoReplace(n);
  125.         }
  126.         protected override QilNode VisitFunctionList(QilList n)
  127.         {
  128.             return NoReplace(n);
  129.         }
  130.         protected override QilNode VisitGlobalVariableList(QilList n)
  131.         {
  132.             return NoReplace(n);
  133.         }
  134.         protected override QilNode VisitGlobalParameterList(QilList n)
  135.         {
  136.             return NoReplace(n);
  137.         }
  138.         protected override QilNode VisitActualParameterList(QilList n)
  139.         {
  140.             return NoReplace(n);
  141.         }
  142.         protected override QilNode VisitFormalParameterList(QilList n)
  143.         {
  144.             return NoReplace(n);
  145.         }
  146.         protected override QilNode VisitSortKeyList(QilList n)
  147.         {
  148.             return NoReplace(n);
  149.         }
  150.         protected override QilNode VisitBranchList(QilList n)
  151.         {
  152.             return NoReplace(n);
  153.         }
  154.         protected override QilNode VisitOptimizeBarrier(QilUnary n)
  155.         {
  156.             return NoReplace(n);
  157.         }
  158.         protected override QilNode VisitUnknown(QilNode n)
  159.         {
  160.             return NoReplace(n);
  161.         }
  162.         #endregion
  163.        
  164.         #region specials
  165.         protected override QilNode VisitDataSource(QilDataSource n)
  166.         {
  167.             return NoReplace(n);
  168.         }
  169.         protected override QilNode VisitNop(QilUnary n)
  170.         {
  171.             return NoReplace(n);
  172.         }
  173.         protected override QilNode VisitError(QilUnary n)
  174.         {
  175.             return NoReplace(n);
  176.         }
  177.         protected override QilNode VisitWarning(QilUnary n)
  178.         {
  179.             return NoReplace(n);
  180.         }
  181.         #endregion
  182.        
  183.         #region variables
  184.         protected override QilNode VisitFor(QilIterator n)
  185.         {
  186.             return NoReplace(n);
  187.         }
  188.         protected override QilNode VisitForReference(QilIterator n)
  189.         {
  190.             return NoReplace(n);
  191.         }
  192.         protected override QilNode VisitLet(QilIterator n)
  193.         {
  194.             return NoReplace(n);
  195.         }
  196.         protected override QilNode VisitLetReference(QilIterator n)
  197.         {
  198.             return NoReplace(n);
  199.         }
  200.         protected override QilNode VisitParameter(QilParameter n)
  201.         {
  202.             return NoReplace(n);
  203.         }
  204.         protected override QilNode VisitParameterReference(QilParameter n)
  205.         {
  206.             return NoReplace(n);
  207.         }
  208.         protected override QilNode VisitPositionOf(QilUnary n)
  209.         {
  210.             return NoReplace(n);
  211.         }
  212.         #endregion
  213.        
  214.         #region literals
  215.         protected override QilNode VisitTrue(QilNode n)
  216.         {
  217.             return NoReplace(n);
  218.         }
  219.         protected override QilNode VisitFalse(QilNode n)
  220.         {
  221.             return NoReplace(n);
  222.         }
  223.         protected override QilNode VisitLiteralString(QilLiteral n)
  224.         {
  225.             return NoReplace(n);
  226.         }
  227.         protected override QilNode VisitLiteralInt32(QilLiteral n)
  228.         {
  229.             return NoReplace(n);
  230.         }
  231.         protected override QilNode VisitLiteralInt64(QilLiteral n)
  232.         {
  233.             return NoReplace(n);
  234.         }
  235.         protected override QilNode VisitLiteralDouble(QilLiteral n)
  236.         {
  237.             return NoReplace(n);
  238.         }
  239.         protected override QilNode VisitLiteralDecimal(QilLiteral n)
  240.         {
  241.             return NoReplace(n);
  242.         }
  243.         protected override QilNode VisitLiteralQName(QilName n)
  244.         {
  245.             return NoReplace(n);
  246.         }
  247.         protected override QilNode VisitLiteralType(QilLiteral n)
  248.         {
  249.             return NoReplace(n);
  250.         }
  251.         protected override QilNode VisitLiteralObject(QilLiteral n)
  252.         {
  253.             return NoReplace(n);
  254.         }
  255.         #endregion
  256.        
  257.         #region boolean operators
  258.         protected override QilNode VisitAnd(QilBinary n)
  259.         {
  260.             return NoReplace(n);
  261.         }
  262.         protected override QilNode VisitOr(QilBinary n)
  263.         {
  264.             return NoReplace(n);
  265.         }
  266.         protected override QilNode VisitNot(QilUnary n)
  267.         {
  268.             return NoReplace(n);
  269.         }
  270.         #endregion
  271.        
  272.         #region choice
  273.         protected override QilNode VisitConditional(QilTernary n)
  274.         {
  275.             return NoReplace(n);
  276.         }
  277.         protected override QilNode VisitChoice(QilChoice n)
  278.         {
  279.             return NoReplace(n);
  280.         }
  281.         #endregion
  282.        
  283.         #region collection operators
  284.         protected override QilNode VisitLength(QilUnary n)
  285.         {
  286.             return NoReplace(n);
  287.         }
  288.         protected override QilNode VisitSequence(QilList n)
  289.         {
  290.             return NoReplace(n);
  291.         }
  292.         protected override QilNode VisitUnion(QilBinary n)
  293.         {
  294.             return NoReplace(n);
  295.         }
  296.         protected override QilNode VisitIntersection(QilBinary n)
  297.         {
  298.             return NoReplace(n);
  299.         }
  300.         protected override QilNode VisitDifference(QilBinary n)
  301.         {
  302.             return NoReplace(n);
  303.         }
  304.         protected override QilNode VisitAverage(QilUnary n)
  305.         {
  306.             return NoReplace(n);
  307.         }
  308.         protected override QilNode VisitSum(QilUnary n)
  309.         {
  310.             return NoReplace(n);
  311.         }
  312.         protected override QilNode VisitMinimum(QilUnary n)
  313.         {
  314.             return NoReplace(n);
  315.         }
  316.         protected override QilNode VisitMaximum(QilUnary n)
  317.         {
  318.             return NoReplace(n);
  319.         }
  320.         #endregion
  321.        
  322.         #region arithmetic operators
  323.         protected override QilNode VisitNegate(QilUnary n)
  324.         {
  325.             return NoReplace(n);
  326.         }
  327.         protected override QilNode VisitAdd(QilBinary n)
  328.         {
  329.             return NoReplace(n);
  330.         }
  331.         protected override QilNode VisitSubtract(QilBinary n)
  332.         {
  333.             return NoReplace(n);
  334.         }
  335.         protected override QilNode VisitMultiply(QilBinary n)
  336.         {
  337.             return NoReplace(n);
  338.         }
  339.         protected override QilNode VisitDivide(QilBinary n)
  340.         {
  341.             return NoReplace(n);
  342.         }
  343.         protected override QilNode VisitModulo(QilBinary n)
  344.         {
  345.             return NoReplace(n);
  346.         }
  347.         #endregion
  348.        
  349.         #region string operators
  350.         protected override QilNode VisitStrLength(QilUnary n)
  351.         {
  352.             return NoReplace(n);
  353.         }
  354.         protected override QilNode VisitStrConcat(QilStrConcat n)
  355.         {
  356.             return NoReplace(n);
  357.         }
  358.         protected override QilNode VisitStrParseQName(QilBinary n)
  359.         {
  360.             return NoReplace(n);
  361.         }
  362.         #endregion
  363.        
  364.         #region value comparison operators
  365.         protected override QilNode VisitNe(QilBinary n)
  366.         {
  367.             return NoReplace(n);
  368.         }
  369.         protected override QilNode VisitEq(QilBinary n)
  370.         {
  371.             return NoReplace(n);
  372.         }
  373.         protected override QilNode VisitGt(QilBinary n)
  374.         {
  375.             return NoReplace(n);
  376.         }
  377.         protected override QilNode VisitGe(QilBinary n)
  378.         {
  379.             return NoReplace(n);
  380.         }
  381.         protected override QilNode VisitLt(QilBinary n)
  382.         {
  383.             return NoReplace(n);
  384.         }
  385.         protected override QilNode VisitLe(QilBinary n)
  386.         {
  387.             return NoReplace(n);
  388.         }
  389.         #endregion
  390.        
  391.         #region node comparison operators
  392.         protected override QilNode VisitIs(QilBinary n)
  393.         {
  394.             return NoReplace(n);
  395.         }
  396.         protected override QilNode VisitAfter(QilBinary n)
  397.         {
  398.             return NoReplace(n);
  399.         }
  400.         protected override QilNode VisitBefore(QilBinary n)
  401.         {
  402.             return NoReplace(n);
  403.         }
  404.         #endregion
  405.        
  406.         #region loops
  407.         protected override QilNode VisitLoop(QilLoop n)
  408.         {
  409.             return NoReplace(n);
  410.         }
  411.         protected override QilNode VisitFilter(QilLoop n)
  412.         {
  413.             return NoReplace(n);
  414.         }
  415.         #endregion
  416.        
  417.         #region sorting
  418.         protected override QilNode VisitSort(QilLoop n)
  419.         {
  420.             return NoReplace(n);
  421.         }
  422.         protected override QilNode VisitSortKey(QilSortKey n)
  423.         {
  424.             return NoReplace(n);
  425.         }
  426.         protected override QilNode VisitDocOrderDistinct(QilUnary n)
  427.         {
  428.             return NoReplace(n);
  429.         }
  430.         #endregion
  431.        
  432.         #region function definition and invocation
  433.         protected override QilNode VisitFunction(QilFunction n)
  434.         {
  435.             return NoReplace(n);
  436.         }
  437.         protected override QilNode VisitFunctionReference(QilFunction n)
  438.         {
  439.             return NoReplace(n);
  440.         }
  441.         protected override QilNode VisitInvoke(QilInvoke n)
  442.         {
  443.             return NoReplace(n);
  444.         }
  445.         #endregion
  446.        
  447.         #region XML navigation
  448.         protected override QilNode VisitContent(QilUnary n)
  449.         {
  450.             return NoReplace(n);
  451.         }
  452.         protected override QilNode VisitAttribute(QilBinary n)
  453.         {
  454.             return NoReplace(n);
  455.         }
  456.         protected override QilNode VisitParent(QilUnary n)
  457.         {
  458.             return NoReplace(n);
  459.         }
  460.         protected override QilNode VisitRoot(QilUnary n)
  461.         {
  462.             return NoReplace(n);
  463.         }
  464.         protected override QilNode VisitXmlContext(QilNode n)
  465.         {
  466.             return NoReplace(n);
  467.         }
  468.         protected override QilNode VisitDescendant(QilUnary n)
  469.         {
  470.             return NoReplace(n);
  471.         }
  472.         protected override QilNode VisitDescendantOrSelf(QilUnary n)
  473.         {
  474.             return NoReplace(n);
  475.         }
  476.         protected override QilNode VisitAncestor(QilUnary n)
  477.         {
  478.             return NoReplace(n);
  479.         }
  480.         protected override QilNode VisitAncestorOrSelf(QilUnary n)
  481.         {
  482.             return NoReplace(n);
  483.         }
  484.         protected override QilNode VisitPreceding(QilUnary n)
  485.         {
  486.             return NoReplace(n);
  487.         }
  488.         protected override QilNode VisitFollowingSibling(QilUnary n)
  489.         {
  490.             return NoReplace(n);
  491.         }
  492.         protected override QilNode VisitPrecedingSibling(QilUnary n)
  493.         {
  494.             return NoReplace(n);
  495.         }
  496.         protected override QilNode VisitNodeRange(QilBinary n)
  497.         {
  498.             return NoReplace(n);
  499.         }
  500.         protected override QilNode VisitDeref(QilBinary n)
  501.         {
  502.             return NoReplace(n);
  503.         }
  504.         #endregion
  505.        
  506.         #region XML construction
  507.         protected override QilNode VisitElementCtor(QilBinary n)
  508.         {
  509.             return NoReplace(n);
  510.         }
  511.         protected override QilNode VisitAttributeCtor(QilBinary n)
  512.         {
  513.             return NoReplace(n);
  514.         }
  515.         protected override QilNode VisitCommentCtor(QilUnary n)
  516.         {
  517.             return NoReplace(n);
  518.         }
  519.         protected override QilNode VisitPICtor(QilBinary n)
  520.         {
  521.             return NoReplace(n);
  522.         }
  523.         protected override QilNode VisitTextCtor(QilUnary n)
  524.         {
  525.             return NoReplace(n);
  526.         }
  527.         protected override QilNode VisitRawTextCtor(QilUnary n)
  528.         {
  529.             return NoReplace(n);
  530.         }
  531.         protected override QilNode VisitDocumentCtor(QilUnary n)
  532.         {
  533.             return NoReplace(n);
  534.         }
  535.         protected override QilNode VisitNamespaceDecl(QilBinary n)
  536.         {
  537.             return NoReplace(n);
  538.         }
  539.         protected override QilNode VisitRtfCtor(QilBinary n)
  540.         {
  541.             return NoReplace(n);
  542.         }
  543.         #endregion
  544.        
  545.         #region Node properties
  546.         protected override QilNode VisitNameOf(QilUnary n)
  547.         {
  548.             return NoReplace(n);
  549.         }
  550.         protected override QilNode VisitLocalNameOf(QilUnary n)
  551.         {
  552.             return NoReplace(n);
  553.         }
  554.         protected override QilNode VisitNamespaceUriOf(QilUnary n)
  555.         {
  556.             return NoReplace(n);
  557.         }
  558.         protected override QilNode VisitPrefixOf(QilUnary n)
  559.         {
  560.             return NoReplace(n);
  561.         }
  562.         #endregion
  563.        
  564.         #region Type operators
  565.         protected override QilNode VisitTypeAssert(QilTargetType n)
  566.         {
  567.             return NoReplace(n);
  568.         }
  569.         protected override QilNode VisitIsType(QilTargetType n)
  570.         {
  571.             return NoReplace(n);
  572.         }
  573.         protected override QilNode VisitIsEmpty(QilUnary n)
  574.         {
  575.             return NoReplace(n);
  576.         }
  577.         #endregion
  578.        
  579.         #region XPath operators
  580.         protected override QilNode VisitXPathNodeValue(QilUnary n)
  581.         {
  582.             return NoReplace(n);
  583.         }
  584.         protected override QilNode VisitXPathFollowing(QilUnary n)
  585.         {
  586.             return NoReplace(n);
  587.         }
  588.         protected override QilNode VisitXPathPreceding(QilUnary n)
  589.         {
  590.             return NoReplace(n);
  591.         }
  592.         protected override QilNode VisitXPathNamespace(QilUnary n)
  593.         {
  594.             return NoReplace(n);
  595.         }
  596.         #endregion
  597.        
  598.         #region XSLT
  599.         protected override QilNode VisitXsltGenerateId(QilUnary n)
  600.         {
  601.             return NoReplace(n);
  602.         }
  603.         protected override QilNode VisitXsltInvokeLateBound(QilInvokeLateBound n)
  604.         {
  605.             return NoReplace(n);
  606.         }
  607.         protected override QilNode VisitXsltInvokeEarlyBound(QilInvokeEarlyBound n)
  608.         {
  609.             return NoReplace(n);
  610.         }
  611.         protected override QilNode VisitXsltCopy(QilBinary n)
  612.         {
  613.             return NoReplace(n);
  614.         }
  615.         protected override QilNode VisitXsltCopyOf(QilUnary n)
  616.         {
  617.             return NoReplace(n);
  618.         }
  619.         protected override QilNode VisitXsltConvert(QilTargetType n)
  620.         {
  621.             return NoReplace(n);
  622.         }
  623.         #endregion
  624.        
  625.         #endregion
  626.        
  627.        
  628.         //-----------------------------------------------
  629.         // Helper methods
  630.         //-----------------------------------------------
  631.        
  632.         /// <summary>
  633.         /// A bit vector holding a set of rewrites.
  634.         /// </summary>
  635.         internal sealed class QilPatterns
  636.         {
  637.             private BitArray bits;
  638.            
  639.             private QilPatterns(QilPatterns toCopy)
  640.             {
  641.                 this.bits = new BitArray(toCopy.bits);
  642.             }
  643.             public QilPatterns(int szBits, bool allSet)
  644.             {
  645.                 this.bits = new BitArray(szBits, allSet);
  646.             }
  647.             public QilPatterns Clone()
  648.             {
  649.                 return new QilPatterns(this);
  650.             }
  651.             public void ClearAll()
  652.             {
  653.                 this.bits.SetAll(false);
  654.             }
  655.             public void Add(int i)
  656.             {
  657.                 this.bits.Set(i, true);
  658.             }
  659.             public bool IsSet(int i)
  660.             {
  661.                 return this.bits[i];
  662.             }
  663.            
  664.         }
  665.     }
  666. }

Developer Fusion