* CodeGeneratorFromTypeTest.cs: Added property indexer and parameter tests.
authorGert Driesen <drieseng@users.sourceforge.net>
Thu, 30 Jun 2005 18:29:13 +0000 (18:29 -0000)
committerGert Driesen <drieseng@users.sourceforge.net>
Thu, 30 Jun 2005 18:29:13 +0000 (18:29 -0000)
* CSharpCodeGenerator.cs: Only consider property an indexer if name is Item
(case-insensitive comparison) and property has parameters.
* VBCodeGenerator.cs: Mark indexer as default property.

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

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/Test/Microsoft.CSharp/ChangeLog
mcs/class/System/Test/Microsoft.CSharp/CodeGeneratorFromTypeTest.cs
mcs/class/System/Test/Microsoft.VisualBasic/ChangeLog
mcs/class/System/Test/Microsoft.VisualBasic/CodeGeneratorFromTypeTest.cs

index ad1f197874a077df2f92b3a8b2caeaeb01b455da..aa4f586d68fac741ed0c6c17f73c3d7b60fbda1e 100644 (file)
@@ -34,6 +34,7 @@ namespace Mono.CSharp
        using System;
        using System.CodeDom;
        using System.CodeDom.Compiler;
+       using System.Globalization;
        using System.IO;
        using System.Reflection;
        using System.Collections;
@@ -638,17 +639,14 @@ namespace Mono.CSharp
                        OutputMemberAccessModifier (attributes);
                        OutputMemberScopeModifier (attributes);
 
-                       if (property.Name == "Item")
-                       {
-                               // indexer
-                               
-                               OutputTypeNamePair( property.Type, "this");
+                       // only consider property indexer if name is Item (case-insensitive 
+                       // comparison) AND property has parameters
+                       if (string.Compare(property.Name, "Item", true, CultureInfo.InvariantCulture) == 0 && property.Parameters.Count > 0) {
+                               OutputTypeNamePair(property.Type, "this");
                                output.Write("[");
                                OutputParameters(property.Parameters);
                                output.Write("]");
-                       }
-                       else
-                       {
+                       } else {
                                OutputTypeNamePair( property.Type, GetSafeName (property.Name));
                        }
                        output.WriteLine (" {");
index 378f538a473df1046e1b312f2e3582f9ed1d8dec..ab595a6844ecca3f2380a0c20f7f92b384f21c4f 100644 (file)
@@ -1,3 +1,9 @@
+2005-06-30 Gert Driesen <drieseng@users.sourceforge.net>
+
+       * CSharpCodeGenerator.cs: Only consider property an indexer if
+       name is Item (case-insensitive comparison) and property has
+       parameters.
+
 2005-06-28 Gert Driesen <drieseng@users.sourceforge.net>
 
        * CSharpCodeGenerator.cs: Fixed GetTypeOutput to match MS.NET 1.x
index 851771e957c10805d09718ce79294745aef2386d..3aa8dc7cd87ec15c79941eac29b268fe684e4de7 100644 (file)
@@ -1,3 +1,7 @@
+2005-06-30  Gert Driesen <drieseng@users.sourceforge.net>
+
+       * VBCodeGenerator.cs: Mark indexer as default property.
+
 2005-06-27  Gert Driesen <drieseng@users.sourceforge.net>
 
        * VBCodeGenerator.cs: Added short type names for which support was
index aadbf46e833d3c18db8bbabdee62940bfa7a24ba..2fd5acf4d74f553d9713916300435f719c84bf30 100644 (file)
@@ -685,12 +685,25 @@ namespace Microsoft.VisualBasic
                        if (property.HasSet && (!property.HasGet))\r
                                output.Write ("WriteOnly " );\r
 \r
-                       output.Write ("Property " );\r
+                       // mark property as default property if we're dealing with an indexer\r
+                       if (string.Compare(property.Name, "Item", true, CultureInfo.InvariantCulture) == 0 && property.Parameters.Count > 0) {\r
+                               output.Write ("Default " );\r
+                       }\r
 \r
+                       output.Write ("Property " );\r
                        Output.Write (property.Name);\r
 #if NET_2_0\r
+                       // in .NET 2.0, always output parantheses (whether or not there \r
+                       // are any parameters to output\r
                        Output.Write ('(');\r
+                       OutputParameters (property.Parameters);\r
                        Output.Write (')');\r
+#else\r
+                       if (property.Parameters.Count > 0) {\r
+                               Output.Write ('(');\r
+                               OutputParameters (property.Parameters);\r
+                               Output.Write (')');\r
+                       }\r
 #endif\r
                        Output.Write (" As ");\r
                        Output.Write (GetTypeOutput(property.Type));\r
index 0e8038195b2290b45b5a3c53ffdf0b1307913ca1..8e288670873358c43add23b4096d6ba112930c37 100644 (file)
@@ -1,3 +1,8 @@
+2005-06-30  Gert Driesen <drieseng@users.sourceforge.net>
+
+       * CodeGeneratorFromTypeTest.cs: Added property indexer and parameter
+       tests.
+
 2005-06-28  Gert Driesen <drieseng@users.sourceforge.net>
 
        * CodeGeneratorFromTypeTest.cs: Added additional property tests.
index 423b126d7a12756349a8ed50697068a7694bd57e..d66ecd1aa8579cca4d1af993e336e0838b93fae3 100644 (file)
@@ -326,6 +326,96 @@ namespace MonoTests.Microsoft.CSharp
                                + "}}{0}", writer.NewLine), Code);
                }
 
