using System;
using System.CodeDom;
using System.CodeDom.Compiler;
+ using System.Globalization;
using System.IO;
using System.Reflection;
using System.Collections;
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 (" {");
+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
+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
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
+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.
+ "}}{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 ()
{
+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
+ "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 ()
{