2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / corlib / System.Reflection / MonoProperty.cs
index f52568c4d14d1c35dbfae97e5c8eeaf121a66b9f..901a83fb7e3855edc13414362049c4521bc3e4cb 100755 (executable)
@@ -9,6 +9,29 @@
 // (C) 2001 Ximian, Inc.  http://www.ximian.com
 //
 
+//
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
 using System;
 using System.Globalization;
 using System.Runtime.CompilerServices;
@@ -24,9 +47,20 @@ namespace System.Reflection {
                public PropertyAttributes attrs;
                
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               internal static extern void get_property_info (MonoProperty prop, out MonoPropertyInfo info);
+               internal static extern void get_property_info (MonoProperty prop, out MonoPropertyInfo info,
+                                                              PInfo req_info);
        }
 
+       [Flags]
+       internal enum PInfo {
+               Attributes = 1,
+               GetMethod  = 1 << 1,
+               SetMethod  = 1 << 2,
+               ReflectedType = 1 << 3,
+               DeclaringType = 1 << 4,
+               Name = 1 << 5
+               
+       }
        internal class MonoProperty : PropertyInfo {
                internal IntPtr klass;
                internal IntPtr prop;
@@ -34,21 +68,23 @@ namespace System.Reflection {
                public override PropertyAttributes Attributes {
                        get {
                                MonoPropertyInfo info;
-                               MonoPropertyInfo.get_property_info (this, out info);
+                               MonoPropertyInfo.get_property_info (this, out info, PInfo.Attributes);
                                return info.attrs;
                        }
                }
+               
                public override bool CanRead {
                        get {
                                MonoPropertyInfo info;
-                               MonoPropertyInfo.get_property_info (this, out info);
+                               MonoPropertyInfo.get_property_info (this, out info, PInfo.GetMethod);
                                return (info.get_method != null);
                        }
                }
+               
                public override bool CanWrite {
                        get {
                                MonoPropertyInfo info;
-                               MonoPropertyInfo.get_property_info (this, out info);
+                               MonoPropertyInfo.get_property_info (this, out info, PInfo.SetMethod);
                                return (info.set_method != null);
                        }
                }
@@ -56,7 +92,7 @@ namespace System.Reflection {
                public override Type PropertyType {
                        get {
                                MonoPropertyInfo info;
-                               MonoPropertyInfo.get_property_info (this, out info);
+                               MonoPropertyInfo.get_property_info (this, out info, PInfo.GetMethod | PInfo.SetMethod);
                                
                                if (info.get_method != null) {
                                        return info.get_method.ReturnType;
@@ -67,82 +103,101 @@ namespace System.Reflection {
                                }
                        }
                }
+
                public override Type ReflectedType {
                        get {
                                MonoPropertyInfo info;
-                               MonoPropertyInfo.get_property_info (this, out info);
+                               MonoPropertyInfo.get_property_info (this, out info, PInfo.ReflectedType);
                                return info.parent;
                        }
                }
+               
                public override Type DeclaringType {
                        get {
                                MonoPropertyInfo info;
-                               MonoPropertyInfo.get_property_info (this, out info);
+                               MonoPropertyInfo.get_property_info (this, out info, PInfo.DeclaringType);
                                return info.parent;
                        }
                }
+               
                public override string Name {
                        get {
                                MonoPropertyInfo info;
-                               MonoPropertyInfo.get_property_info (this, out info);
+                               MonoPropertyInfo.get_property_info (this, out info, PInfo.Name);
                                return info.name;
                        }
                }
 
-               [MonoTODO]
-               public override MethodInfo[] GetAccessors( bool nonPublic) {
-                       // FIXME: check nonPublic
+               public override MethodInfo[] GetAccessors (bool nonPublic)
+               {
                        MonoPropertyInfo info;
+                       int nget = 0;
+                       int nset = 0;
+                       
+                       MonoPropertyInfo.get_property_info (this, out info, PInfo.GetMethod | PInfo.SetMethod);
+                       if (info.set_method != null && (nonPublic || info.set_method.IsPublic))
+                               nset = 1;
+                       if (info.get_method != null && (nonPublic || info.get_method.IsPublic))
+                               nget = 1;
+
+                       MethodInfo[] res = new MethodInfo [nget + nset];
                        int n = 0;
-                       MonoPropertyInfo.get_property_info (this, out info);
-                       if (info.set_method != null)
-                               n++;
-                       if (info.get_method != null)
-                               n++;
-                       MethodInfo[] res = new MethodInfo [n];
-                       n = 0;
-                       if (info.set_method != null)
+                       if (nset != 0)
                                res [n++] = info.set_method;
-                       if (info.get_method != null)
+                       if (nget != 0)
                                res [n++] = info.get_method;
                        return res;
                }
 
-               [MonoTODO]
-               public override MethodInfo GetGetMethod( bool nonPublic) {
-                       // FIXME: check nonPublic
+               public override MethodInfo GetGetMethod (bool nonPublic)
+               {
                        MonoPropertyInfo info;
-                       MonoPropertyInfo.get_property_info (this, out info);
-                       return info.get_method;
+                       MonoPropertyInfo.get_property_info (this, out info, PInfo.GetMethod);
+                       if (info.get_method != null && (nonPublic || info.get_method.IsPublic))
+                               return info.get_method;
+                       else
+                               return null;
                }
-               public override ParameterInfo[] GetIndexParameters() {
+
+               public override ParameterInfo[] GetIndexParameters()
+               {
                        MonoPropertyInfo info;
-                       MonoPropertyInfo.get_property_info (this, out info);
+                       MonoPropertyInfo.get_property_info (this, out info, PInfo.GetMethod);
                        if (info.get_method != null)
                                return info.get_method.GetParameters ();
                        return new ParameterInfo [0];
                }
-               public override MethodInfo GetSetMethod( bool nonPublic) {
-                       // FIXME: check nonPublic
+               
+               public override MethodInfo GetSetMethod (bool nonPublic)
+               {
                        MonoPropertyInfo info;
-                       MonoPropertyInfo.get_property_info (this, out info);
-                       return info.set_method;
+                       MonoPropertyInfo.get_property_info (this, out info, PInfo.SetMethod);
+                       if (info.set_method != null && (nonPublic || info.set_method.IsPublic))
+                               return info.set_method;
+                       else
+                               return null;
                }
-               public override bool IsDefined (Type attributeType, bool inherit) {
+               
+               public override bool IsDefined (Type attributeType, bool inherit)
+               {
                        return MonoCustomAttrs.IsDefined (this, attributeType, inherit);
                }
 
-               public override object[] GetCustomAttributes( bool inherit) {
+               public override object[] GetCustomAttributes (bool inherit)
+               {
                        return MonoCustomAttrs.GetCustomAttributes (this, inherit);
                }
-               public override object[] GetCustomAttributes( Type attributeType, bool inherit) {
+               
+               public override object[] GetCustomAttributes (Type attributeType, bool inherit)
+               {
                        return MonoCustomAttrs.GetCustomAttributes (this, attributeType, inherit);
                }
 
-               public override object GetValue( object obj, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture) {
+               public override object GetValue (object obj, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture)
+               {
                        object ret = null;
 
-                       MethodInfo method = GetGetMethod (false);
+                       MethodInfo method = GetGetMethod (true);
                        if (method == null)
                                throw new ArgumentException ("Get Method not found for '" + Name + "'");
                        
@@ -154,8 +209,9 @@ namespace System.Reflection {
                        return ret;
                }
 
-               public override void SetValue( object obj, object value, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture) {
-                       MethodInfo method = GetSetMethod (false);
+               public override void SetValue (object obj, object value, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture)
+               {
+                       MethodInfo method = GetSetMethod (true);
                        if (method == null)
                                throw new ArgumentException ("Set Method not found for '" + Name + "'");
                        
@@ -175,6 +231,22 @@ namespace System.Reflection {
                public override string ToString () {
                        return PropertyType.ToString () + " " + Name;
                }
+
+#if NET_2_0 || BOOTSTRAP_NET_2_0
+               [MonoTODO]
+               public override Type[] OptionalCustomModifiers {
+                       get {
+                               throw new NotImplementedException ();
+                       }
+               }
+
+               [MonoTODO]
+               public override Type[] RequiredCustomModifiers {
+                       get {
+                               throw new NotImplementedException ();
+                       }
+               }
+#endif
        }
 }