2 // ExpressionVisitor.cs
5 // Jb Evain (jbevain@novell.com)
7 // (C) 2008 Novell, Inc. (http://www.novell.com)
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 using System.Collections.ObjectModel;
34 namespace System.Linq.Expressions {
36 abstract class ExpressionVisitor {
38 protected virtual void Visit (Expression expression)
40 if (expression == null)
43 switch (expression.NodeType) {
44 case ExpressionType.Negate:
45 case ExpressionType.NegateChecked:
46 case ExpressionType.Not:
47 case ExpressionType.Convert:
48 case ExpressionType.ConvertChecked:
49 case ExpressionType.ArrayLength:
50 case ExpressionType.Quote:
51 case ExpressionType.TypeAs:
52 case ExpressionType.UnaryPlus:
53 VisitUnary ((UnaryExpression) expression);
55 case ExpressionType.Add:
56 case ExpressionType.AddChecked:
57 case ExpressionType.Subtract:
58 case ExpressionType.SubtractChecked:
59 case ExpressionType.Multiply:
60 case ExpressionType.MultiplyChecked:
61 case ExpressionType.Divide:
62 case ExpressionType.Modulo:
63 case ExpressionType.Power:
64 case ExpressionType.And:
65 case ExpressionType.AndAlso:
66 case ExpressionType.Or:
67 case ExpressionType.OrElse:
68 case ExpressionType.LessThan:
69 case ExpressionType.LessThanOrEqual:
70 case ExpressionType.GreaterThan:
71 case ExpressionType.GreaterThanOrEqual:
72 case ExpressionType.Equal:
73 case ExpressionType.NotEqual:
74 case ExpressionType.Coalesce:
75 case ExpressionType.ArrayIndex:
76 case ExpressionType.RightShift:
77 case ExpressionType.LeftShift:
78 case ExpressionType.ExclusiveOr:
79 VisitBinary ((BinaryExpression) expression);
81 case ExpressionType.TypeIs:
82 VisitTypeIs ((TypeBinaryExpression) expression);
84 case ExpressionType.Conditional:
85 VisitConditional ((ConditionalExpression) expression);
87 case ExpressionType.Constant:
88 VisitConstant ((ConstantExpression) expression);
90 case ExpressionType.Parameter:
91 VisitParameter ((ParameterExpression) expression);
93 case ExpressionType.MemberAccess:
94 VisitMemberAccess ((MemberExpression) expression);
96 case ExpressionType.Call:
97 VisitMethodCall ((MethodCallExpression) expression);
99 case ExpressionType.Lambda:
100 VisitLambda ((LambdaExpression) expression);
102 case ExpressionType.New:
103 VisitNew ((NewExpression) expression);
105 case ExpressionType.NewArrayInit:
106 case ExpressionType.NewArrayBounds:
107 VisitNewArray ((NewArrayExpression) expression);
109 case ExpressionType.Invoke:
110 VisitInvocation ((InvocationExpression) expression);
112 case ExpressionType.MemberInit:
113 VisitMemberInit ((MemberInitExpression) expression);
115 case ExpressionType.ListInit:
116 VisitListInit ((ListInitExpression) expression);
119 throw new ArgumentException (string.Format ("Unhandled expression type: '{0}'", expression.NodeType));
123 protected virtual void VisitBinding (MemberBinding binding)
125 switch (binding.BindingType) {
126 case MemberBindingType.Assignment:
127 VisitMemberAssignment ((MemberAssignment) binding);
129 case MemberBindingType.MemberBinding:
130 VisitMemberMemberBinding ((MemberMemberBinding) binding);
132 case MemberBindingType.ListBinding:
133 VisitMemberListBinding ((MemberListBinding) binding);
136 throw new ArgumentException (string.Format ("Unhandled binding type '{0}'", binding.BindingType));
140 protected virtual void VisitElementInitializer (ElementInit initializer)
142 VisitExpressionList (initializer.Arguments);
145 protected virtual void VisitUnary (UnaryExpression unary)
147 Visit (unary.Operand);
150 protected virtual void VisitBinary (BinaryExpression binary)
153 Visit (binary.Right);
154 Visit (binary.Conversion);
157 protected virtual void VisitTypeIs (TypeBinaryExpression type)
159 Visit (type.Expression);
162 protected virtual void VisitConstant (ConstantExpression constant)
166 protected virtual void VisitConditional (ConditionalExpression conditional)
168 Visit (conditional.Test);
169 Visit (conditional.IfTrue);
170 Visit (conditional.IfFalse);
173 protected virtual void VisitParameter (ParameterExpression parameter)
177 protected virtual void VisitMemberAccess (MemberExpression member)
179 Visit (member.Expression);
182 protected virtual void VisitMethodCall (MethodCallExpression methodCall)
184 Visit (methodCall.Object);
185 VisitExpressionList (methodCall.Arguments);
188 protected virtual void VisitList<T> (ReadOnlyCollection<T> list, Action<T> visitor)
190 foreach (T element in list) {
195 protected virtual void VisitExpressionList (ReadOnlyCollection<Expression> list)
197 VisitList (list, Visit);
200 protected virtual void VisitMemberAssignment (MemberAssignment assignment)
202 Visit (assignment.Expression);
205 protected virtual void VisitMemberMemberBinding (MemberMemberBinding binding)
207 VisitBindingList (binding.Bindings);
210 protected virtual void VisitMemberListBinding (MemberListBinding binding)
212 VisitElementInitializerList (binding.Initializers);
215 protected virtual void VisitBindingList (ReadOnlyCollection<MemberBinding> list)
217 VisitList (list, VisitBinding);
220 protected virtual void VisitElementInitializerList (ReadOnlyCollection<ElementInit> list)
222 VisitList (list, VisitElementInitializer);
225 protected virtual void VisitLambda (LambdaExpression lambda)
230 protected virtual void VisitNew (NewExpression nex)
232 VisitExpressionList (nex.Arguments);
235 protected virtual void VisitMemberInit (MemberInitExpression init)
237 VisitNew (init.NewExpression);
238 VisitBindingList (init.Bindings);
241 protected virtual void VisitListInit (ListInitExpression init)
243 VisitNew (init.NewExpression);
244 VisitElementInitializerList (init.Initializers);
247 protected virtual void VisitNewArray (NewArrayExpression newArray)
249 VisitExpressionList (newArray.Expressions);
252 protected virtual void VisitInvocation (InvocationExpression invocation)
254 VisitExpressionList (invocation.Arguments);
255 Visit (invocation.Expression);