+               /// <summary>
+               /// C# CodeDOM does not output parameters for properties that aren't
+               /// indexers.
+               /// </summary>
+               [Test]
+               public void PropertyParametersTest ()
+               {
+                       type.Name = "Test1";
+
+                       CodeMemberProperty property = new CodeMemberProperty ();
+                       property.Name = "Name";
+                       property.Attributes = MemberAttributes.Public;
+                       property.Type = new CodeTypeReference (typeof (int));
+
+                       CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
+                               typeof (object), "value1");
+                       property.Parameters.Add (param);
+
+                       param = new CodeParameterDeclarationExpression (
+                               typeof (int), "value2");
+                       param.Direction = FieldDirection.Ref;
+                       property.Parameters.Add (param);
+
+                       type.Members.Add (property);
+
+                       Generate ();
+                       Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
+                               "public class Test1 {{{0}"
+                               + "    {0}"
+                               + "    public virtual int Name {{{0}"
+                               + "    }}{0}"
+                               + "}}{0}", writer.NewLine), Code);
+               }
+
+               [Test]
+               public void PropertyIndexerTest1 ()
+               {
+                       type.Name = "Test1";
+
+                       CodeMemberProperty property = new CodeMemberProperty ();
+                       // ensure case-insensitive comparison is done on name of property
+                       property.Name = "iTem";
+                       property.Attributes = MemberAttributes.Public;
+                       property.Type = new CodeTypeReference (typeof (int));
+
+                       CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
+                               typeof (object), "value1");
+                       property.Parameters.Add (param);
+
+                       param = new CodeParameterDeclarationExpression (
+                               typeof (int), "value2");
+                       param.Direction = FieldDirection.Ref;
+                       property.Parameters.Add (param);
+
+                       type.Members.Add (property);
+
+                       Generate ();
+                       Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
+                               "public class Test1 {{{0}"
+                               + "    {0}"
+                               + "    public virtual int this[object value1, ref int value2] {{{0}"
+                               + "    }}{0}"
+                               + "}}{0}", writer.NewLine), Code);
+               }
+
+               /// <summary>
+               /// Ensures indexer code is only output if property is named "Item"
+               /// (case-insensitive comparison) AND parameters are defined.
+               /// </summary>
+               [Test]
+               public void PropertyIndexerTest2 ()
+               {
+                       type.Name = "Test1";
+
+                       CodeMemberProperty property = new CodeMemberProperty ();
+                       // ensure case-insensitive comparison is done on name of property
+                       property.Name = "iTem";
+                       property.Attributes = MemberAttributes.Public;
+                       property.Type = new CodeTypeReference (typeof (int));
+                       type.Members.Add (property);
+
+                       Generate ();
+                       Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
+                               "public class Test1 {{{0}"
+                               + "    {0}"
+                               + "    public virtual int iTem {{{0}"
+                               + "    }}{0}"
+                               + "}}{0}", writer.NewLine), Code);
+               }
+
                [Test]
                public void MethodMembersTypeTest1 ()
                {
index da07e586ee3f8bf4a182c58575a2a227b1a4985b..ce1f5937dd4efa45804fbbc6ccd671fd26cff4f2 100644 (file)
@@ -1,3 +1,8 @@
+2005-06-30  Gert Driesen <drieseng@users.sourceforge.net>
+
+       * CodeGeneratorFromTypeTest.cs: Added property indexer and
+       parameter tests.
+
 2005-06-28  Gert Driesen <drieseng@users.sourceforge.net>
 
        * CodeGeneratorFromExpressionTest.cs: Renumbered tests for
index 773f61e9d09a7dd7c4096dd33efbe166d2ebdfeb..73eea4275282dbee9d7aa1ef5e6c42aa97a077f8 100644 (file)
@@ -366,6 +366,100 @@ namespace MonoTests.Microsoft.VisualBasic
                                + "End Class{0}", writer.NewLine), Code);
                }
 
