* roottypes.cs: Rename from tree.cs.
[mono.git] / mcs / ilasm / codegen / ExternTypeRef.cs
index bcf6879bd4e4c6cde75474934c235dbd7ea64440..1480a024115c0cd4744fdb8983cb4279a94e58c1 100644 (file)
@@ -16,76 +16,51 @@ namespace Mono.ILASM {
         /// <summary>
         /// A reference to a type in another assembly
         /// </summary>
-        public class ExternTypeRef : ModifiableType, IClassRef, IScope {
+        public class ExternTypeRef : BaseClassRef , IScope {
 
-                private PEAPI.Type type;
                 private IScope extern_ref;
-                private string full_name;
-                private string sig_mod;
-                private bool is_valuetype;
-                private ExternTable extern_table;
-
-                private bool is_resolved;
-
                 private Hashtable nestedtypes_table;
                 private Hashtable nestedclass_table;
-                private Hashtable method_table;
-                private Hashtable field_table;
                 
-                public ExternTypeRef (IScope extern_ref, string full_name,
-                                bool is_valuetype, ExternTable extern_table)
+                public ExternTypeRef (IScope extern_ref, string full_name, bool is_valuetype) 
+                        : this (extern_ref, full_name, is_valuetype, null, null)
                 {
-                        this.extern_ref = extern_ref;
-                        this.full_name = full_name;
-                        this.is_valuetype = is_valuetype;
-                        this.extern_table = extern_table;
-                        sig_mod = String.Empty;
-
-                        nestedclass_table = new Hashtable ();
-                        nestedtypes_table = new Hashtable ();
-                        method_table = new Hashtable ();
-                        field_table = new Hashtable ();
-                        
-                        is_resolved = false;
                 }
 
                 private ExternTypeRef (IScope extern_ref, string full_name,
-                                bool is_valuetype, ExternTable extern_table,
-                                ArrayList conv_list) : this (extern_ref, full_name,
-                                                is_valuetype, extern_table)
+                                bool is_valuetype, ArrayList conv_list, string sig_mod)
+                       : base (full_name, is_valuetype, conv_list, sig_mod)
                 {
-                        ConversionList = conv_list;
+                        this.extern_ref = extern_ref;
+
+                        nestedclass_table = new Hashtable ();
+                        nestedtypes_table = new Hashtable ();
                 }
                 
-                public ExternTypeRef Clone ()
+                public override BaseClassRef Clone ()
                 {
-                        return new ExternTypeRef (extern_ref, full_name, is_valuetype,
-                                        extern_table, (ArrayList) ConversionList.Clone ());
-                }
-                
-                public PEAPI.Type PeapiType {
-                        get { return type; }
+                        return new ExternTypeRef (extern_ref, full_name, is_valuetype, 
+                                        (ArrayList) ConversionList.Clone (), sig_mod);
                 }
 
-                public PEAPI.Class PeapiClass {
-                        get { return type as PEAPI.Class; }
+                public override string FullName {
+                        get { 
+                                if (extern_ref == null)
+                                        return full_name + sig_mod;
+                                else
+                                        return extern_ref.FullName + (extern_ref is ExternTypeRef ? "/" : "") + full_name + sig_mod;
+                        }
                 }
 
-                public string FullName {
+                public string Name {
                         get { return full_name + sig_mod; }
                 }
 
-
-                public override string SigMod {
-                        get { return sig_mod; }
-                        set { sig_mod = value; }
-                }
-
                 public IScope ExternRef {
                         get { return extern_ref; }
                 }
 
-                public void Resolve (CodeGen code_gen)
+                public override void Resolve (CodeGen code_gen)
                 {
                         if (is_resolved)
                                 return;
@@ -101,38 +76,18 @@ namespace Mono.ILASM {
                         is_resolved = true;
                 }
 
-                public void MakeValueClass ()
+                protected override BaseMethodRef CreateMethodRef (BaseTypeRef ret_type, PEAPI.CallConv call_conv,
+                                string name, BaseTypeRef[] param, int gen_param_count)
                 {
-                        is_valuetype = true;
-                }
-
-                public IMethodRef GetMethodRef (ITypeRef ret_type, PEAPI.CallConv call_conv,
-                                string name, ITypeRef[] param)
-                {
-                        string sig = MethodDef.CreateSignature (ret_type, name, param);
-                        ExternMethodRef mr = method_table [sig] as ExternMethodRef;
-                        
-                        if (mr == null) {
-                                mr = new ExternMethodRef (this, ret_type, call_conv, name, param);
-                                method_table [sig] = mr;
-                        }
-
-                        return mr;
+                        return new ExternMethodRef (this, ret_type, call_conv, name, param, gen_param_count);
                 }
 
-                public IFieldRef GetFieldRef (ITypeRef ret_type, string name)
+                protected override IFieldRef CreateFieldRef (BaseTypeRef ret_type, string name)
                 {
-                        ExternFieldRef fr = field_table [name] as ExternFieldRef;
-
-                        if (fr == null) {
-                                fr = new ExternFieldRef (this, ret_type, name);
-                                field_table [name] = fr;
-                        }
-
-                        return fr;
+                        return new ExternFieldRef (this, ret_type, name);
                 }
 
-                public ExternTypeRef GetTypeRef (string _name, bool is_valuetype, ExternTable table)
+                public ExternTypeRef GetTypeRef (string _name, bool is_valuetype)
                 {
                         string first= _name;
                         string rest = "";
@@ -149,11 +104,11 @@ namespace Mono.ILASM {
                                 if (is_valuetype && rest == "")
                                         ext_typeref.MakeValueClass ();
                         } else {
-                                ext_typeref = new ExternTypeRef (this, first, is_valuetype, table);
+                                ext_typeref = new ExternTypeRef (this, first, is_valuetype);
                                 nestedtypes_table [first] = ext_typeref;
                         }        
                         
-                        return (rest == "" ? ext_typeref : ext_typeref.GetTypeRef (rest, is_valuetype, table));
+                        return (rest == "" ? ext_typeref : ext_typeref.GetTypeRef (rest, is_valuetype));
                 }
 
                 public PEAPI.IExternRef GetExternTypeRef ()
@@ -183,6 +138,22 @@ namespace Mono.ILASM {
 
                         return klass;
                 }        
+
+                public System.Type GetReflectedType ()
+                {
+                        ExternRef er = extern_ref as ExternRef;
+                        if (er != null) {
+                                ExternAssembly ea = er as ExternAssembly;
+                                if (ea != null) {
+                                        System.Reflection.Assembly asm = System.Reflection.Assembly.Load (ea.Name);
+
+                                        //Type name required here, so don't use FullName
+                                        return asm.GetType (Name);
+                                }/* else ExternModule */
+
+                        } /*else - nested type? */
+                        return null;
+                }
         }
 
 }