The Labs \ Source Viewer \ SSCLI \ System.Xml.Xsl.XPath \ XPathContext

  1. //------------------------------------------------------------------------------
  2. // <copyright file="XPathContext.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. #if DontUse
  16. // XPathContext is not used any more but comments in it and Replacer visitor may be used to
  17. // optimize code XSLT generates on last().
  18. using System;
  19. using System.Diagnostics;
  20. using System.Collections;
  21. using System.Xml;
  22. using System.Xml.XPath;
  23. using MS.Internal.Xml;
  24. namespace System.Xml.Xsl.XPath
  25. {
  26.    
  27.     internal class XPathContext
  28.     {
  29.         //
  30.         //
  31.         //
  32.         //
  33.         //
  34.        
  35.        
  36.         public static QilNode GetCurrentNode(QilTuple context)
  37.         {
  38.             Debug.Assert(context != null);
  39.             Debug.Assert(GetTuple(context).For.Type == QilNodeType.For);
  40.             return GetTuple(context).For;
  41.         }
  42.        
  43.         public static QilNode GetCurrentPosition(QilFactory f, QilTuple context)
  44.         {
  45.             Debug.Assert(context != null);
  46.             if (context.Where.Type != QilNodeType.True) {
  47.                 Debug.Assert(context.For.Type == QilNodeType.For);
  48.                 // convert context (1) --> (2)
  49.                 QilIterator for2 = f.For(context.For.Binding);
  50.                     /*inExpr:*/                    /*from:*/                    /*to:*/                QilNode cnd2 = new Replacer(f).Replace(context.Where, context.For, for2);
  51.                 context.For.Binding = f.OldTuple(for2, cnd2, for2);
  52.                 context.Where = f.True();
  53.             }
  54.             return f.Convert(f.PositionOf((QilIterator)XPathContext.GetCurrentNode(context)), f.TypeFactory.Double());
  55.         }
  56.        
  57.         public static QilNode GetLastPosition(QilFactory f, QilTuple context)
  58.         {
  59.             return f.Convert(f.Length(context.Clone(f)), f.TypeFactory.Double());
  60.         }
  61.        
  62.         public static QilTuple GetTuple(QilTuple context)
  63.         {
  64.             Debug.Assert(context != null);
  65.             if (context.For.Type == QilNodeType.Let) {
  66.                 Debug.Assert(context.Where.Type == QilNodeType.True);
  67.                 Debug.Assert(context.Return.Type == QilNodeType.OldTuple);
  68.                 return (QilTuple)context.Return;
  69.             }
  70.             return context;
  71.         }
  72.        
  73.         private class Replacer : QilActiveVisitor
  74.         {
  75.             QilIterator from, to;
  76.            
  77.             public Replacer(QilFactory f) : base(f)
  78.             {
  79.             }
  80.            
  81.             public QilNode Replace(QilNode inExpr, QilIterator from, QilIterator to)
  82.             {
  83.                 this.from = from;
  84.                 this.to = to;
  85.                 return Visit(inExpr);
  86.             }
  87.            
  88.             protected override QilNode VisitClassReference(QilNode it)
  89.             {
  90.                 if (it == from) {
  91.                     return to;
  92.                 }
  93.                 return it;
  94.             }
  95.         }
  96.     }
  97. }
  98. #endif

Developer Fusion