2006-11-14 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / ilasm / codegen / TypeRef.cs
index 8de8af7844c0eee93dea8b0c3e607ee26ed6416f..08846715f99e621f0d2bdcca96a59df6c1d79282 100644 (file)
@@ -15,74 +15,43 @@ namespace Mono.ILASM {
         /// <summary>
         /// Reference to a type in the module being compiled.
         /// </summary>
-        public class TypeRef : ModifiableType, IClassRef {
-
-                private enum ConversionMethod {
-                        MakeArray,
-                        MakeBoundArray,
-                        MakeManagedPointer,
-                        MakeUnmanagedPointer,
-                        MakeCustomModified
-                }
+        public class TypeRef : BaseClassRef {
 
                 private Location location;
-                private string full_name;
-                private string sig_mod;
-                private PEAPI.Type type;
-                private bool is_valuetype;
-
-                private bool is_resolved;
-
                 public static readonly TypeRef Ellipsis = new TypeRef ("ELLIPSIS", false, null);
                 public static readonly TypeRef Any = new TypeRef ("any", false, null);
 
                 public TypeRef (string full_name, bool is_valuetype, Location location)
+                        : this (full_name, is_valuetype, location, null, null)
                 {
-                        this.full_name = full_name;
-                        this.location = location;
-                        this.is_valuetype = is_valuetype;
-                        sig_mod = String.Empty;
-                        is_resolved = false;
                 }
 
-                public string FullName {
-                        get { return full_name + sig_mod; }
-                }
-
-                public override string SigMod {
-                        get { return sig_mod; }
-                        set { sig_mod = value; }
-                }
-
-                public PEAPI.Type PeapiType {
-                        get { return type; }
-                }
-
-                public PEAPI.Class PeapiClass {
-                        get { return type as PEAPI.Class; }
-                }
-
-                public bool IsResolved {
-                        get { return is_resolved; }
+                public TypeRef (string full_name, bool is_valuetype, Location location, ArrayList conv_list, string sig_mod)
+                        : base (full_name, is_valuetype, conv_list, sig_mod)
+                {
+                        this.location = location;
                 }
-
-                public void MakeValueClass ()
+                
+                public override BaseClassRef Clone ()
                 {
-                        is_valuetype = true;
+                        return new TypeRef (full_name, is_valuetype, location, (ArrayList) ConversionList.Clone (), sig_mod);
                 }
 
-                public  IMethodRef GetMethodRef (ITypeRef ret_type,
-                        PEAPI.CallConv call_conv, string name, ITypeRef[] param)
+                protected override BaseMethodRef CreateMethodRef (BaseTypeRef ret_type,
+                        PEAPI.CallConv call_conv, string name, BaseTypeRef[] param, int gen_param_count)
                 {
-                        return new MethodRef (this, call_conv, ret_type, name, param);
+                        if (SigMod == null | SigMod == "")
+                                return new MethodRef (this, call_conv, ret_type, name, param, gen_param_count);
+                        else
+                                return new TypeSpecMethodRef (this, call_conv, ret_type, name, param, gen_param_count);
                 }
 
-                public IFieldRef GetFieldRef (ITypeRef ret_type, string name)
+                protected override IFieldRef CreateFieldRef (BaseTypeRef ret_type, string name)
                 {
-                        return new FieldRef (this, ret_type, name);
+                         return new FieldRef (this, ret_type, name);
                 }
 
-                public void Resolve (CodeGen code_gen)
+                public override void Resolve (CodeGen code_gen)
                 {
                         if (is_resolved)
                                 return;
@@ -90,12 +59,18 @@ namespace Mono.ILASM {
                         PEAPI.Type base_type;
 
                         base_type = code_gen.TypeManager.GetPeapiType (full_name);
+
+                        if (base_type == null) {
+                                Report.Error ("Reference to undefined class '" +
+                                                       FullName + "'");
+                                return;
+                        }
                         type = Modify (code_gen, base_type);
 
                         is_resolved = true;
                 }
 
-                public IClassRef AsClassRef (CodeGen code_gen)
+                public BaseClassRef AsClassRef (CodeGen code_gen)
                 {
                         return this;
                 }