* CSharpCodeGenerator.cs: Avoid ArgumentNullException when
authorGert Driesen <drieseng@users.sourceforge.net>
Sun, 27 Jan 2008 16:06:24 +0000 (16:06 -0000)
committerGert Driesen <drieseng@users.sourceforge.net>
Sun, 27 Jan 2008 16:06:24 +0000 (16:06 -0000)
CodeDelegateInvokeExpression.TargetObject is null.
* VBCodeGenerator.cs: In GenerateDelegateInvokeExpression, only emit
RaiseEvent statement on 2.0 profile if TargetObject is a
CodeEventReferenceExpression. Spaces to tabs and code formatting.
* CodeGenerator.cs: Fixed ArgumentException argument names. Indent
expression list.
* CodeGeneratorFromExpressionTest.cs: Copied some tests from VB, and
improved existing tests.
* CodeGeneratorFromExpressionTest.cs: Numbered tests. Fixed test for
DelegateInvokeExpression to pass on MS 2.0 and improved coverage.

svn path=/trunk/mcs/; revision=94055

mcs/class/System/Microsoft.CSharp/CSharpCodeGenerator.cs
mcs/class/System/Microsoft.CSharp/ChangeLog
mcs/class/System/Microsoft.VisualBasic/ChangeLog
mcs/class/System/Microsoft.VisualBasic/VBCodeGenerator.cs
mcs/class/System/System.CodeDom.Compiler/ChangeLog
mcs/class/System/System.CodeDom.Compiler/CodeGenerator.cs
mcs/class/System/Test/Microsoft.CSharp/ChangeLog
mcs/class/System/Test/Microsoft.CSharp/CodeGeneratorFromExpressionTest.cs
mcs/class/System/Test/Microsoft.VisualBasic/ChangeLog
mcs/class/System/Test/Microsoft.VisualBasic/CodeGeneratorFromExpressionTest.cs

