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