Hello,

Attached you'll find patches for CodeGenerator.cs and quite a few
System.CodeDom classes. Also included is a new file ICodeDomVisitor.cs
which belongs into System/System.CodeDom. ChangeLog entries are
included.

These patches replace those (ugly ones) I posted on Jan 6th. They
implement the Visitor pattern for the CodeGenerator (traverser) and the
classes in System.CodeDom (nodes to be visited)*. The result is much
nicer and faster code.

*) Thanks again Robert Jordan, for sketching out how to apply the
Visitor pattern to the CodeGenerator/CodeDom classes!

All unit tests pass.
Please review.

- Juraj
Index: System.dll.sources
===================================================================
--- System.dll.sources	(revision 92488)
+++ System.dll.sources	(working copy)
@@ -112,6 +112,7 @@
 System.CodeDom/CodeTypeReferenceOptions.cs
 System.CodeDom/CodeVariableDeclarationStatement.cs
 System.CodeDom/CodeVariableReferenceExpression.cs
+System.CodeDom/ICodeDomVisitor.cs
 System.CodeDom.Compiler/CodeCompiler.cs
 System.CodeDom.Compiler/CodeDomConfigurationHandler.cs
 System.CodeDom.Compiler/CodeDomProvider.cs
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 92488)
+++ ChangeLog	(working copy)
@@ -1,3 +1,7 @@
+2008-01-09  Juraj Skripsky  <[EMAIL PROTECTED]>
+
+	* System.dll.sources: Added ICodeDomVisitor.cs.
+
 2007-12-24  Gert Driesen  <[EMAIL PROTECTED]>
 
 	* System_test.dll.sources: Added CheckoutExceptionTest.cs.
Index: System.CodeDom/CodeEventReferenceExpression.cs
===================================================================
--- System.CodeDom/CodeEventReferenceExpression.cs	(revision 92488)
+++ System.CodeDom/CodeEventReferenceExpression.cs	(working copy)
@@ -76,5 +76,13 @@
 				targetObject = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeArgumentReferenceExpression.cs
===================================================================
--- System.CodeDom/CodeArgumentReferenceExpression.cs	(revision 92488)
+++ System.CodeDom/CodeArgumentReferenceExpression.cs	(working copy)
@@ -65,5 +65,13 @@
 				parameterName = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeAttachEventStatement.cs
===================================================================
--- System.CodeDom/CodeAttachEventStatement.cs	(revision 92488)
+++ System.CodeDom/CodeAttachEventStatement.cs	(working copy)
@@ -87,5 +87,13 @@
 				listener = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodePropertySetValueReferenceExpression.cs
