1 //------------------------------------------------------------------------------
2 // <copyright file="QilScopedVisitor.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">Microsoft</owner>
6 //------------------------------------------------------------------------------
8 using System.Collections.Generic;
10 namespace System.Xml.Xsl.Qil {
13 /// Adds iterator and function scoping to the QilVisitor implementation.
15 internal class QilScopedVisitor : QilVisitor {
17 //-----------------------------------------------
18 // QilScopedVisitor methods
19 //-----------------------------------------------
22 /// Called when a variable, parameter, or function enters scope.
24 protected virtual void BeginScope(QilNode node) {
28 /// Called when a variable, parameter, or function exits scope.
30 protected virtual void EndScope(QilNode node) {
34 /// Called at the beginning of Visit().
36 protected virtual void BeforeVisit(QilNode node) {
39 switch (node.NodeType) {
40 case QilNodeType.QilExpression:
41 // Put all global functions, variables, and parameters in scope
42 qil = (QilExpression) node;
43 foreach (QilNode param in qil.GlobalParameterList) BeginScope(param);
44 foreach (QilNode var in qil.GlobalVariableList) BeginScope(var);
45 foreach (QilNode func in qil.FunctionList) BeginScope(func);
48 case QilNodeType.Function:
49 // Put all formal arguments in scope
50 foreach (QilNode arg in ((QilFunction) node).Arguments) BeginScope(arg);
53 case QilNodeType.Loop:
54 case QilNodeType.Filter:
55 case QilNodeType.Sort:
56 // Put loop iterator in scope
57 BeginScope(((QilLoop) node).Variable);
63 /// Called at the end of Visit().
65 protected virtual void AfterVisit(QilNode node) {
68 switch (node.NodeType) {
69 case QilNodeType.QilExpression:
70 // Remove all global functions, variables, and parameters from scope
71 qil = (QilExpression) node;
72 foreach (QilNode func in qil.FunctionList) EndScope(func);
73 foreach (QilNode var in qil.GlobalVariableList) EndScope(var);
74 foreach (QilNode param in qil.GlobalParameterList) EndScope(param);
77 case QilNodeType.Function:
78 // Remove all formal arguments from scope
79 foreach (QilNode arg in ((QilFunction) node).Arguments) EndScope(arg);
82 case QilNodeType.Loop:
83 case QilNodeType.Filter:
84 case QilNodeType.Sort:
85 // Remove loop iterator in scope
86 EndScope(((QilLoop) node).Variable);
92 //-----------------------------------------------
93 // QilVisitor overrides
94 //-----------------------------------------------
97 /// Call BeforeVisit() and AfterVisit().
99 protected override QilNode Visit(QilNode n) {