+               /// <summary>
+               /// Apparently VB.NET CodeDOM also allows properties that aren't indexers
+               /// to have parameters.
+               /// </summary>
+               [Test]
+               public void PropertyParametersTest ()
+               {
+                       type.Name = "Test1";
+
+                       CodeMemberProperty property = new CodeMemberProperty ();
+                       property.Name = "Name";
+                       property.Attributes = MemberAttributes.Public;
+                       property.Type = new CodeTypeReference (typeof (int));
+
+                       CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
+                               typeof (object), "value1");
+                       property.Parameters.Add (param);
+
+                       param = new CodeParameterDeclarationExpression (
+                               typeof (int), "value2");
+                       param.Direction = FieldDirection.Ref;
+                       property.Parameters.Add (param);
+
+                       type.Members.Add (property);
+
+                       Generate ();
+                       Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
+                               "Public Class Test1{0}"
+                               + "    {0}"
+                               + "    Public Overridable Property Name(ByVal value1 As Object, ByRef value2 As Integer) As Integer{0}"
+                               + "    End Property{0}"
+                               + "End Class{0}", writer.NewLine), Code);
+               }
+
+               [Test]
+               public void PropertyIndexerTest1 ()
+               {
+                       type.Name = "Test1";
+
+                       CodeMemberProperty property = new CodeMemberProperty ();
+                       // ensure case-insensitive comparison is done on name of property
+                       property.Name = "iTem";
+                       property.Attributes = MemberAttributes.Public;
+                       property.Type = new CodeTypeReference (typeof (int));
+
+                       CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
+                               typeof (object), "value1");
+                       property.Parameters.Add (param);
+
+                       param = new CodeParameterDeclarationExpression (
+                               typeof (int), "value2");
+                       param.Direction = FieldDirection.Ref;
+                       property.Parameters.Add (param);
+
+                       type.Members.Add (property);
+
+                       Generate ();
+                       Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
+                               "Public Class Test1{0}"
+                               + "    {0}"
+                               + "    Public Overridable Default Property iTem(ByVal value1 As Object, ByRef value2 As Integer) As Integer{0}"
+                               + "    End Property{0}"
+                               + "End Class{0}", writer.NewLine), Code);
+               }
+
+               /// <summary>
+               /// Ensures Default keyword is only output if property is named "Item"
+               /// (case-insensitive comparison) AND parameters are defined.
+               /// </summary>
+               [Test]
+               public void PropertyIndexerTest2 ()
+               {
+                       type.Name = "Test1";
+
+                       CodeMemberProperty property = new CodeMemberProperty ();
+                       // ensure case-insensitive comparison is done on name of property
+                       property.Name = "iTem";
+                       property.Attributes = MemberAttributes.Public;
+                       property.Type = new CodeTypeReference (typeof (int));
+                       type.Members.Add (property);
+
+                       Generate ();
+                       Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
+                               "Public Class Test1{0}"
+                               + "    {0}"
+#if NET_2_0
+                               + "    Public Overridable Property iTem() As Integer{0}"
+#else
+                               + "    Public Overridable Property iTem As Integer{0}"
+#endif
+                               + "    End Property{0}"
+                               + "End Class{0}", writer.NewLine), Code);
+               }
+
                [Test]
                public void MethodMembersTypeTest1 ()
                {