===================================================================
--- System.CodeDom/CodePropertySetValueReferenceExpression.cs	(revision 92488)
+++ System.CodeDom/CodePropertySetValueReferenceExpression.cs	(working copy)
@@ -38,5 +38,12 @@
 	public class CodePropertySetValueReferenceExpression
 		: CodeExpression
 	{
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeDirectionExpression.cs
===================================================================
--- System.CodeDom/CodeDirectionExpression.cs	(revision 92488)
+++ System.CodeDom/CodeDirectionExpression.cs	(working copy)
@@ -76,5 +76,13 @@
 				expression = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeThisReferenceExpression.cs
===================================================================
--- System.CodeDom/CodeThisReferenceExpression.cs	(revision 92488)
+++ System.CodeDom/CodeThisReferenceExpression.cs	(working copy)
@@ -45,5 +45,13 @@
 		public CodeThisReferenceExpression()
 		{
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeMemberMethod.cs
===================================================================
--- System.CodeDom/CodeMemberMethod.cs	(revision 92488)
+++ System.CodeDom/CodeMemberMethod.cs	(working copy)
@@ -140,5 +140,13 @@
 		public event EventHandler PopulateParameters;
 
 		public event EventHandler PopulateStatements;
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeMemberProperty.cs
===================================================================
--- System.CodeDom/CodeMemberProperty.cs	(revision 92488)
+++ System.CodeDom/CodeMemberProperty.cs	(working copy)
@@ -133,5 +133,13 @@
 				type = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeEntryPointMethod.cs
===================================================================
--- System.CodeDom/CodeEntryPointMethod.cs	(revision 92488)
+++ System.CodeDom/CodeEntryPointMethod.cs	(working copy)
@@ -42,5 +42,13 @@
 		{
 			Attributes = MemberAttributes.Public | MemberAttributes.Static;
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeIndexerExpression.cs
===================================================================
--- System.CodeDom/CodeIndexerExpression.cs	(revision 92488)
+++ System.CodeDom/CodeIndexerExpression.cs	(working copy)
@@ -75,5 +75,13 @@
 				targetObject = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeIterationStatement.cs
===================================================================
--- System.CodeDom/CodeIterationStatement.cs	(revision 92488)
+++ System.CodeDom/CodeIterationStatement.cs	(working copy)
@@ -98,5 +98,13 @@
 				testExpression = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeRemoveEventStatement.cs
===================================================================
--- System.CodeDom/CodeRemoveEventStatement.cs	(revision 92488)
+++ System.CodeDom/CodeRemoveEventStatement.cs	(working copy)
@@ -86,6 +86,14 @@
 				listener = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
 
Index: System.CodeDom/CodeVariableReferenceExpression.cs
===================================================================
--- System.CodeDom/CodeVariableReferenceExpression.cs	(revision 92488)
+++ System.CodeDom/CodeVariableReferenceExpression.cs	(working copy)
@@ -65,5 +65,13 @@
 				variableName = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeTryCatchFinallyStatement.cs
===================================================================
--- System.CodeDom/CodeTryCatchFinallyStatement.cs	(revision 92488)
+++ System.CodeDom/CodeTryCatchFinallyStatement.cs	(working copy)
@@ -90,5 +90,13 @@
 				return catchClauses;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/ChangeLog
===================================================================
--- System.CodeDom/ChangeLog	(revision 92488)
+++ System.CodeDom/ChangeLog	(working copy)
@@ -1,3 +1,32 @@
+2008-01-09  Juraj Skripsky  <[EMAIL PROTECTED]>
+
+	* CodeObject.cs: Add empty Visit method implementation.
+	
+	* CodeArgumentReferenceExpression.cs, CodeArrayCreateExpression.cs,
+	CodeArrayIndexerExpression.cs, CodeAssignStatement.cs,
+	CodeAttachEventStatement.cs, CodeBaseReferenceExpression.cs,
+	CodeBinaryOperatorExpression.cs, CodeCastExpression.cs,
+	CodeCommentStatement.cs, CodeConditionStatement.cs,
+	CodeConstructor.cs, CodeDefaultValueExpression.cs,
+	CodeDelegateCreateExpression.cs, CodeDelegateInvokeExpression.cs,
+	CodeDirectionExpression.cs, CodeEntryPointMethod.cs,
+	CodeEventReferenceExpression.cs, CodeExpressionStatement.cs,
+	CodeFieldReferenceExpression.cs, CodeGotoStatement.cs,
+	CodeIndexerExpression.cs, CodeIterationStatement.cs,
+	CodeLabeledStatement.cs, CodeMemberEvent.cs,
+	CodeMemberField.cs, CodeMemberMethod.cs,
+	CodeMemberProperty.cs, CodeMethodInvokeExpression.cs,
+	CodeMethodReferenceExpression.cs, CodeMethodReturnStatement.cs,
+	CodeObjectCreateExpression.cs, CodeParameterDeclarationExpression.cs,
+	CodePrimitiveExpression.cs, CodePropertyReferenceExpression.cs,
+	CodePropertySetValueReferenceExpression.cs, CodeRemoveEventStatement.cs, 
+	CodeSnippetExpression.cs, CodeSnippetTypeMember.cs,
+	CodeThisReferenceExpression.cs, CodeThrowExceptionStatement.cs,
+	CodeTryCatchFinallyStatement.cs, CodeTypeConstructor.cs,
+	CodeTypeOfExpression.cs, CodeTypeReferenceExpression.cs,
+	CodeVariableDeclarationStatement.cs, CodeVariableReferenceExpression.cs:
+	Add Visit method implementation.
+
 2007-01-18  Atsushi Enomoto  <[EMAIL PROTECTED]>
 
 	* CodeTypeReference.cs :
Index: System.CodeDom/CodePrimitiveExpression.cs
===================================================================
--- System.CodeDom/CodePrimitiveExpression.cs	(revision 92488)
+++ System.CodeDom/CodePrimitiveExpression.cs	(working copy)
@@ -63,5 +63,13 @@
 				this.value = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeDefaultValueExpression.cs
===================================================================
--- System.CodeDom/CodeDefaultValueExpression.cs	(revision 92488)
+++ System.CodeDom/CodeDefaultValueExpression.cs	(working copy)
@@ -59,6 +59,14 @@
 			}
 			set { type = value; }
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
 
Index: System.CodeDom/CodeConditionStatement.cs
===================================================================
--- System.CodeDom/CodeConditionStatement.cs	(revision 92488)
+++ System.CodeDom/CodeConditionStatement.cs	(working copy)
@@ -94,5 +94,13 @@
 				return trueStatements;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
  	}
 }
Index: System.CodeDom/CodeSnippetTypeMember.cs
===================================================================
--- System.CodeDom/CodeSnippetTypeMember.cs	(revision 92488)
+++ System.CodeDom/CodeSnippetTypeMember.cs	(working copy)
@@ -65,5 +65,13 @@
 				text = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeDelegateCreateExpression.cs
===================================================================
--- System.CodeDom/CodeDelegateCreateExpression.cs	(revision 92488)
+++ System.CodeDom/CodeDelegateCreateExpression.cs	(working copy)
@@ -94,5 +94,13 @@
 				targetObject = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeMethodReferenceExpression.cs
===================================================================
--- System.CodeDom/CodeMethodReferenceExpression.cs	(revision 92488)
+++ System.CodeDom/CodeMethodReferenceExpression.cs	(working copy)
@@ -103,5 +103,13 @@
 			}
 		}
 #endif
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeTypeReferenceExpression.cs
===================================================================
--- System.CodeDom/CodeTypeReferenceExpression.cs	(revision 92488)
+++ System.CodeDom/CodeTypeReferenceExpression.cs	(working copy)
@@ -76,5 +76,13 @@
 				type = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeVariableDeclarationStatement.cs
