2008-02-26 Ivan N. Zlatev <contact@i-nz.net>
authorIvan Zlatev <ivan@ivanz.com>
Tue, 26 Feb 2008 20:39:05 +0000 (20:39 -0000)
committerIvan Zlatev <ivan@ivanz.com>
Tue, 26 Feb 2008 20:39:05 +0000 (20:39 -0000)
        * PropertyDescriptor.cs:
         - Implement CreateInstance and GetTypeFromName
         and refactor GetEditor and Converter use them.
         - Drop TypeDescriptor.GetTypeFromName as we also want to check the
         ComponentType assembly, which it doesn't do.
        * TypeDescriptor.cs: Make GetTypeFromName private as it is no longer
        used from the outside.
        * PropertyDescriptorTests.cs: Add Converter tests. Based on a
        patch by Andy Hume <andyhume32@yahoo.co.uk> under the MIT/X11
        license.
        * System_test.dll.sources: Add Consts.cs so that tests can use it
        (e.g for specifying assembly qualified type names in attributes).

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

mcs/class/System/System.ComponentModel/ChangeLog
mcs/class/System/System.ComponentModel/PropertyDescriptor.cs
mcs/class/System/System.ComponentModel/TypeDescriptor.cs
mcs/class/System/System_test.dll.sources
mcs/class/System/Test/System.ComponentModel/ChangeLog
mcs/class/System/Test/System.ComponentModel/PropertyDescriptorTests.cs

index 48dc735fb9e1c589e9ec7787d1546c233db7045a..bc8e7ecb73be8bdbb9b794a35a878c9481caa963 100644 (file)
@@ -2,6 +2,16 @@
 
        * CharConverter.cs: Use trimmed value in FormatException.
 
+2008-02-26  Ivan N. Zlatev  <contact@i-nz.net>
+
+       * PropertyDescriptor.cs: 
+        - Implement CreateInstance and GetTypeFromName
+        and refactor GetEditor and Converter use them.
+        - Drop TypeDescriptor.GetTypeFromName as we also want to check the
+        ComponentType assembly, which it doesn't do.
+       * TypeDescriptor.cs: Make GetTypeFromName private as it is no longer
+       used from the outside.
+
 2008-02-26  Ivan N. Zlatev  <contact@i-nz.net>
 
        * ReflectionPropertyDescriptor.cs: Use Attribute.GetCustomAttributes
index a0fda6274a2af5b11f23a36bf9b74589bed8a363..514f2204261057eab96e59ff147482883e0e49e0 100644 (file)
@@ -4,9 +4,11 @@
 // Author:
 //  Miguel de Icaza (miguel@ximian.com)
 //  Andreas Nahr (ClassDevelopment@A-SoftTech.com)
+//  Ivan N. Zlatev (contact@i-nz.net)
 //
 // (C) Ximian, Inc.  http://www.ximian.com
 // (C) 2003 Andreas Nahr
+// (C) 2008 Novell, Inc.  http://www.novell.com
 //
 
 //