index 90bd188b396f622cd6db23d9cf5ccd368105364d..938efd7a964c596d66ea96eda466d1069384403c 100644 (file)
@@ -289,7 +289,8 @@ namespace Mono.CSharp
 
                protected override void GenerateDelegateInvokeExpression (CodeDelegateInvokeExpression expression)
                {
-                       GenerateExpression (expression.TargetObject);
+                       if (expression.TargetObject != null)
+                               GenerateExpression (expression.TargetObject);
                        Output.Write ('(');
                        OutputExpressionList (expression.Parameters);
                        Output.Write (')');
index 99f6123570d699cfdb4df58b0938242890862a97..6f74f908428d98edd6d5f0ed3976302e49071dfd 100644 (file)
@@ -1,3 +1,8 @@
+2008-01-27  Gert Driesen  <drieseng@users.sourceforge.net>
+
+       * CSharpCodeGenerator.cs: Avoid ArgumentNullException when
+       CodeDelegateInvokeExpression.TargetObject is null.
+
 2008-01-16  Gert Driesen  <drieseng@users.sourceforge.net>
 
        * CSharpCodeGenerator.cs: Cosmetic changes to the code emitted for
index 2aa363429814e4ed15a2e74edd133faf4e6c190b..671f003262d2c6c133e2f7768addbff6ea584095 100644 (file)
@@ -1,3 +1,9 @@
+2008-01-27  Gert Driesen  <drieseng@users.sourceforge.net>
+
+       * VBCodeGenerator.cs: In GenerateDelegateInvokeExpression, only emit
+       RaiseEvent statement on 2.0 profile if TargetObject is a
+       CodeEventReferenceExpression. Spaces to tabs and code formatting.
+
 2008-01-16  Gert Driesen  <drieseng@users.sourceforge.net>
 
        * VBCodeGenerator.cs: Implement support for type parameters.
index 59c83b1a5df7f6b42f3db5f5105b48556b46b73e..79c084d3fd3b95c41d1259fb5f99203b1bc2eb22 100644 (file)
@@ -57,7 +57,7 @@ namespace Microsoft.VisualBasic
        internal class VBCodeGenerator : CodeGenerator
        {
 #if NET_2_0
-               private string[] Keywords = new string[] {
+               private string [] Keywords = new string [] {
                        "AddHandler", "AddressOf", "Alias", "And",
                        "AndAlso", "Ansi", "As", "Assembly",
                        "Auto", "Boolean", "ByRef", "Byte", 
@@ -95,7 +95,7 @@ namespace Microsoft.VisualBasic
                        "Xor" 
                };
 #else
-               private string[] Keywords = new string[] {
+               private string [] Keywords = new string [] {
                        "AddHandler", "AddressOf", "Alias", "And",
                        "AndAlso", "Ansi", "As", "Assembly",
                        "Auto", "Boolean", "ByRef", "Byte", 
@@ -173,9 +173,9 @@ namespace Microsoft.VisualBasic
 
                                output.Write ("(Not (");
                                GenerateExpression (reverse ? e.Right : e.Left);
-                               output.Write (") Is ");
-                               GenerateExpression (reverse ? e.Left : e.Right);
-                               output.Write (')');
+                               output.Write (") Is ");
+                               GenerateExpression (reverse ? e.Left : e.Right);
+                               output.Write (')');
                        } else {
                                base.GenerateBinaryOperatorExpression (e);
                        }
@@ -199,12 +199,9 @@ namespace Microsoft.VisualBasic
                                OutputExpressionList (initializers);
                                --Indent;
                                output.Write ("}");
-
-                       } 
-                       else {
+                       } else {
                                CodeTypeReference arrayType = createType.ArrayElementType;
-                               while (arrayType != null) 
-                               {
+                               while (arrayType != null) {
                                        createType = arrayType;
                                        arrayType = arrayType.ArrayElementType;
                                }
@@ -239,14 +236,14 @@ namespace Microsoft.VisualBasic
                        output.Write (")");
                }
 
-               private bool AsBool(object datavalue)
+               private bool AsBool (object datavalue)
                {
-                       return datavalue != null && datavalue is bool && (bool)datavalue;
+                       return datavalue != null && datavalue is bool && (bool) datavalue;
                }
                
-               private string OnOff(bool datavalue)
+               private string OnOff (bool datavalue)
                {
-                       return datavalue?"On":"Off";
+                       return datavalue ? "On" : "Off";
                }
 
                protected override void GenerateCompileUnitStart (CodeCompileUnit compileUnit)
@@ -261,8 +258,8 @@ namespace Microsoft.VisualBasic
                        GenerateComment (new CodeComment (" </autogenerated>"));
                        GenerateComment (new CodeComment ("------------------------------------------------------------------------------"));
                        Output.WriteLine ();
-                       if (AsBool(compileUnit.UserData["AllowLateBound"])) {
-                               Output.WriteLine("Option Explicit {0}",OnOff(AsBool(compileUnit.UserData["RequireVariableDeclaration"])));
+                       if (AsBool (compileUnit.UserData ["AllowLateBound"])) {
+                               Output.WriteLine("Option Explicit {0}", OnOff (AsBool (compileUnit.UserData ["RequireVariableDeclaration"])));
                                Output.WriteLine("Option Strict Off");
                        } else {
                                Output.WriteLine("Option Explicit On"); // Strict On implies Explicit On
@@ -382,8 +379,13 @@ namespace Microsoft.VisualBasic
                {
                        CodeEventReferenceExpression ev = expression.TargetObject as CodeEventReferenceExpression;
                        
+#if ONLY_1_1
                        Output.Write ("RaiseEvent ");
+#endif
                        if (ev != null) {
+#if NET_2_0
+                               Output.Write ("RaiseEvent ");
+#endif
                                if (ev.TargetObject != null && !(ev.TargetObject is CodeThisReferenceExpression)) {
                                        GenerateExpression (ev.TargetObject);
                                        Output.Write (".");
@@ -516,13 +518,13 @@ namespace Microsoft.VisualBasic
                        string text = comment.Text;
 
                        for (int i = 0; i < text.Length; i++) {
-                               output.Write (text[i]);
+                               output.Write (text [i]);
                                if (text[i] == '\r') {
-                                       if (i < (text.Length - 1) && text[i + 1] == '\n') {
+                                       if (i < (text.Length - 1) && text [i + 1] == '\n') {
                                                continue;
                                        }
                                        output.Write (commentChars);
-                               } else if (text[i] == '\n') {
+                               } else if (text [i] == '\n') {
                                        output.Write (commentChars);
                                }
                        }
@@ -589,7 +591,6 @@ namespace Microsoft.VisualBasic
 
                        CodeStatementCollection finallies = statement.FinallyStatements;
                        if (finallies.Count > 0) {
-
                                output.WriteLine ("Finally");
                                ++Indent;
                                GenerateStatements (finallies);
@@ -600,7 +601,7 @@ namespace Microsoft.VisualBasic
                }
 
                protected override void GenerateAssignStatement (CodeAssignStatement statement)
-               {                       
+               {
                        TextWriter output = Output;
                        GenerateExpression (statement.Left);
                        output.Write (" = ");
@@ -676,8 +677,7 @@ namespace Microsoft.VisualBasic
                        OutputTypeNamePair (statement.Type, statement.Name);
 
                        CodeExpression initExpression = statement.InitExpression;
-                       if (initExpression != null) 
-                       {
+                       if (initExpression != null) {
                                output.Write (" = ");
                                GenerateExpression (initExpression);
                        }
@@ -702,13 +702,12 @@ namespace Microsoft.VisualBasic
 
                protected override void GenerateEvent (CodeMemberEvent eventRef, CodeTypeDeclaration declaration)
                {
-                       if (IsCurrentDelegate || IsCurrentEnum) {
+                       if (IsCurrentDelegate || IsCurrentEnum)
                                return;
-                       }
 
                        TextWriter output = Output;
 
-                       OutputAttributes (eventRef.CustomAttributes, null, 
+                       OutputAttributes (eventRef.CustomAttributes, null,
                                LineHandling.ContinueLine);
 
                        OutputMemberAccessModifier (eventRef.Attributes);
@@ -732,9 +731,8 @@ namespace Microsoft.VisualBasic
 
                protected override void GenerateField (CodeMemberField field)
                {
-                       if (IsCurrentDelegate || IsCurrentInterface) {
+                       if (IsCurrentDelegate || IsCurrentInterface)
                                return;
-                       }
 
                        TextWriter output = Output;
 
@@ -768,7 +766,7 @@ namespace Microsoft.VisualBasic
                protected override void GenerateEntryPointMethod (CodeEntryPointMethod method, CodeTypeDeclaration declaration)
                {
 #if NET_2_0
-                       OutputAttributes (method.CustomAttributes, null, 
+                       OutputAttributes (method.CustomAttributes, null,
                                LineHandling.ContinueLine);
 #endif
 
@@ -782,9 +780,8 @@ namespace Microsoft.VisualBasic
                [MonoTODO ("partially implemented")]
                protected override void GenerateMethod (CodeMemberMethod method, CodeTypeDeclaration declaration)
                {
-                       if (IsCurrentDelegate || IsCurrentEnum) {
+                       if (IsCurrentDelegate || IsCurrentEnum)
                                return;
-                       }
 
                        bool isSub = method.ReturnType.BaseType == typeof(void).FullName;
 
@@ -855,9 +852,8 @@ namespace Microsoft.VisualBasic
 
                protected override void GenerateProperty (CodeMemberProperty property, CodeTypeDeclaration declaration)
                {
-                       if (IsCurrentDelegate || IsCurrentEnum) {
+                       if (IsCurrentDelegate || IsCurrentEnum)
                                return;
-                       }
 
                        TextWriter output = Output;
 
@@ -944,9 +940,8 @@ namespace Microsoft.VisualBasic
 
                protected override void GenerateConstructor (CodeConstructor constructor, CodeTypeDeclaration declaration)
                {
-                       if (IsCurrentDelegate || IsCurrentEnum || IsCurrentInterface) {
+                       if (IsCurrentDelegate || IsCurrentEnum || IsCurrentInterface)
                                return;
-                       }
 
                        OutputAttributes (constructor.CustomAttributes, null,
                                LineHandling.ContinueLine);
@@ -984,9 +979,8 @@ namespace Microsoft.VisualBasic
                
                protected override void GenerateTypeConstructor (CodeTypeConstructor constructor)
                {
-                       if (IsCurrentDelegate || IsCurrentEnum || IsCurrentInterface) {
+                       if (IsCurrentDelegate || IsCurrentEnum || IsCurrentInterface)
                                return;
-                       }
 
 #if NET_2_0
                        OutputAttributes (constructor.CustomAttributes, null,
@@ -1236,12 +1230,12 @@ namespace Microsoft.VisualBasic
                protected override void OutputFieldScopeModifier (MemberAttributes attributes)
                {
                        switch (attributes & MemberAttributes.ScopeMask) {
-                               case MemberAttributes.Static:
-                                       Output.Write ("Shared ");
-                                       break;
-                               case MemberAttributes.Const:
-                                       Output.Write ("Const ");
-                                       break;
+                       case MemberAttributes.Static:
+                               Output.Write ("Shared ");
+                               break;
+                       case MemberAttributes.Const:
+                               Output.Write ("Const ");
+                               break;
                        }
                }
 
@@ -1269,79 +1263,77 @@ namespace Microsoft.VisualBasic
                protected override void OutputMemberAccessModifier (MemberAttributes attributes)
                {
                        switch (attributes & MemberAttributes.AccessMask) {
-                               case MemberAttributes.Assembly:
-                               case MemberAttributes.FamilyAndAssembly:
-                                       Output.Write ("Friend "); 
-                                       break;
-                               case MemberAttributes.Family:
-                                       Output.Write ("Protected ");
-                                       break;
-                               case MemberAttributes.FamilyOrAssembly:
-                                       Output.Write ("Protected Friend ");
-                                       break;
-                               case MemberAttributes.Private:
-                                       Output.Write ("Private ");
-                                       break;
-                               case MemberAttributes.Public:
-                                       Output.Write ("Public ");
-                                       break;
+                       case MemberAttributes.Assembly:
+                       case MemberAttributes.FamilyAndAssembly:
+                               Output.Write ("Friend "); 
+                               break;
+                       case MemberAttributes.Family:
+                               Output.Write ("Protected ");
+                               break;
+                       case MemberAttributes.FamilyOrAssembly:
+                               Output.Write ("Protected Friend ");
+                               break;
+                       case MemberAttributes.Private:
+                               Output.Write ("Private ");
+                               break;
+                       case MemberAttributes.Public:
+                               Output.Write ("Public ");
+                               break;
                        }
                }
 
                private void OutputVTableModifier (MemberAttributes attributes)
                {
-                       if ((attributes & MemberAttributes.VTableMask) == MemberAttributes.New) {
+                       if ((attributes & MemberAttributes.VTableMask) == MemberAttributes.New)
                                Output.Write ("Shadows ");
-                       }
                }
 
                protected override void OutputMemberScopeModifier (MemberAttributes attributes)
                {
                        switch (attributes & MemberAttributes.ScopeMask) {
-                               case MemberAttributes.Abstract:
-                                       Output.Write ("MustOverride ");
-                                       break;
-                               case MemberAttributes.Final:
-                                       // do nothing
-                                       break;
-                               case MemberAttributes.Static:
-                                       Output.Write ("Shared ");
-                                       break;
-                               case MemberAttributes.Override:
-                                       Output.Write ("Overrides ");
-                                       break;
-                               case MemberAttributes.Overloaded:
-                                       // based on http://gendotnet.com/Code%20Gen%20Articles/codedom.htm
-                                       Output.Write ("Overloads ");
+                       case MemberAttributes.Abstract:
+                               Output.Write ("MustOverride ");
+                               break;
+                       case MemberAttributes.Final:
+                               // do nothing
+                               break;
+                       case MemberAttributes.Static:
+                               Output.Write ("Shared ");
+                               break;
+                       case MemberAttributes.Override:
+                               Output.Write ("Overrides ");
+                               break;
+                       case MemberAttributes.Overloaded:
+                               // based on http://gendotnet.com/Code%20Gen%20Articles/codedom.htm
+                               Output.Write ("Overloads ");
 
-                                       MemberAttributes access_ovl = attributes & MemberAttributes.AccessMask;
-                                       if (access_ovl == MemberAttributes.Public || access_ovl == MemberAttributes.Family) {
-                                               Output.Write ("Overridable ");
-                                       }
-                                       break;
-                               default:
-                                       //
-                                       // FUNNY! if the scope value is
-                                       // rubbish (0 or >Const), and access
-                                       // is public, protected make it
-                                       // "virtual".
-                                       //
-                                       // i'm not sure whether this is 100%
-                                       // correct, but it seems to be MS
-                                       // behavior.
-                                       //
-                                       // On MS.NET 2.0, internal properties
-                                       // are also marked "virtual".
-                                       //
-                                       MemberAttributes access = attributes & MemberAttributes.AccessMask;
-                                       if (access == MemberAttributes.Public || 
+                               MemberAttributes access_ovl = attributes & MemberAttributes.AccessMask;
+                               if (access_ovl == MemberAttributes.Public || access_ovl == MemberAttributes.Family)
+                                       Output.Write ("Overridable ");
+                               break;
+                       default:
+                               //
+                               // FUNNY! if the scope value is
+                               // rubbish (0 or >Const), and access
+                               // is public, protected make it
+                               // "virtual".
+                               //
+                               // i'm not sure whether this is 100%
+                               // correct, but it seems to be MS
+                               // behavior.
+                               //
+                               // On MS.NET 2.0, internal properties
+                               // are also marked "virtual".
+                               //
+                               MemberAttributes access = attributes & MemberAttributes.AccessMask;
+                               if (access == MemberAttributes.Public || 
 #if NET_2_0
-                                               access == MemberAttributes.Family || access == MemberAttributes.Assembly)
+                                       access == MemberAttributes.Family || access == MemberAttributes.Assembly)
 #else
-                                               access == MemberAttributes.Family)
+                                       access == MemberAttributes.Family)
 #endif
-                                               Output.Write ("Overridable ");
-                                       break;
+                                       Output.Write ("Overridable ");
+                               break;
                        }
                }
 
@@ -1413,25 +1405,25 @@ namespace Microsoft.VisualBasic
 #endif
                        
                        switch (attributes & TypeAttributes.VisibilityMask) {
-                               case TypeAttributes.Public:
-                               case TypeAttributes.NestedPublic:
-                                       output.Write ("Public ");
-                                       break;
-                               case TypeAttributes.NestedPrivate:
-                                       output.Write ("Private ");
-                                       break;
+                       case TypeAttributes.Public:
+                       case TypeAttributes.NestedPublic:
+                               output.Write ("Public ");
+                               break;
+                       case TypeAttributes.NestedPrivate:
+                               output.Write ("Private ");
+                               break;
 #if NET_2_0
-                               case TypeAttributes.NotPublic:
-                               case TypeAttributes.NestedFamANDAssem:
-                               case TypeAttributes.NestedAssembly:
-                                       output.Write ("Friend ");
-                                       break; 
-                               case TypeAttributes.NestedFamily:
-                                       output.Write ("Protected ");
-                                       break;
-                               case TypeAttributes.NestedFamORAssem:
-                                       output.Write ("Protected Friend ");
-                                       break;
+                       case TypeAttributes.NotPublic:
+                       case TypeAttributes.NestedFamANDAssem:
+                       case TypeAttributes.NestedAssembly:
+                               output.Write ("Friend ");
+                               break; 
+                       case TypeAttributes.NestedFamily:
+                               output.Write ("Protected ");
+                               break;
+                       case TypeAttributes.NestedFamORAssem:
+                               output.Write ("Protected Friend ");
+                               break;
 #endif
                        }
 
@@ -1505,9 +1497,8 @@ namespace Microsoft.VisualBasic
                protected override void OutputTypeNamePair (CodeTypeReference typeRef, String name)
                {
 #if NET_2_0
-                       if (name.Length == 0) {
+                       if (name.Length == 0)
                                name = "__exception";
-                       }
 #endif
                        Output.Write (CreateEscapedIdentifier(name) + " As " + GetTypeOutput (typeRef));
                }
@@ -1522,12 +1513,10 @@ namespace Microsoft.VisualBasic
                        StringBuilder mySBuilder = new StringBuilder(value.Length);
                        mySBuilder.Append ("\"");
                        bool inQuotes = true;
-                       for (int MyCounter = 0; MyCounter < value.Length; MyCounter++)
-                       {
+                       for (int MyCounter = 0; MyCounter < value.Length; MyCounter++) {
                                if (value[MyCounter] == 34) //quotation mark
                                {
-                                       if (!inQuotes)
-                                       {
+                                       if (!inQuotes) {
                                                mySBuilder.Append ("&\"");
                                                inQuotes = true;
                                        }
@@ -1536,8 +1525,7 @@ namespace Microsoft.VisualBasic
                                }
                                else if (value[MyCounter] >= 32) //standard ansi/unicode characters
                                {
-                                       if (!inQuotes)
-                                       {
+                                       if (!inQuotes) {
                                                mySBuilder.Append ("&\"");
                                                inQuotes = true;
                                        }
@@ -1545,15 +1533,14 @@ namespace Microsoft.VisualBasic
                                }
                                else //special chars, e.g. line break
                                {
-                                       if (inQuotes)
-                                       { 
+                                       if (inQuotes) {
                                                mySBuilder.Append ("\"");
                                                inQuotes = false;
                                        }
                                        mySBuilder.Append ("&Microsoft.VisualBasic.ChrW(");
                                        mySBuilder.Append ((int)value[MyCounter]); 
                                        mySBuilder.Append (")");
-                               }                       
+                               }
                        }
                        if (inQuotes)
                                mySBuilder.Append ("\"");
@@ -1595,7 +1582,7 @@ namespace Microsoft.VisualBasic
                        arrayType = type.ArrayElementType;
                        if (arrayType != null)
                                output = GetTypeOutput (arrayType);
-                       else { 
+                       else {
                                switch (type.BaseType) {
                                case "System.DateTime":
                                        output = "Date";
@@ -1691,9 +1678,8 @@ namespace Microsoft.VisualBasic
                                        continue;
                                }
 
-                               if (p != property && p.Name == property.Name && p.PrivateImplementationType == null) {
+                               if (p != property && p.Name == property.Name && p.PrivateImplementationType == null)
                                        return true;
-                               }
                        }
                        return false;
                }
@@ -1711,9 +1697,8 @@ namespace Microsoft.VisualBasic
                                        continue;
                                }
 
-                               if (!(m is CodeTypeConstructor) && !(m is CodeConstructor) && m != method && m.Name == method.Name && m.PrivateImplementationType == null) {
+                               if (!(m is CodeTypeConstructor) && !(m is CodeConstructor) && m != method && m.Name == method.Name && m.PrivateImplementationType == null)
                                        return true;
-                               }
                        }
                        return false;
                }
@@ -1721,9 +1706,8 @@ namespace Microsoft.VisualBasic
                private string GetEventName (CodeMemberEvent evt)
                {
 #if NET_2_0
-                       if (evt.PrivateImplementationType == null) {
+                       if (evt.PrivateImplementationType == null)
                                return evt.Name;
-                       }
 
                        string baseType = evt.PrivateImplementationType.BaseType.Replace ('.', '_');
                        return baseType + "_" + evt.Name;
@@ -1734,9 +1718,8 @@ namespace Microsoft.VisualBasic
 
                private string GetMethodName (CodeMemberMethod method)
                {
-                       if (method.PrivateImplementationType == null) {
+                       if (method.PrivateImplementationType == null)
                                return method.Name;
-                       }
 
                        string baseType = method.PrivateImplementationType.BaseType.Replace ('.', '_');
                        return baseType + "_" + method.Name;
@@ -1744,9 +1727,8 @@ namespace Microsoft.VisualBasic
 
                private string GetPropertyName (CodeMemberProperty property)
                {
-                       if (property.PrivateImplementationType == null) {
+                       if (property.PrivateImplementationType == null)
                                return property.Name;
-                       }
 
                        string baseType = property.PrivateImplementationType.BaseType.Replace ('.', '_');
                        return baseType + "_" + property.Name;
index 45e9c4111cf3216e6e002f61606f81feca883c60..8e8a9f731171a53662ddc333e62637bfa99d774a 100644 (file)
@@ -1,3 +1,8 @@
+2008-01-27  Gert Driesen  <drieseng@users.sourceforge.net>
+
+       * CodeGenerator.cs: Fixed ArgumentException argument names. Indent
+       expression list.
+
 2007-12-15  Marek Habersack  <mhabersack@novell.com>
 
        * Compiler.cs: added support for the default collection of
index 645eb32fa6adbf804587930aeb07a5db6516182d..ad8bd410ab73a850722f851e9a5b1bf1d49c8d29 100644 (file)
@@ -278,7 +278,7 @@ namespace System.CodeDom.Compiler {
                protected void GenerateExpression (CodeExpression e)
                {
                        if (e == null)
-                               throw new ArgumentNullException ("Value cannot be null.");
+                               throw new ArgumentNullException ("e");
 
                        CodeArgumentReferenceExpression argref = e as CodeArgumentReferenceExpression;
                        if (argref != null) {
@@ -401,7 +401,7 @@ namespace System.CodeDom.Compiler {
                                return;
                        }
 
-                       throw new ArgumentException ("Element type " + e + " is not supported.");
+                       throw new ArgumentException ("Element type " + e + " is not supported.", "e");
                }
 
                protected abstract void GenerateExpressionStatement (CodeExpressionStatement statement);
@@ -763,6 +763,7 @@ namespace System.CodeDom.Compiler {
                protected virtual void OutputExpressionList (CodeExpressionCollection expressions,
                                                             bool newLineBetweenItems)
                {
+                       ++Indent;
                        IEnumerator enumerator = expressions.GetEnumerator();
                        if (enumerator.MoveNext()) {
                                CodeExpression expression = (CodeExpression)enumerator.Current;
@@ -781,6 +782,7 @@ namespace System.CodeDom.Compiler {
                                        GenerateExpression (expression);
                                }
                        }
+                       --Indent;
                }
 
                protected virtual void OutputFieldScopeModifier (MemberAttributes attributes)
index fbd4b76c491a46aae0aa77e805c8a3316fa43932..fe1d05287b2a70aac3129f70615c6770faf9153d 100644 (file)
@@ -1,3 +1,8 @@
+2008-01-27  Gert Driesen  <drieseng@users.sourceforge.net>
+
+       * CodeGeneratorFromExpressionTest.cs: Copied some tests from VB, and
+       improved existing tests.
+
 2008-01-16  Gert Driesen  <drieseng@users.sourceforge.net>
 
        * CodeGeneratorFromCompileUnitTest.cs: Avoid using "", and use
index 8e94d57d4afe6c917a466362e79491a05b46e58f..857cf9f3b93f7361a0f07a8adc08fb5e4c08fc8c 100644 (file)
@@ -9,6 +9,7 @@
 using System;
 using System.CodeDom;
 using System.CodeDom.Compiler;
+using System.Globalization;
 using System.IO;
 using System.Text;
 
@@ -38,21 +39,35 @@ namespace MonoTests.Microsoft.CSharp
                }
 
                [Test]
-               [ExpectedException (typeof (ArgumentException))]
                public void DefaultExpressionTest ()
                {
                        using (StringWriter sw = new StringWriter ()) {
-                               Generate (new CodeExpression (), sw);
-                               sw.Close ();
+                               try {
+                                       Generate (new CodeExpression (), sw);
+                                       Assert.Fail ("#1");
+                               } catch (ArgumentException ex) {
+                                       // Element type System.CodeDom.CodeExpression is not supported
+                                       Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
+                                       Assert.IsNull (ex.InnerException, "#3");
+                                       Assert.IsNotNull (ex.Message, "#4");
+                                       Assert.AreEqual ("e", ex.ParamName, "#5");
+                               }
                        }
                }
 
                [Test]
-               [ExpectedException (typeof (ArgumentNullException))]
                public void NullExpressionTest ()
                {
                        using (StringWriter sw = new StringWriter ()) {
-                               Generate (null, sw);
+                               try {
+                                       Generate (null, sw);
+                                       Assert.Fail ("#1");
+                               } catch (ArgumentNullException ex) {
+                                       Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                                       Assert.IsNull (ex.InnerException, "#3");
+                                       Assert.IsNotNull (ex.Message, "#4");
+                                       Assert.AreEqual ("e", ex.ParamName, "#5");
+                               }
                        }
                }
 
@@ -350,6 +365,202 @@ namespace MonoTests.Microsoft.CSharp
                        }
                }
 
+               [Test]
+               public void ArrayCreateExpressionTest ()
+               {
+                       StringBuilder sb;
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               Assert.AreEqual (
+                                       string.Format (CultureInfo.InvariantCulture,
+                                               "new int[] {{{0}        5}}",
+                                               Environment.NewLine),
+                                       Generate (new CodeArrayCreateExpression (
+                                                       typeof (int),
+                                                       new CodeExpression [] {
+                                                               new CodePrimitiveExpression (5)
+                                                               })
+                                               , sw), "#1");
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               Assert.AreEqual ("new int[5]",
+                                       Generate (new CodeArrayCreateExpression (
+                                                       typeof (int),
+                                                       new CodePrimitiveExpression (5))
+                                               , sw), "#2");
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               Assert.AreEqual (
+                                       string.Format (CultureInfo.InvariantCulture,
+                                               "new string[] {{{0}" +
+                                               "        \"a\",{0}" +
+                                               "        \"b\",{0}" +
+                                               "        \"c\"}}",
+                                               Environment.NewLine),
+                                       Generate (new CodeArrayCreateExpression (
+                                                       typeof (string),
+                                                       new CodeExpression [] {
+                                                               new CodePrimitiveExpression ("a"),
+                                                               new CodePrimitiveExpression ("b"),
+                                                               new CodePrimitiveExpression ("c"),
+                                                               })
+                                               , sw));
+                               sw.Close ();
+                       }
+               }
+
+               [Test]
+               public void EscapedIdentifierTest ()
+               {
+                       StringBuilder sb;
+                       string code;
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeVariableReferenceExpression ("using"), sw);
+                               Assert.AreEqual ("@using", code, "#1");
+                               sw.Close ();
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeTypeReferenceExpression ("using"), sw);
+                               Assert.AreEqual ("@using", code, "#2");
+                               sw.Close ();
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodePropertyReferenceExpression (null, "using"), sw);
+                               Assert.AreEqual ("@using", code, "#3");
+                               sw.Close ();
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeMethodReferenceExpression (null, "using"), sw);
+                               Assert.AreEqual ("@using", code, "#4");
+                               sw.Close ();
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeFieldReferenceExpression (null, "using"), sw);
+                               Assert.AreEqual ("@using", code, "#5");
+                               sw.Close ();
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeEventReferenceExpression (null, "using"), sw);
+                               Assert.AreEqual ("@using", code, "#6");
+                               sw.Close ();
+                       }
+               }
+
+               [Test]
+               public void EventReferenceTest ()
+               {
+                       StringBuilder sb;
+                       string code;
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeEventReferenceExpression (null, null), sw);
+                               Assert.AreEqual (string.Empty, code, "#1");
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeEventReferenceExpression (null, "abc"), sw);
+                               Assert.AreEqual ("abc", code, "#2");
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeEventReferenceExpression (new CodeThisReferenceExpression (), null), sw);
+                               Assert.AreEqual ("this.", code, "#3");
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeEventReferenceExpression (new CodeThisReferenceExpression (), "abc"), sw);
+                               Assert.AreEqual ("this.abc", code, "#4");
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeEventReferenceExpression (new CodePrimitiveExpression ("primitive"), null), sw);
+                               Assert.AreEqual ("\"primitive\".", code, "#5");
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeEventReferenceExpression (new CodePrimitiveExpression ("primitive"), "abc"), sw);
+                               Assert.AreEqual ("\"primitive\".abc", code, "#6");
+                       }
+               }
+
+               [Test]
+               public void DelegateInvokeTest ()
+               {
+                       StringBuilder sb;
+                       string code;
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeDelegateInvokeExpression (null, new CodePrimitiveExpression ("abc")), sw);
+                               Assert.AreEqual ("(\"abc\")", code, "#1");
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeDelegateInvokeExpression (new CodeThisReferenceExpression (), new CodePrimitiveExpression ("abc")), sw);
+                               Assert.AreEqual ("this(\"abc\")", code, "#2");
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeDelegateInvokeExpression (new CodePrimitiveExpression ("primitive"), new CodePrimitiveExpression ("abc")), sw);
+                               Assert.AreEqual ("\"primitive\"(\"abc\")", code, "#3");
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeDelegateInvokeExpression (new CodeEventReferenceExpression (new CodeThisReferenceExpression (), "Click"), new CodePrimitiveExpression ("abc")), sw);
+                               Assert.AreEqual ("this.Click(\"abc\")", code, "#4");
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeDelegateInvokeExpression (new CodeEventReferenceExpression (new CodeThisReferenceExpression (), null), new CodePrimitiveExpression ("abc")), sw);
+                               Assert.AreEqual ("this.(\"abc\")", code, "#5");
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeDelegateInvokeExpression (new CodeEventReferenceExpression (new CodePrimitiveExpression ("primitive"), "Click"), new CodePrimitiveExpression ("abc")), sw);
+                               Assert.AreEqual ("\"primitive\".Click(\"abc\")", code, "#6");
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeDelegateInvokeExpression (new CodeEventReferenceExpression (new CodePrimitiveExpression ("primitive"), null), new CodePrimitiveExpression ("abc")), sw);
+                               Assert.AreEqual ("\"primitive\".(\"abc\")", code, "#7");
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeDelegateInvokeExpression (), sw);
+                               Assert.AreEqual ("()", code, "#8");
+                       }
+               }
+
                private string Generate (CodeExpression expression, StringWriter sw)
                {
                        generator.GenerateCodeFromExpression (expression, sw, options);
index 4391e70e93c10587b3486f6dd07ae444c0a23afb..565c7b079db8e36c3fc5e8bfa4f70ec882718c99 100644 (file)
@@ -1,3 +1,8 @@
+2008-01-27  Gert Driesen  <drieseng@users.sourceforge.net>
+
+       * CodeGeneratorFromExpressionTest.cs: Numbered tests. Fixed test for
+       DelegateInvokeExpression to pass on MS 2.0 and improved coverage.
+
 2008-01-16  Gert Driesen  <drieseng@users.sourceforge.net>
 
        * CodeGeneratorFromNamespaceTest.cs: Added tests for type parameters.
index dd330af656b2b6e9b2d482caf63cdc78317dc31d..b19627776754da07dbcde72b137afed7462906d7 100644 (file)
@@ -377,7 +377,7 @@ namespace MonoTests.Microsoft.VisualBasic
                                                        new CodeExpression [] {
                                                                new CodePrimitiveExpression (5)
                                                                })