===================================================================
--- System.CodeDom/CodeVariableDeclarationStatement.cs	(revision 92488)
+++ System.CodeDom/CodeVariableDeclarationStatement.cs	(working copy)
@@ -129,5 +129,13 @@
 				type = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeFieldReferenceExpression.cs
===================================================================
--- System.CodeDom/CodeFieldReferenceExpression.cs	(revision 92488)
+++ System.CodeDom/CodeFieldReferenceExpression.cs	(working copy)
@@ -76,5 +76,13 @@
 				targetObject = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeArrayCreateExpression.cs
===================================================================
--- System.CodeDom/CodeArrayCreateExpression.cs	(revision 92488)
+++ System.CodeDom/CodeArrayCreateExpression.cs	(working copy)
@@ -162,6 +162,14 @@
 				// null.
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
 
Index: System.CodeDom/CodePropertyReferenceExpression.cs
===================================================================
--- System.CodeDom/CodePropertyReferenceExpression.cs	(revision 92488)
+++ System.CodeDom/CodePropertyReferenceExpression.cs	(working copy)
@@ -78,5 +78,13 @@
 				targetObject = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeTypeConstructor.cs
===================================================================
--- System.CodeDom/CodeTypeConstructor.cs	(revision 92488)
+++ System.CodeDom/CodeTypeConstructor.cs	(working copy)
@@ -42,5 +42,13 @@
 		{
 			this.Name = ".cctor";
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeSnippetExpression.cs
===================================================================
--- System.CodeDom/CodeSnippetExpression.cs	(revision 92488)
+++ System.CodeDom/CodeSnippetExpression.cs	(working copy)
@@ -65,5 +65,13 @@
 				this.value = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeMethodReturnStatement.cs
===================================================================
--- System.CodeDom/CodeMethodReturnStatement.cs	(revision 92488)
+++ System.CodeDom/CodeMethodReturnStatement.cs	(working copy)
@@ -64,5 +64,13 @@
 				expression = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeParameterDeclarationExpression.cs
===================================================================
--- System.CodeDom/CodeParameterDeclarationExpression.cs	(revision 92488)
+++ System.CodeDom/CodeParameterDeclarationExpression.cs	(working copy)
@@ -113,5 +113,13 @@
 				type = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeObject.cs
===================================================================
--- System.CodeDom/CodeObject.cs	(revision 92488)
+++ System.CodeDom/CodeObject.cs	(working copy)
@@ -52,5 +52,10 @@
 				return userData;
 			}
 		}
+
+		internal virtual void Accept (ICodeDomVisitor visitor)
+		{
+			throw new NotImplementedException ();
+		}
 	}
 }
Index: System.CodeDom/CodeDelegateInvokeExpression.cs
===================================================================
--- System.CodeDom/CodeDelegateInvokeExpression.cs	(revision 92488)
+++ System.CodeDom/CodeDelegateInvokeExpression.cs	(working copy)
@@ -81,5 +81,13 @@
 				targetObject = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeThrowExceptionStatement.cs
===================================================================
--- System.CodeDom/CodeThrowExceptionStatement.cs	(revision 92488)
+++ System.CodeDom/CodeThrowExceptionStatement.cs	(working copy)
@@ -63,5 +63,13 @@
 				toThrow = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeObjectCreateExpression.cs
===================================================================
--- System.CodeDom/CodeObjectCreateExpression.cs	(revision 92488)
+++ System.CodeDom/CodeObjectCreateExpression.cs	(working copy)
@@ -91,5 +91,13 @@
 				return parameters;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeLabeledStatement.cs
===================================================================
--- System.CodeDom/CodeLabeledStatement.cs	(revision 92488)
+++ System.CodeDom/CodeLabeledStatement.cs	(working copy)
@@ -82,5 +82,13 @@
 				statement = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeArrayIndexerExpression.cs
===================================================================
--- System.CodeDom/CodeArrayIndexerExpression.cs	(revision 92488)
+++ System.CodeDom/CodeArrayIndexerExpression.cs	(working copy)
@@ -73,5 +73,13 @@
 				targetObject = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeBinaryOperatorExpression.cs
===================================================================
--- System.CodeDom/CodeBinaryOperatorExpression.cs	(revision 92488)
+++ System.CodeDom/CodeBinaryOperatorExpression.cs	(working copy)
@@ -86,5 +86,13 @@
 				right = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeExpressionStatement.cs
===================================================================
--- System.CodeDom/CodeExpressionStatement.cs	(revision 92488)
+++ System.CodeDom/CodeExpressionStatement.cs	(working copy)
@@ -63,5 +63,13 @@
 				expression = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeConstructor.cs
===================================================================
--- System.CodeDom/CodeConstructor.cs	(revision 92488)
+++ System.CodeDom/CodeConstructor.cs	(working copy)
@@ -70,5 +70,13 @@
 				return chainedConstructorArgs;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeTypeOfExpression.cs
===================================================================
--- System.CodeDom/CodeTypeOfExpression.cs	(revision 92488)
+++ System.CodeDom/CodeTypeOfExpression.cs	(working copy)
@@ -76,5 +76,13 @@
 				type = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeCommentStatement.cs
===================================================================
--- System.CodeDom/CodeCommentStatement.cs	(revision 92488)
+++ System.CodeDom/CodeCommentStatement.cs	(working copy)
@@ -74,5 +74,13 @@
 				comment = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeGotoStatement.cs
