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

  1. //------------------------------------------------------------------------------
  2. // <copyright file="QilScopedVisitor.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.Generic;
  17. namespace System.Xml.Xsl.Qil
  18. {
  19.    
  20.     /// <summary>
  21.     /// Adds iterator and function scoping to the QilVisitor implementation.
  22.     /// </summary>
  23.     internal class QilScopedVisitor : QilVisitor
  24.     {
  25.        
  26.         //-----------------------------------------------
  27.         // QilScopedVisitor methods
  28.         //-----------------------------------------------
  29.        
  30.         /// <summary>
  31.         /// Called when a variable, parameter, or function enters scope.
  32.         /// </summary>
  33.         protected virtual void BeginScope(QilNode node)
  34.         {
  35.         }
  36.        
  37.         /// <summary>
  38.         /// Called when a variable, parameter, or function exits scope.
  39.         /// </summary>
  40.         protected virtual void EndScope(QilNode node)
  41.         {
  42.         }
  43.        
  44.         /// <summary>
  45.         /// Called at the beginning of Visit().
  46.         /// </summary>
  47.         protected virtual void BeforeVisit(QilNode node)
  48.         {
  49.             QilExpression qil;
  50.            
  51.             switch (node.NodeType) {
  52.                 case QilNodeType.QilExpression:
  53.                     // Put all global functions, variables, and parameters in scope
  54.                     qil = (QilExpression)node;
  55.                     foreach (QilNode param in qil.GlobalParameterList)
  56.                         BeginScope(param);
  57.                     foreach (QilNode var in qil.GlobalVariableList)
  58.                         BeginScope(var);
  59.                     foreach (QilNode func in qil.FunctionList)
  60.                         BeginScope(func);
  61.                     break;
  62.                 case QilNodeType.Function:
  63.                    
  64.                     // Put all formal arguments in scope
  65.                     foreach (QilNode arg in ((QilFunction)node).Arguments)
  66.                         BeginScope(arg);
  67.                     break;
  68.                 case QilNodeType.Loop:
  69.                 case QilNodeType.Filter:
  70.                 case QilNodeType.Sort:
  71.                    
  72.                     // Put loop iterator in scope
  73.                     BeginScope(((QilLoop)node).Variable);
  74.                     break;
  75.             }
  76.         }
  77.        
  78.         /// <summary>
  79.         /// Called at the end of Visit().
  80.         /// </summary>
  81.         protected virtual void AfterVisit(QilNode node)
  82.         {
  83.             QilExpression qil;
  84.            
  85.             switch (node.NodeType) {
  86.                 case QilNodeType.QilExpression:
  87.                     // Remove all global functions, variables, and parameters from scope
  88.                     qil = (QilExpression)node;
  89.                     foreach (QilNode func in qil.FunctionList)
  90.                         EndScope(func);
  91.                     foreach (QilNode var in qil.GlobalVariableList)
  92.                         EndScope(var);
  93.                     foreach (QilNode param in qil.GlobalParameterList)
  94.                         EndScope(param);
  95.                     break;
  96.                 case QilNodeType.Function:
  97.                    
  98.                     // Remove all formal arguments from scope
  99.                     foreach (QilNode arg in ((QilFunction)node).Arguments)
  100.                         EndScope(arg);
  101.                     break;
  102.                 case QilNodeType.Loop:
  103.                 case QilNodeType.Filter:
  104.                 case QilNodeType.Sort:
  105.                    
  106.                     // Remove loop iterator in scope
  107.                     EndScope(((QilLoop)node).Variable);
  108.                     break;
  109.             }
  110.         }
  111.        
  112.        
  113.         //-----------------------------------------------
  114.         // QilVisitor overrides
  115.         //-----------------------------------------------
  116.        
  117.         /// <summary>
  118.         /// Call BeforeVisit() and AfterVisit().
  119.         /// </summary>
  120.         protected override QilNode Visit(QilNode n)
  121.         {
  122.             QilNode ret;
  123.             BeforeVisit(n);
  124.             ret = base.Visit(n);
  125.             AfterVisit(n);
  126.             return ret;
  127.         }
  128.     }
  129. }

Developer Fusion