2002-08-21 Dietmar Maurer <dietmar@ximian.com>
[mono.git] / mcs / class / corlib / System / MonoType.cs
index e65301e21799b9e8457108d1cc9c934860aa096b..5b6199b1401143e3a054b06f105fceb1e95c72dc 100644 (file)
@@ -1,9 +1,12 @@
+//
 // System.MonoType
 //
 // Sean MacIsaac (macisaac@ximian.com)
 // Paolo Molaro (lupus@ximian.com)
+// Patrik Torstensson (patrik.torstensson@labs2.com)
 //
 // (C) 2001 Ximian, Inc.
+//
 
 using System.Reflection;
 using System.Runtime.CompilerServices;
@@ -16,6 +19,7 @@ namespace System
                public string name_space;
                public Type parent;
                public Type etype;
+               public Type nested_in;
                public Assembly assembly;
                public TypeAttributes attrs;
                public int rank;
@@ -34,21 +38,30 @@ namespace System
                private static extern void get_type_info (RuntimeTypeHandle type, out MonoTypeInfo info);
 
                [MonoTODO]
-               internal MonoType (Object obj) {
+               internal MonoType (Object obj)
+               {
                        // this should not be used - lupus
                        type_from_obj (this, obj);
+                       
                        throw new NotImplementedException ();
                }
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                private static extern TypeAttributes get_attributes (Type type);
        
-               protected override TypeAttributes GetAttributeFlagsImpl () {
+               protected override TypeAttributes GetAttributeFlagsImpl ()
+               {
                        return get_attributes (this);
                }
 
                [MonoTODO]
-               protected override ConstructorInfo GetConstructorImpl (BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) {
+               protected override ConstructorInfo GetConstructorImpl (BindingFlags bindingAttr,
+                                                                      Binder binder,
+                                                                      CallingConventions callConvention,
+                                                                      Type[] types,
+                                                                      ParameterModifier[] modifiers)
+               {
+                       // FIXME
                        throw new NotImplementedException ();
                }
 
@@ -56,31 +69,41 @@ namespace System
                public extern override ConstructorInfo[] GetConstructors (BindingFlags bindingAttr);
 
                [MonoTODO]
-               public override EventInfo GetEvent (string name, BindingFlags bindingAttr) {
+               public override EventInfo GetEvent (string name, BindingFlags bindingAttr)
+               {
+                       // FIXME
                        throw new NotImplementedException ();
                }
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                public extern override EventInfo[] GetEvents (BindingFlags bindingAttr);
 
-               public override FieldInfo GetField( string name, BindingFlags bindingAttr) {
-                       //FIXME
-                       return null;
-               }
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               public extern override FieldInfo GetField (string name, BindingFlags bindingAttr);
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               [MonoTODO]
                public extern override FieldInfo[] GetFields (BindingFlags bindingAttr);
 
-               public override Type GetInterface (string name, bool ignoreCase) {
-                       throw new NotImplementedException ();
+               public override Type GetInterface (string name, bool ignoreCase)
+               {
+                       if (name == null)
+                               throw new ArgumentNullException ();
+
+                       Type[] interfaces = GetInterfaces();
+
+                       foreach (Type type in interfaces)
+                               if (String.Compare (type.Name, name, ignoreCase) == 0)
+                                       return type;
+
+                       return null;
                }
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                [MonoTODO]
                public extern override Type[] GetInterfaces();
                
-               public override MemberInfo[] GetMembers( BindingFlags bindingAttr) {
+               public override MemberInfo[] GetMembers( BindingFlags bindingAttr)
+               {
                        // FIXME
                        throw new NotImplementedException ();
                }
@@ -88,71 +111,137 @@ namespace System
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                public extern override MethodInfo[] GetMethods (BindingFlags bindingAttr);
 
-               protected override MethodInfo GetMethodImpl( string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) {
-                       // FIXME
-                       return null;
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               private static extern MethodInfo get_method (Type type, string name, Type[] types);
+
+
+               [MonoTODO]
+               protected override MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr,
+                                                            Binder binder,
+                                                            CallingConventions callConvention,
+                                                            Type[] types, ParameterModifier[] modifiers)
+               {
+                       return get_method (this, name, types);
                }
                
-               public override Type GetNestedType( string name, BindingFlags bindingAttr) {
+               public override Type GetNestedType( string name, BindingFlags bindingAttr)
+               {
                        // FIXME
-                       return null;
+                       throw new NotImplementedException ();
                }
 
-               public override Type[] GetNestedTypes (BindingFlags bindingAttr) {
-                       // FIXME
-                       return null;
-               }
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               public extern override Type[] GetNestedTypes (BindingFlags bindingAttr);
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                public extern override PropertyInfo[] GetProperties( BindingFlags bindingAttr);
-               
-               protected override PropertyInfo GetPropertyImpl( string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers) {
-                       // FIXME
-                       return null;
+
+               [MonoTODO]
+               protected override PropertyInfo GetPropertyImpl (string name, BindingFlags bindingAttr,
+                                                                Binder binder, Type returnType,
+                                                                Type[] types,
+                                                                ParameterModifier[] modifiers)
+               {
+                       // fixme: needs to use the binder, and send the modifiers to that binder
+                       if (null == name || types == null)
+                               throw new ArgumentNullException ();
+                       
+                       PropertyInfo ret = null;
+                       PropertyInfo [] props = GetProperties(bindingAttr);
+
+                       foreach (PropertyInfo info in props) {
+                                       if (info.Name != name) 
+                                               continue;
+
+                                       if (returnType != null)
+                                               if (info.GetGetMethod().ReturnType != returnType)
+                                                       continue;
+
+                                       if (types.Length > 0) {
+                                               ParameterInfo[] parameterInfo = info.GetIndexParameters ();
+
+                                               if (parameterInfo.Length != types.Length)
+                                                       continue;
+
+                                               int i;
+                                               bool match = true;
+
+                                               for (i = 0; i < types.Length; i ++)
+                                                       if (parameterInfo [i].ParameterType != types [i]) {
+                                                               match = false;
+                                                               break;
+                                                       }
+
+                                               if (!match)
+                                                       continue;
+                                       }
+
+                                       if (null != ret)
+                                               throw new AmbiguousMatchException();
+
+                                       ret = info;
+                       }
+
+                       return ret;
                }
 
-               protected override bool HasElementTypeImpl () {
+               protected override bool HasElementTypeImpl ()
+               {
                        return IsArrayImpl() || IsByRefImpl() || IsPointerImpl ();
                }
 
-               protected override bool IsArrayImpl () {
-                       return type_is_subtype_of (this, typeof (System.Array), false);
+               protected override bool IsArrayImpl ()
+               {
+                       return type_is_subtype_of (this, typeof (System.Array), false) && this != typeof (System.Array);
                }
-               protected override bool IsByRefImpl () {
+
+               protected override bool IsByRefImpl ()
+               {
                        MonoTypeInfo info;
+
                        get_type_info (_impl, out info);
                        return info.isbyref;
                }
-               protected override bool IsCOMObjectImpl () {
+
+               protected override bool IsCOMObjectImpl ()
+               {
                        return false;
                }
-               protected override bool IsPointerImpl () {
+
+               protected override bool IsPointerImpl ()
+               {
                        MonoTypeInfo info;
+
                        get_type_info (_impl, out info);
                        return info.ispointer;
                }
-               protected override bool IsPrimitiveImpl () {
+
+               protected override bool IsPrimitiveImpl ()
+               {
                        MonoTypeInfo info;
+
                        get_type_info (_impl, out info);
                        return info.isprimitive;
                }
-               protected override bool IsValueTypeImpl () {
+
+               protected override bool IsValueTypeImpl ()
+               {
                        return type_is_subtype_of (this, typeof (System.ValueType), false) &&
                                this != typeof (System.ValueType) &&
                                this != typeof (System.Enum);
                }
                
-               public override object InvokeMember( string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters) {
+               public override object InvokeMember (string name, BindingFlags invokeAttr,
+                                                    Binder binder, object target, object[] args,
+                                                    ParameterModifier[] modifiers,
+                                                    CultureInfo culture, string[] namedParameters)
+               {
                        // FIXME
-                       return null;
+                       throw new NotImplementedException ();
                }
 
-               public override Type GetElementType()
-               {
-                       MonoTypeInfo info;
-                       get_type_info (_impl, out info);
-                       return info.etype;
-               }
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               public extern override Type GetElementType ();
 
                public override Type UnderlyingSystemType {
                        get {
@@ -172,12 +261,12 @@ namespace System
 
                public override string AssemblyQualifiedName {
                        get {
-                               return assQualifiedName ();
+                               return getFullName () + ", " + Assembly.ToString ();
                        }
                }
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private extern string assQualifiedName();
+               private extern string getFullName();
 
                public override Type BaseType {
                        get {
@@ -189,13 +278,14 @@ namespace System
 
                public override string FullName {
                        get {
-                               string str = assQualifiedName ();
-                               return str.Split(',')[0];
+                               return getFullName ();
                        }
                }
 
                public override Guid GUID {
-                       get {return Guid.Empty;}
+                       get {
+                               return Guid.Empty;
+                       }
                }
 
                public override bool IsDefined (Type attributeType, bool inherit)
@@ -241,9 +331,19 @@ namespace System
                        }
                }
 
+               public override Type DeclaringType {
+                       get {
+                               MonoTypeInfo info;
+                               get_type_info (_impl, out info);
+                               return info.nested_in;
+                       }
+               }
+
                public override Type ReflectedType {
                        get {
-                               return null;
+                               MonoTypeInfo info;
+                               get_type_info (_impl, out info);
+                               return info.nested_in;
                        }
                }
 
@@ -253,8 +353,10 @@ namespace System
                        }
                }
 
-               public override int GetArrayRank () {
+               public override int GetArrayRank ()
+               {
                        MonoTypeInfo info;
+                       
                        get_type_info (_impl, out info);
                        return info.rank;
                }