===================================================================
--- System.CodeDom/CodeGotoStatement.cs	(revision 92488)
+++ System.CodeDom/CodeGotoStatement.cs	(working copy)
@@ -68,5 +68,13 @@
 				label = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeMemberEvent.cs
===================================================================
--- System.CodeDom/CodeMemberEvent.cs	(revision 92488)
+++ System.CodeDom/CodeMemberEvent.cs	(working copy)
@@ -85,5 +85,13 @@
 				type = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeBaseReferenceExpression.cs
===================================================================
--- System.CodeDom/CodeBaseReferenceExpression.cs	(revision 92488)
+++ System.CodeDom/CodeBaseReferenceExpression.cs	(working copy)
@@ -38,5 +38,12 @@
 	public class CodeBaseReferenceExpression
 		: CodeExpression 
 	{
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeAssignStatement.cs
===================================================================
--- System.CodeDom/CodeAssignStatement.cs	(revision 92488)
+++ System.CodeDom/CodeAssignStatement.cs	(working copy)
@@ -72,5 +72,13 @@
 				right = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeCastExpression.cs
===================================================================
--- System.CodeDom/CodeCastExpression.cs	(revision 92488)
+++ System.CodeDom/CodeCastExpression.cs	(working copy)
@@ -89,5 +89,13 @@
 				targetType = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeMemberField.cs
===================================================================
--- System.CodeDom/CodeMemberField.cs	(revision 92488)
+++ System.CodeDom/CodeMemberField.cs	(working copy)
@@ -88,5 +88,13 @@
 				type = value;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom/CodeMethodInvokeExpression.cs
===================================================================
--- System.CodeDom/CodeMethodInvokeExpression.cs	(revision 92488)
+++ System.CodeDom/CodeMethodInvokeExpression.cs	(working copy)
@@ -84,5 +84,13 @@
 				return parameters;
 			}
 		}
+
+		//
+		// ICodeDomVisitor method
+		//
+		internal override void Accept (ICodeDomVisitor visitor)
+		{
+			visitor.Visit (this);
+		}
 	}
 }
Index: System.CodeDom.Compiler/CodeGenerator.cs
===================================================================
--- System.CodeDom.Compiler/CodeGenerator.cs	(revision 92488)
+++ System.CodeDom.Compiler/CodeGenerator.cs	(working copy)
@@ -46,24 +46,29 @@
 		private CodeGeneratorOptions options;
 		private CodeTypeMember currentMember;
 		private CodeTypeDeclaration currentType;
+		private Visitor visitor;
 
 		//
 		// Constructors
 		//
 		protected CodeGenerator()
 		{
+			visitor = new Visitor (this);
 		}
 
 		//
 		// Properties
 		//
 #if NET_2_0
