Moved ProviderCollectionTest.cs from System assembly to System.Configuration.
[mono.git] / mcs / class / corlib / System.Reflection / FieldInfo.cs
old mode 100755 (executable)
new mode 100644 (file)
index e47a6c9..f019bc2
@@ -5,12 +5,7 @@
 //   Miguel de Icaza (miguel@ximian.com)
 //
 // (C) Ximian, Inc.  http://www.ximian.com
-//
-// TODO: Mucho left to implement.
-//
-
-//
-// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2004-2005 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
 // 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.Diagnostics;
-using System.Reflection;
 using System.Reflection.Emit;
 using System.Globalization;
 using System.Runtime.CompilerServices;
@@ -42,9 +34,14 @@ using System.Runtime.InteropServices;
 
 namespace System.Reflection {
 
+#if NET_2_0
+       [ComVisible (true)]
+       [ComDefaultInterfaceAttribute (typeof (_FieldInfo))]
+#endif
        [Serializable]
-       [ClassInterface(ClassInterfaceType.AutoDual)]
-       public abstract class FieldInfo : MemberInfo {
+       [ClassInterface(ClassInterfaceType.None)]
+       public abstract class FieldInfo : MemberInfo, _FieldInfo {
+
                public abstract FieldAttributes Attributes {get;}
                public abstract RuntimeFieldHandle FieldHandle {get;}
 
@@ -135,7 +132,14 @@ namespace System.Reflection {
                        }
                }
 
-               public abstract void SetValue (object obj, object val, BindingFlags invokeAttr, Binder binder, CultureInfo culture);
+               public abstract void SetValue (object obj, object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture);
+
+#if ONLY_1_1
+               public new Type GetType ()
+               {
+                       return base.GetType ();
+               }
+#endif
 
                [DebuggerHidden]
                [DebuggerStepThrough]
@@ -145,24 +149,49 @@ namespace System.Reflection {
                }
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private static extern FieldInfo internal_from_handle (IntPtr handle);
+               private static extern FieldInfo internal_from_handle_type (IntPtr field_handle, IntPtr type_handle);
 
                public static FieldInfo GetFieldFromHandle (RuntimeFieldHandle handle)
                {
-                       return internal_from_handle (handle.Value);
+                       if (handle.Value == IntPtr.Zero)
+                               throw new ArgumentException ("The handle is invalid.");
+                       return internal_from_handle_type (handle.Value, IntPtr.Zero);
                }
 
-               internal abstract int GetFieldOffset ();
+#if NET_2_0
+               [ComVisible (false)]
+               public static FieldInfo GetFieldFromHandle (RuntimeFieldHandle handle, RuntimeTypeHandle declaringType)
+               {
+                       if (handle.Value == IntPtr.Zero)
+                               throw new ArgumentException ("The handle is invalid.");
+                       return internal_from_handle_type (handle.Value, declaringType.Value);
+               }
+#endif
+
+               //
+               // Note: making this abstract imposes an implementation requirement
+               //       on any class that derives from it.  However, since it's also
+               //       internal, that means only classes inside corlib can derive
+               //       from FieldInfo.  See
+               //
+               //          errors/cs0534-4.cs errors/CS0534-4-lib.cs
+               //
+               //          class/Microsoft.JScript/Microsoft.JScript/JSFieldInfo.cs
+               //
+               internal virtual int GetFieldOffset ()
+               {
+                       throw new SystemException ("This method should not be called");
+               }
 
                [CLSCompliant(false)]
-               [MonoTODO]
+               [MonoTODO("Not implemented")]
                public virtual object GetValueDirect (TypedReference obj)
                {
                        throw new NotImplementedException ();
                }
 
                [CLSCompliant(false)]
-               [MonoTODO]
+               [MonoTODO("Not implemented")]
                public virtual void SetValueDirect (TypedReference obj, object value)
                {
                        throw new NotImplementedException ();
@@ -171,6 +200,12 @@ namespace System.Reflection {
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                private extern UnmanagedMarshal GetUnmanagedMarshal ();
 
+               internal virtual UnmanagedMarshal UMarshal {
+                       get {
+                               return GetUnmanagedMarshal ();
+                       }
+               }
+
                internal object[] GetPseudoCustomAttributes ()
                {
                        int count = 0;
@@ -181,7 +216,7 @@ namespace System.Reflection {
                        if (DeclaringType.IsExplicitLayout)
                                count ++;
 
-                       UnmanagedMarshal marshalAs = GetUnmanagedMarshal ();
+                       UnmanagedMarshal marshalAs = UMarshal;
                        if (marshalAs != null)
                                count ++;
 
@@ -201,21 +236,47 @@ namespace System.Reflection {
                }
 
 #if NET_2_0 || BOOTSTRAP_NET_2_0
-               public virtual Type[] OptionalCustomModifiers {
-                       get {
-                               throw new NotImplementedException ();
-                       }
+               [MethodImplAttribute (MethodImplOptions.InternalCall)]
+               extern Type[] GetTypeModifiers (bool optional);
+
+               public virtual Type[] GetOptionalCustomModifiers () {
+                       Type[] types = GetTypeModifiers (true);
+                       if (types == null)
+                               return Type.EmptyTypes;
+                       return types;
                }
 
-               public virtual Type[] RequiredCustomModifiers {
-                       get {
-                               throw new NotImplementedException ();
-                       }
+               public virtual Type[] GetRequiredCustomModifiers () {
+                       Type[] types = GetTypeModifiers (false);
+                       if (types == null)
+                               return Type.EmptyTypes;
+                       return types;
                }
-#endif
 
-#if NET_2_0 || BOOTSTRAP_NET_2_0
-               public abstract FieldInfo Mono_GetGenericFieldDefinition ();
+               public virtual object GetRawConstantValue ()
+               {
+                       throw new NotSupportedException ("This non-CLS method is not implemented.");
+               }
 #endif
+
+               void _FieldInfo.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               void _FieldInfo.GetTypeInfo (uint iTInfo, uint lcid, IntPtr ppTInfo)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               void _FieldInfo.GetTypeInfoCount (out uint pcTInfo)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               void _FieldInfo.Invoke (uint dispIdMember, [In] ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams, IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr)
+               {
+                       throw new NotImplementedException ();
+               }
        }
 }