-                                               , sw));
+                                               , sw), "#1");
                                sw.Close ();
                        }
 
@@ -387,11 +387,10 @@ namespace MonoTests.Microsoft.VisualBasic
                                        Generate (new CodeArrayCreateExpression(
                                                        typeof(int), 
                                                        new CodePrimitiveExpression (5))
-                                               , sw));
+                                               , sw), "#2");
                                sw.Close ();
                        }
 
-
                        sb = new StringBuilder ();
                        using (StringWriter sw = new StringWriter (sb)) {
                                Assert.AreEqual ("New String() {\"a\", \"b\", \"c\"}", 
@@ -402,7 +401,7 @@ namespace MonoTests.Microsoft.VisualBasic
                                                                new CodePrimitiveExpression ("b"),
                                                                new CodePrimitiveExpression ("c"),
                                                                })
-                                               , sw));
+                                               , sw), "#3");
                                sw.Close ();
                        }
                }
@@ -472,14 +471,14 @@ namespace MonoTests.Microsoft.VisualBasic
                        using (StringWriter sw = new StringWriter (sb)) {
                                code = Generate (new CodeEventReferenceExpression (null, "abc"), sw);
                                Assert.AreEqual ("abcEvent", code, "#02");
-                       }                       
+                       }
                        
                        sb = new StringBuilder ();
                        using (StringWriter sw = new StringWriter (sb)) {
                                code = Generate (new CodeEventReferenceExpression (new CodeThisReferenceExpression (), null), sw);
                                Assert.AreEqual ("Me.Event", code, "#03");
                        }