-		protected CodeTypeDeclaration CurrentClass {
+		protected
+#else
+		internal
+#endif
+		CodeTypeDeclaration CurrentClass {
 			get {
 				return currentType;
 			}
 		}
-#endif
 
 		protected CodeTypeMember CurrentMember {
 			get {
@@ -280,128 +285,11 @@
 			if (e == null)
 				throw new ArgumentNullException ("Value cannot be null.");
 
-			CodeArgumentReferenceExpression argref = e as CodeArgumentReferenceExpression;
-			if (argref != null) {
-				GenerateArgumentReferenceExpression (argref);
-				return;
+			try {
+				e.Accept (visitor);
+			} catch (NotImplementedException) {
+				throw new ArgumentException ("Element type " + e.GetType () + " is not supported.");
 			}
-			CodeArrayCreateExpression mkarray = e as CodeArrayCreateExpression;
-			if (mkarray != null) {
-				GenerateArrayCreateExpression (mkarray);
-				return;
-			}
-			CodeArrayIndexerExpression arrayidx = e as CodeArrayIndexerExpression;
-			if (arrayidx != null) {
-				GenerateArrayIndexerExpression (arrayidx);
-				return;
-			}
-			CodeBaseReferenceExpression baseref = e as CodeBaseReferenceExpression;
-			if (baseref != null) {
-				GenerateBaseReferenceExpression (baseref);
-				return;
-			}
-			CodeBinaryOperatorExpression binary = e as CodeBinaryOperatorExpression;
-			if (binary != null) {
-				GenerateBinaryOperatorExpression (binary);
-				return;
-			}
-			CodeCastExpression cast = e as CodeCastExpression;
-			if (cast != null) {
-				GenerateCastExpression (cast);
-				return;
-			}
-			CodeDelegateCreateExpression mkdel = e as CodeDelegateCreateExpression;
-			if (mkdel != null) {
-				GenerateDelegateCreateExpression (mkdel);
-				return;
-			}
-			CodeDelegateInvokeExpression delinvoke = e as CodeDelegateInvokeExpression;
-			if (delinvoke != null) {
-				GenerateDelegateInvokeExpression (delinvoke);
-				return;
-			}
-			CodeDirectionExpression direction = e as CodeDirectionExpression;
-			if (direction != null) {
-				GenerateDirectionExpression (direction);
-				return;
-			}
-			CodeEventReferenceExpression eventref = e as CodeEventReferenceExpression;
-			if ( eventref != null ) {
-				GenerateEventReferenceExpression( eventref );
-				return;
-			}
-			CodeFieldReferenceExpression fieldref = e as CodeFieldReferenceExpression;
-			if (fieldref != null) {
-				GenerateFieldReferenceExpression (fieldref);
-				return;
-			}
-			CodeIndexerExpression idx = e as CodeIndexerExpression;
-			if (idx != null) {
-				GenerateIndexerExpression (idx);
-				return;
-			}
-			CodeMethodInvokeExpression methodinv = e as CodeMethodInvokeExpression;
-			if (methodinv != null) {
-				GenerateMethodInvokeExpression (methodinv);
-				return;
-			}
-			CodeMethodReferenceExpression methodref = e as CodeMethodReferenceExpression;
-			if (methodref != null) {
-				GenerateMethodReferenceExpression (methodref);
-				return;
-			}
-			CodeObjectCreateExpression objref = e as CodeObjectCreateExpression;
-			if (objref != null) {
-				GenerateObjectCreateExpression (objref);
-				return;
-			}
-			CodeParameterDeclarationExpression param = e as CodeParameterDeclarationExpression;
-			if (param != null) {
-				GenerateParameterDeclarationExpression (param);
-				return;
-			}
-			CodePrimitiveExpression primitive = e as CodePrimitiveExpression;
-			if (primitive != null) {
-				GeneratePrimitiveExpression (primitive);
-				return;
-			}
-			CodePropertyReferenceExpression propref = e as CodePropertyReferenceExpression;
-			if (propref != null) {
-				GeneratePropertyReferenceExpression (propref);
-				return;
-			}
-			CodePropertySetValueReferenceExpression propset = e as CodePropertySetValueReferenceExpression;
-			if (propset != null) {
-				GeneratePropertySetValueReferenceExpression (propset);
-				return;
-			}
-			CodeSnippetExpression snippet = e as CodeSnippetExpression;
-			if (snippet != null) {
-				GenerateSnippetExpression (snippet);
-				return;
-			}
-			CodeThisReferenceExpression thisref = e as CodeThisReferenceExpression;
-			if (thisref != null) {
-				GenerateThisReferenceExpression (thisref);
-				return;
-			}
-			CodeTypeOfExpression typeOf = e as CodeTypeOfExpression;
-			if (typeOf != null) {
-				GenerateTypeOfExpression (typeOf);
-				return;
-			}
-			CodeTypeReferenceExpression typeref = e as CodeTypeReferenceExpression;
-			if (typeref != null) {
-				GenerateTypeReferenceExpression (typeref);
-				return;
-			}
-			CodeVariableReferenceExpression varref = e as CodeVariableReferenceExpression;
-			if (varref != null) {
-				GenerateVariableReferenceExpression (varref);
-				return;
-			}
-
-			throw new ArgumentException ("Element type " + e + " is not supported.");
 		}
 
 		protected abstract void GenerateExpressionStatement (CodeExpressionStatement statement);
@@ -478,34 +366,40 @@
 
 		protected virtual void GeneratePrimitiveExpression (CodePrimitiveExpression e)
 		{
-			if (e.Value == null) {
+			object value = e.Value;
+			if (value == null) {
 				output.Write (NullToken);
 				return;
 			}
-
-			Type type = e.Value.GetType ();
-			if (type == typeof (bool)) {
-				output.Write (e.Value.ToString ().ToLower (CultureInfo.InvariantCulture));
-			} else if (type == typeof (char)) {
-				output.Write ("'" + e.Value.ToString () + "'");
-			} else if (type == typeof (string)) {
-				output.Write (QuoteSnippetString ((string) e.Value));
-			} else if (type == typeof (float)) {
-				GenerateSingleFloatValue((float) e.Value);
-			} else if (type == typeof (double)) {
-				GenerateDoubleValue((double) e.Value);
-			} else if (type == typeof (decimal)) {
-				this.GenerateDecimalValue((decimal) e.Value);
-			} else if (type == typeof (byte) || type == typeof (short) || 
-				type == typeof (int) || type == typeof (long)) {
-				// All of these should be IFormatable, I am just being safe/slow 
-				IFormattable formattable = e.Value as IFormattable;
-				if (formattable != null) {
-					output.Write (formattable.ToString (null, CultureInfo.InvariantCulture));
-				} else {
-					output.Write (e.Value.ToString ());
-				}
-			} else {
+ 
+			Type type = value.GetType ();
+			TypeCode typeCode = Type.GetTypeCode (type);
+			switch (typeCode) {
+			case TypeCode.Boolean:
+				output.Write (value.ToString ().ToLower (CultureInfo.InvariantCulture));
+				break;
+			case TypeCode.Char:
+				output.Write ("'" + value.ToString () + "'");
+				break;
+			case TypeCode.String:
+				output.Write (QuoteSnippetString ((string) value));
+				break;
+			case TypeCode.Single:
+				GenerateSingleFloatValue ((float) value);
+				break;
+			case TypeCode.Double:
+				GenerateDoubleValue ((double) value);
+				break;
+			case TypeCode.Decimal:
+				GenerateDecimalValue ((decimal) value);
+				break;
+			case TypeCode.Byte:
+			case TypeCode.Int16:
+			case TypeCode.Int32:
+			case TypeCode.Int64:
+				output.Write (((IFormattable)value).ToString (null, CultureInfo.InvariantCulture));
+				break;
+			default:
 				throw new ArgumentException (string.Format(CultureInfo.InvariantCulture,
 					"Invalid Primitive Type: {0}. Only CLS compliant primitive " +
 					"types can be used. Consider using CodeObjectCreateExpression.",
@@ -544,8 +438,6 @@
 
 		protected void GenerateStatement (CodeStatement s)
 		{
-			bool handled = false;
-
 #if NET_2_0
 			if (s.StartDirectives.Count > 0)
 				GenerateDirectives (s.StartDirectives);
@@ -553,56 +445,6 @@
 			if (s.LinePragma != null)
 				GenerateLinePragmaStart (s.LinePragma);
 
-			CodeAssignStatement assign = s as CodeAssignStatement;
-			if (assign != null) {
-				GenerateAssignStatement (assign);
-				handled = true;
-			}
-			CodeAttachEventStatement attach = s as CodeAttachEventStatement;
-			if (attach != null) {
-				GenerateAttachEventStatement (attach);
-				handled = true;
-			}
-			CodeCommentStatement comment = s as CodeCommentStatement;
-			if (comment != null) {
-				GenerateCommentStatement (comment);
-				handled = true;
-			}
-			CodeConditionStatement condition = s as CodeConditionStatement;
-			if (condition != null) {
-				GenerateConditionStatement (condition);
-				handled = true;
-			}
-			CodeExpressionStatement expression = s as CodeExpressionStatement;
-			if (expression != null) {
-				GenerateExpressionStatement (expression);
-				handled = true;
-			}
-			CodeGotoStatement gotostmt = s as CodeGotoStatement;
-			if (gotostmt != null) {
-				GenerateGotoStatement (gotostmt);
-				handled = true;
-			}
-			CodeIterationStatement iteration = s as CodeIterationStatement;
-			if (iteration != null) {
-				GenerateIterationStatement (iteration);
-				handled = true;
-			}
-			CodeLabeledStatement label = s as CodeLabeledStatement;
-			if (label != null) {
-				GenerateLabeledStatement (label);
-				handled = true;
-			}
-			CodeMethodReturnStatement returnstmt = s as CodeMethodReturnStatement;
-			if (returnstmt != null) {
-				GenerateMethodReturnStatement (returnstmt);
-				handled = true;
-			}
-			CodeRemoveEventStatement remove = s as CodeRemoveEventStatement;
-			if (remove != null) {
-				GenerateRemoveEventStatement (remove);
-				handled = true;
-			}
 			CodeSnippetStatement snippet = s as CodeSnippetStatement;
 			if (snippet != null) {
 #if NET_2_0
@@ -616,27 +458,14 @@
 #else
 				GenerateSnippetStatement (snippet);
 #endif
-				handled = true;
+			} else {
+				try {
+					s.Accept (visitor);
+				} catch (NotImplementedException) {
+					throw new ArgumentException ("Element type " + s.GetType () + " is not supported.");
+				}
 			}
-			CodeThrowExceptionStatement exception = s as CodeThrowExceptionStatement;
-			if (exception != null) {
-				GenerateThrowExceptionStatement (exception);
-				handled = true;
-			}
-			CodeTryCatchFinallyStatement trycatch = s as CodeTryCatchFinallyStatement;
-			if (trycatch != null) {
-				GenerateTryCatchFinallyStatement (trycatch);
-				handled = true;
-			}
-			CodeVariableDeclarationStatement declaration = s as CodeVariableDeclarationStatement;
-			if (declaration != null) {
-				GenerateVariableDeclarationStatement (declaration);
-				handled = true;
-			}
 
-			if (!handled)
-				throw new ArgumentException ("Element type " + s + " is not supported.");
-
 			if (s.LinePragma != null)
 				GenerateLinePragmaEnd (s.LinePragma);
 
@@ -1129,48 +958,11 @@
 				if (member.LinePragma != null)
 					GenerateLinePragmaStart (member.LinePragma);
 
-				CodeMemberEvent eventm = member as CodeMemberEvent;
-				if (eventm != null) {
-					GenerateEvent (eventm, type);
-					continue;
+				try {
+					member.Accept (visitor);
+				} catch (NotImplementedException) {
+					throw new ArgumentException ("Element type " + member.GetType () + " is not supported.");
 				}
-				CodeMemberField field = member as CodeMemberField;
-				if (field != null) {
-					GenerateField (field);
-					continue;
-				}
-				CodeEntryPointMethod epmethod = member as CodeEntryPointMethod;
-				if (epmethod != null) {
-					GenerateEntryPointMethod (epmethod, type);
-					continue;
-				}
-				CodeTypeConstructor typeCtor = member as CodeTypeConstructor;
-				if (typeCtor != null) {
-					GenerateTypeConstructor (typeCtor);
-					continue;
-				}
-				CodeConstructor ctor = member as CodeConstructor;
-				if (ctor != null) {
-					GenerateConstructor (ctor, type);
-					continue;
-				}
-				CodeMemberMethod method = member as CodeMemberMethod;
-				if (method != null) {
-					GenerateMethod (method, type);
-					continue;
-				}
-				CodeMemberProperty property = member as CodeMemberProperty;
-				if (property != null) {
-					GenerateProperty (property, type);
-					continue;
-				}
-				CodeSnippetTypeMember snippet = member as CodeSnippetTypeMember;
-				if (snippet != null) {
-					GenerateSnippetMember (snippet);
-					continue;
-				}
-
-				this.currentMember = prevMember;
 			}
 
 			// Hack because of previous continue usage
@@ -1293,5 +1085,252 @@
 		{
 		}
 #endif
+
+		internal class Visitor : ICodeDomVisitor {
+			CodeGenerator g;
+
+			public Visitor (CodeGenerator generator)
+			{
+				this.g = generator;
+			}
+
+			// CodeExpression
+				
+			public void Visit (CodeArgumentReferenceExpression o)
+			{
+				g.GenerateArgumentReferenceExpression (o);
+			}
+	
+			public void Visit (CodeArrayCreateExpression o)
+			{
+				g.GenerateArrayCreateExpression (o);
+			}
+	
+			public void Visit (CodeArrayIndexerExpression o)
+			{
+				g.GenerateArrayIndexerExpression (o);
+			}
+	
+			public void Visit (CodeBaseReferenceExpression o)
+			{
+				g.GenerateBaseReferenceExpression (o);
+			}
+	
+			public void Visit (CodeBinaryOperatorExpression o)
+			{
+				g.GenerateBinaryOperatorExpression (o);
+			}
+	
+			public void Visit (CodeCastExpression o)
+			{
+				g.GenerateCastExpression (o);
+			}
+	
+#if NET_2_0
+			public void Visit (CodeDefaultValueExpression o)
+			{
+				g.GenerateDefaultValueExpression (o);
+			}
+#endif
+	
+			public void Visit (CodeDelegateCreateExpression o)
+			{
+				g.GenerateDelegateCreateExpression (o);
+			}
+	
+			public void Visit (CodeDelegateInvokeExpression o)
+			{
+				g.GenerateDelegateInvokeExpression (o);
+			}
+	
+			public void Visit (CodeDirectionExpression o)
+			{
+				g.GenerateDirectionExpression (o);
+			}
+	
+			public void Visit (CodeEventReferenceExpression o)
+			{
+				g.GenerateEventReferenceExpression (o);
+			}
+	
+			public void Visit (CodeFieldReferenceExpression o)
+			{
+				g.GenerateFieldReferenceExpression (o);
+			}
+	
+			public void Visit (CodeIndexerExpression o)
+			{
+				g.GenerateIndexerExpression (o);
+			}
+	
+			public void Visit (CodeMethodInvokeExpression o)
+			{
+				g.GenerateMethodInvokeExpression (o);
+			}
+	
+			public void Visit (CodeMethodReferenceExpression o)
+			{
+				g.GenerateMethodReferenceExpression (o);
+			}
+	
+			public void Visit (CodeObjectCreateExpression o)
+			{
+				g.GenerateObjectCreateExpression (o);
+			}
+	
+			public void Visit (CodeParameterDeclarationExpression o)
+			{
+				g.GenerateParameterDeclarationExpression (o);
+			}
+	
+			public void Visit (CodePrimitiveExpression o)
+			{
+				g.GeneratePrimitiveExpression (o);
+			}
+	
+			public void Visit (CodePropertyReferenceExpression o)
+			{
+				g.GeneratePropertyReferenceExpression (o);
+			}
+	
+			public void Visit (CodePropertySetValueReferenceExpression o)
+			{
+				g.GeneratePropertySetValueReferenceExpression (o);
+			}
+	
+			public void Visit (CodeSnippetExpression o)
+			{
+				g.GenerateSnippetExpression (o);
+			}
+	
+			public void Visit (CodeThisReferenceExpression o)
+			{
+				g.GenerateThisReferenceExpression (o);
+			}
+	
+			public void Visit (CodeTypeOfExpression o)
+			{
+				g.GenerateTypeOfExpression (o);
+			}
+	
+			public void Visit (CodeTypeReferenceExpression o)
+			{
+				g.GenerateTypeReferenceExpression (o);
+			}
+			
+			public void Visit (CodeVariableReferenceExpression o)
+			{
+				g.GenerateVariableReferenceExpression (o);
+			}
+			
+			// CodeStatement
+
+			public void Visit (CodeAssignStatement o)
+			{
+				g.GenerateAssignStatement (o);
+			}
+
+			public void Visit (CodeAttachEventStatement o)
+			{
+				g.GenerateAttachEventStatement (o);
+			}
+
+			public void Visit (CodeCommentStatement o)
+			{
+				g.GenerateCommentStatement (o);
+			}
+
+			public void Visit (CodeConditionStatement o)
+			{
+				g.GenerateConditionStatement (o);
+			}
+
+			public void Visit (CodeExpressionStatement o)
+			{
+				g.GenerateExpressionStatement (o);
+			}
+
+			public void Visit (CodeGotoStatement o)
+			{
+				g.GenerateGotoStatement (o);
+			}
+
+			public void Visit (CodeIterationStatement o)
+			{
+				g.GenerateIterationStatement (o);
+			}
+
+			public void Visit (CodeLabeledStatement o)
+			{
+				g.GenerateLabeledStatement (o);
+			}
+
+			public void Visit (CodeMethodReturnStatement o)
+			{
+				g.GenerateMethodReturnStatement (o);
+			}
+
+			public void Visit (CodeRemoveEventStatement o)
+			{
+				g.GenerateRemoveEventStatement (o);
+			}
+
+			public void Visit (CodeThrowExceptionStatement o)
+			{
+				g.GenerateThrowExceptionStatement (o);
+			}
+
+			public void Visit (CodeTryCatchFinallyStatement o)
+			{
+				g.GenerateTryCatchFinallyStatement (o);
+			}
+
+			public void Visit (CodeVariableDeclarationStatement o)
+			{
+				g.GenerateVariableDeclarationStatement (o);
+			}
+		
+			// CodeTypeMember
+			
+			public void Visit (CodeConstructor o)
+			{
+				g.GenerateConstructor (o, g.CurrentClass);
+			}
+			
+			public void Visit (CodeEntryPointMethod o)
+			{
+				g.GenerateEntryPointMethod (o, g.CurrentClass);
+			}
+	
+			public void Visit (CodeMemberEvent o)
+			{
+				g.GenerateEvent (o, g.CurrentClass);
+			}
+	
+			public void Visit (CodeMemberField o)
+			{
+				g.GenerateField (o);
+			}
+			
+			public void Visit (CodeMemberMethod o)
+			{
+				g.GenerateMethod (o, g.CurrentClass);
+			}
+	
+			public void Visit (CodeMemberProperty o)
+			{
+				g.GenerateProperty (o, g.CurrentClass);		
+			}
+	
+			public void Visit (CodeSnippetTypeMember o)
+			{
+				g.GenerateSnippetMember (o);
+			}
+	
+			public void Visit (CodeTypeConstructor o)
+			{
+				g.GenerateTypeConstructor (o);
+			}
+		}
 	}
 }
Index: System.CodeDom.Compiler/ChangeLog
===================================================================
--- System.CodeDom.Compiler/ChangeLog	(revision 92488)
+++ System.CodeDom.Compiler/ChangeLog	(working copy)
@@ -1,3 +1,11 @@
+2008-01-09  Juraj Skripsky  <[EMAIL PROTECTED]>
+
+	* CodeGenerator.cs: Mark CurrentClass internal for NET_1_1.
+	Add nested Visitor class and member. 
+	GenerateExpression, GenerateStatement, GenerateType: Use visitor.
+	GeneratePrimitiveExpression: Replace if-else chain with switch
+	on TypeCode. 
+
 2007-12-15  Marek Habersack  <[EMAIL PROTECTED]>
 
 	* Compiler.cs: added support for the default collection of
//
// System.CodeDom.ICodeDomVisitor.cs
//
// Author:
//   Juraj Skripsky ([EMAIL PROTECTED])
//
// Copyright (C) 2008 HotFeet GmbH (http://www.hotfeet.ch)
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
// 
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//

namespace System.CodeDom {
	internal interface ICodeDomVisitor {
		// CodeExpression
		void Visit (CodeArgumentReferenceExpression o);
		void Visit (CodeArrayCreateExpression o);
		void Visit (CodeArrayIndexerExpression o);
		void Visit (CodeBaseReferenceExpression o);
		void Visit (CodeBinaryOperatorExpression o);
		void Visit (CodeCastExpression o);
#if NET_2_0
		void Visit (CodeDefaultValueExpression o);
#endif
		void Visit (CodeDelegateCreateExpression o);
		void Visit (CodeDelegateInvokeExpression o);
		void Visit (CodeDirectionExpression o);
		void Visit (CodeEventReferenceExpression o);
		void Visit (CodeFieldReferenceExpression o);
		void Visit (CodeIndexerExpression o);
		void Visit (CodeMethodInvokeExpression o);
		void Visit (CodeMethodReferenceExpression o);
		void Visit (CodeObjectCreateExpression o);
		void Visit (CodeParameterDeclarationExpression o);
		void Visit (CodePrimitiveExpression o);
		void Visit (CodePropertyReferenceExpression o);
		void Visit (CodePropertySetValueReferenceExpression o);
		void Visit (CodeSnippetExpression o);
		void Visit (CodeThisReferenceExpression o);
		void Visit (CodeTypeOfExpression o);
		void Visit (CodeTypeReferenceExpression o);
		void Visit (CodeVariableReferenceExpression o);

		// CodeStatement
		void Visit (CodeAssignStatement o);
		void Visit (CodeAttachEventStatement o);
		void Visit (CodeCommentStatement o);
		void Visit (CodeConditionStatement o);
		void Visit (CodeExpressionStatement o);
		void Visit (CodeGotoStatement o);
		void Visit (CodeIterationStatement o);
		void Visit (CodeLabeledStatement o);
		void Visit (CodeMethodReturnStatement o);
		void Visit (CodeRemoveEventStatement o);
		void Visit (CodeThrowExceptionStatement o);
		void Visit (CodeTryCatchFinallyStatement o);
		void Visit (CodeVariableDeclarationStatement o);

		// CodeTypeMember
		void Visit (CodeConstructor o);
		void Visit (CodeEntryPointMethod o);
		void Visit (CodeMemberEvent o);
		void Visit (CodeMemberField o);
		void Visit (CodeMemberMethod o);
		void Visit (CodeMemberProperty o);
		void Visit (CodeSnippetTypeMember o);
		void Visit (CodeTypeConstructor o);
	}
}
_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to