@@ -61,23 +63,15 @@ namespace System.ComponentModel
 
                public virtual TypeConverter Converter {
                        get {
-                               if (converter == null) {
+                               if (converter == null && PropertyType != null) {
                                        TypeConverterAttribute at = (TypeConverterAttribute) Attributes [typeof(TypeConverterAttribute)];
-                                       if (at == null || at == TypeConverterAttribute.Default)
-                                               converter = TypeDescriptor.GetConverter (PropertyType);
-                                       else {
-                                               Type t = Type.GetType (at.ConverterTypeName);
-                                               if (t == null) {
-                                                       converter = TypeDescriptor.GetConverter (PropertyType);
-                                               }
-                                               else {
-                                                       ConstructorInfo ci = t.GetConstructor (new Type[] { typeof(Type) });
-                                                       if (ci != null)
-                                                               converter = (TypeConverter) ci.Invoke (new object[] { PropertyType });
-                                                       else
-                                                               converter = (TypeConverter) Activator.CreateInstance (t);
-                                               }
+                                       if (at != null && at != TypeConverterAttribute.Default) {
+                                               Type converterType = GetTypeFromName (at.ConverterTypeName);
+                                               if (converterType != null && typeof (TypeConverter).IsAssignableFrom (converterType))
+                                                       converter = (TypeConverter)CreateInstance (converterType);
                                        }
+                                       if (converter == null)
+                                               converter = TypeDescriptor.GetConverter (PropertyType);
                                }
                                return converter;
                        }
@@ -220,9 +214,29 @@ namespace System.ComponentModel
 
                public abstract bool ShouldSerializeValue (object component);
 
-               protected object CreateInstance(System.Type type)
+               protected object CreateInstance (Type type)
                {
-                       return Assembly.GetExecutingAssembly ().CreateInstance (type.Name);
+                       if (type == null || PropertyType == null)
+                               return null;
+
+                       object instance = null;
+                       Type[] paramTypes = new Type[] { typeof (Type) };
+                       ConstructorInfo ctor = type.GetConstructor (paramTypes);
+                       if (ctor != null) {
+                               object[] parameters = new object[] { PropertyType };
+#if NET_2_0
+                               instance = TypeDescriptor.CreateInstance (null, type, paramTypes, parameters);
+#else
+                               instance = ctor.Invoke (parameters);
+#endif
+                       } else {
+#if NET_2_0
+                               instance = TypeDescriptor.CreateInstance (null, type, null, null);
+#else
+                               instance = Activator.CreateInstance (type);
+#endif
+                       }
+                       return instance;
                }
 
                public override bool Equals(object obj)
@@ -258,7 +272,7 @@ namespace System.ComponentModel
                        return TypeDescriptor.GetProperties (instance, filter);
                }
 
-               public virtual object GetEditor(Type editorBaseType)
+               public virtual object GetEditor (Type editorBaseType)
                {
                        Type t = null;
                        Attribute [] atts = AttributeArray;
@@ -270,21 +284,34 @@ namespace System.ComponentModel
                                        if (ea == null)
                                                continue;
                                        
-                                       t = TypeDescriptor.GetTypeFromName (null, ea.EditorTypeName);
+                                       t = GetTypeFromName (ea.EditorTypeName);
                                        if (t != null && t.IsSubclassOf(editorBaseType))
                                                break;
                                }
                        }
 
+                       object editor = null;
                        if (t != null)
-                               return TypeDescriptor.CreateEditor (t, PropertyType);
-
-                       return TypeDescriptor.GetEditor (PropertyType, editorBaseType);
+                               editor = CreateInstance (t);
+                       if (editor == null)
+                               editor = TypeDescriptor.GetEditor (PropertyType, editorBaseType);
+                       return editor;
                }
 
-               protected Type GetTypeFromName(string typeName)
+               protected Type GetTypeFromName (string typeName)
                {
-                       return Type.GetType (typeName);
+                       if (typeName == null || ComponentType == null || typeName.Trim ().Length == 0)
+                               return null;
+
+                       Type type = Type.GetType (typeName);
+                       if (type == null) {
+                               // Try to strip the type typeName only
+                               int index = typeName.IndexOf (",");
+                               if (index != -1)
+                                       typeName = typeName.Substring (0, index);
+                               type = ComponentType.Assembly.GetType (typeName);
+                       } 
+                       return type;
                }
        }
 }
index 3283c2f4c084fe4ee8ef301065e05560c77325f5..8bb9d0b846aaf1765f04b5ebc81e7849e4b39adc 100644 (file)
@@ -861,7 +861,7 @@ public sealed class TypeDescriptor
                }
        }
        