-                                               
+                       
                        sb = new StringBuilder ();
                        using (StringWriter sw = new StringWriter (sb)) {
                                code = Generate (new CodeEventReferenceExpression (new CodeThisReferenceExpression (), "abc"), sw);
@@ -508,19 +507,55 @@ namespace MonoTests.Microsoft.VisualBasic
                        sb = new StringBuilder ();
                        using (StringWriter sw = new StringWriter (sb)) {
                                code = Generate (new CodeDelegateInvokeExpression (null, new CodePrimitiveExpression ("abc")), sw);
-                               Assert.AreEqual ("RaiseEvent (\"abc\")", code, "#02");
-                       }                       
-                                               
+#if NET_2_0
+                               Assert.AreEqual ("(\"abc\")", code, "#01");
+#else
+                               Assert.AreEqual ("RaiseEvent (\"abc\")", code, "#01");
+#endif
+                       }
+
                        sb = new StringBuilder ();
                        using (StringWriter sw = new StringWriter (sb)) {
                                code = Generate (new CodeDelegateInvokeExpression (new CodeThisReferenceExpression (), new CodePrimitiveExpression ("abc")), sw);
-                               Assert.AreEqual ("RaiseEvent Me(\"abc\")", code, "#04");
+#if NET_2_0
+                               Assert.AreEqual ("Me(\"abc\")", code, "#02");
+#else
+                               Assert.AreEqual ("RaiseEvent Me(\"abc\")", code, "#02");
+#endif
                        }
-                       
+
                        sb = new StringBuilder ();
                        using (StringWriter sw = new StringWriter (sb)) {
                                code = Generate (new CodeDelegateInvokeExpression (new CodePrimitiveExpression ("primitive"), new CodePrimitiveExpression ("abc")), sw);
-                               Assert.AreEqual ("RaiseEvent \"primitive\"(\"abc\")", code, "#06");
+#if NET_2_0
+                               Assert.AreEqual ("\"primitive\"(\"abc\")", code, "#03");
+#else
+                               Assert.AreEqual ("RaiseEvent \"primitive\"(\"abc\")", code, "#03");
+#endif
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeDelegateInvokeExpression (new CodeEventReferenceExpression (new CodeThisReferenceExpression (), "Click"), new CodePrimitiveExpression ("abc")), sw);
+                               Assert.AreEqual ("RaiseEvent Click(\"abc\")", code, "#04");
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeDelegateInvokeExpression (new CodeEventReferenceExpression (new CodeThisReferenceExpression (), null), new CodePrimitiveExpression ("abc")), sw);
+                               Assert.AreEqual ("RaiseEvent (\"abc\")", code, "#05");
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeDelegateInvokeExpression (new CodeEventReferenceExpression (new CodePrimitiveExpression ("primitive"), "Click"), new CodePrimitiveExpression ("abc")), sw);
+                               Assert.AreEqual ("RaiseEvent \"primitive\".Click(\"abc\")", code, "#06");
+                       }
+
+                       sb = new StringBuilder ();
+                       using (StringWriter sw = new StringWriter (sb)) {
+                               code = Generate (new CodeDelegateInvokeExpression (new CodeEventReferenceExpression (new CodePrimitiveExpression ("primitive"), null), new CodePrimitiveExpression ("abc")), sw);
+                               Assert.AreEqual ("RaiseEvent \"primitive\".(\"abc\")", code, "#07");
                        }
                }
        }