-       internal static Type GetTypeFromName (IComponent component, string typeName)
+       private static Type GetTypeFromName (IComponent component, string typeName)
        {
                Type type = null;
                if (component != null && component.Site != null) {
index dc7643b9215c36b26bdc35edd24771754c9a73b3..c8577934d44c6c4cf9ecc8f052508630ee149b41 100644 (file)
@@ -1,3 +1,4 @@
+../../../build/common/Consts.cs
 Microsoft.CSharp/CodeGeneratorFromCompileUnitTest.cs
 Microsoft.CSharp/CodeGeneratorFromExpressionTest.cs
 Microsoft.CSharp/CodeGeneratorFromNamespaceTest.cs
index 7cca8bebfe4ac66df2bdcc7ec8fa372ea04be025..76434dd5893185ad068ab079776fbb0ff356bfd5 100644 (file)
@@ -1,3 +1,9 @@
+2008-02-26  Ivan N. Zlatev  <contact@i-nz.net>
+
+       * PropertyDescriptorTests.cs: Add Converter tests. Based on a 
+       patch by Andy Hume <andyhume32@yahoo.co.uk> under the MIT/X11 
+       license.
+
 2008-02-26  Gert Driesen  <drieseng@users.sourceforge.net>
 
        * CharConverterTest.cs: Fixed test to pass on MS.
index a24d330e32f2f076d25d5a0bd57bd1b0ead7d461..f576b40d5ca0ec6c2c79d345169e35213cb3f11f 100644 (file)
@@ -21,6 +21,10 @@ using NUnit.Framework;
 
 namespace MonoTests.System.ComponentModel
 {
+       internal class MyVersionTypeConverter : TypeConverter
+       {
+       }
+
        [TestFixture]
        public class PropertyDescriptorTests
        {
@@ -353,6 +357,60 @@ namespace MonoTests.System.ComponentModel
                        }
                }
 
+               class Converter_test
+               {
+                       public virtual Version NoConverter {
+                               get { return null; }
+                       }
+
+                       [TypeConverter (typeof(MyVersionTypeConverter))]
+                       public virtual Version WithConverter {
+                               get { return null; }
+                       }
+
+                       [TypeConverter ("MonoTests.System.ComponentModel.MyVersionTypeConverter")]
+                       public virtual Version WithConverterNamed {
+                               get { return null; }
+                       }
+
+                       [TypeConverter("System.ComponentModel.CharConverter, " + Consts.AssemblySystem)]
+                       public virtual Version WithConverterNamedAssmQuald {
+                               get { return null; }
+                       }
+
+                       public int WithDefaultConverter {
+                               get { return 0; }
+                       }
+               }
+                
+               class ConverterSubclassNotOverridenProperties_test : Converter_test
+               { 
+               }
+               
+               class ConverterSubclassOverridenProperties_test : Converter_test
+               {
+                       public override Version WithConverter {
+                               get { return null; }
+                       }
+
+                       public override Version WithConverterNamed {
+                               get { return null; }
+                       }
+               }
+
+               class ConverterEmptyConvertersOnOveriddenProperties : Converter_test
+               {
+                       [TypeConverter]
+                       public override Version WithConverter {
+                               get { return null; }
+                       }
+
+                       [TypeConverter]
+                       public override Version WithConverterNamed {
+                               get { return null; }
+                       }
+               }
+               
                private ArrayList _invokedHandlers;
 
                [SetUp]
@@ -413,6 +471,54 @@ namespace MonoTests.System.ComponentModel
                        Assert.AreEqual (typeof (StringConverter), p3.Converter.GetType (), "3");
                }
 
+               [Test]
+               public void ConverterTest ()
+               {
+                       Assert.AreEqual (typeof (TypeConverter), 
+                                        TypeDescriptor.GetProperties (typeof (Converter_test))["NoConverter"].Converter.GetType (), "#1");
+                       Assert.AreEqual (typeof (MyVersionTypeConverter), 
+                                        TypeDescriptor.GetProperties (typeof (Converter_test))["WithConverter"].Converter.GetType (), "#2");
+                       Assert.AreEqual (typeof (MyVersionTypeConverter), 
+                                        TypeDescriptor.GetProperties (typeof (Converter_test))["WithConverterNamed"].Converter.GetType (), "#3");
+                       Assert.AreEqual (typeof (CharConverter), 
+                                        TypeDescriptor.GetProperties (typeof (Converter_test))["WithConverterNamedAssmQuald"].Converter.GetType (), "#4");
+                       Assert.AreEqual (typeof (Int32Converter), 
+                                        TypeDescriptor.GetProperties (typeof (Converter_test))["WithDefaultConverter"].Converter.GetType (), "#5");
+
+                       Assert.AreEqual (typeof (TypeConverter), 
+                                        TypeDescriptor.GetProperties (typeof (ConverterSubclassNotOverridenProperties_test))["NoConverter"].Converter.GetType (), "#6");
+                       Assert.AreEqual (typeof (MyVersionTypeConverter), 
+                                        TypeDescriptor.GetProperties (typeof (ConverterSubclassNotOverridenProperties_test))["WithConverter"].Converter.GetType (), "#7");
+                       Assert.AreEqual (typeof (MyVersionTypeConverter), 
+                                        TypeDescriptor.GetProperties (typeof (ConverterSubclassNotOverridenProperties_test))["WithConverterNamed"].Converter.GetType (), "#8");
+                       Assert.AreEqual (typeof (CharConverter), 
+                                        TypeDescriptor.GetProperties (typeof (ConverterSubclassNotOverridenProperties_test))["WithConverterNamedAssmQuald"].Converter.GetType (), "#9");
+                       Assert.AreEqual (typeof (Int32Converter), 
+                                        TypeDescriptor.GetProperties (typeof (ConverterSubclassNotOverridenProperties_test))["WithDefaultConverter"].Converter.GetType (), "#10");
+
+                       Assert.AreEqual (typeof (TypeConverter), 
+                                        TypeDescriptor.GetProperties (typeof (ConverterSubclassOverridenProperties_test))["NoConverter"].Converter.GetType (), "#11");
+                       Assert.AreEqual (typeof (MyVersionTypeConverter), 
+                                        TypeDescriptor.GetProperties (typeof (ConverterSubclassOverridenProperties_test))["WithConverter"].Converter.GetType (), "#12");
+                       Assert.AreEqual (typeof (MyVersionTypeConverter), 
+                                        TypeDescriptor.GetProperties (typeof (ConverterSubclassOverridenProperties_test))["WithConverterNamed"].Converter.GetType (), "#13");
+                       Assert.AreEqual (typeof (CharConverter), 
+                                        TypeDescriptor.GetProperties (typeof (ConverterSubclassOverridenProperties_test))["WithConverterNamedAssmQuald"].Converter.GetType (), "#14");
+                       Assert.AreEqual (typeof (Int32Converter), 
+                                        TypeDescriptor.GetProperties (typeof (ConverterSubclassOverridenProperties_test))["WithDefaultConverter"].Converter.GetType (), "#15");
+
+                       Assert.AreEqual (typeof (TypeConverter), 
+                                        TypeDescriptor.GetProperties (typeof (ConverterEmptyConvertersOnOveriddenProperties))["NoConverter"].Converter.GetType (), "#116");
+                       Assert.AreEqual (typeof (TypeConverter), 
+                                        TypeDescriptor.GetProperties (typeof (ConverterEmptyConvertersOnOveriddenProperties))["WithConverter"].Converter.GetType (), "#17");
+                       Assert.AreEqual (typeof (TypeConverter), 
+                                        TypeDescriptor.GetProperties (typeof (ConverterEmptyConvertersOnOveriddenProperties))["WithConverterNamed"].Converter.GetType (), "#18");
+                       Assert.AreEqual (typeof (CharConverter), 
+                                        TypeDescriptor.GetProperties (typeof (ConverterEmptyConvertersOnOveriddenProperties))["WithConverterNamedAssmQuald"].Converter.GetType (), "#19");
+                       Assert.AreEqual (typeof (Int32Converter), 
+                                        TypeDescriptor.GetProperties (typeof (ConverterEmptyConvertersOnOveriddenProperties))["WithDefaultConverter"].Converter.GetType (), "#20");
+               }
+
                [Test]
                public void ShouldSerializeTest_public ()
                {