2006-11-14 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / ilasm / codegen / TypeRef.cs
index dfb2c032743be846bd968c8b1551d98f6a3eac58..08846715f99e621f0d2bdcca96a59df6c1d79282 100644 (file)
@@ -7,30 +7,80 @@
 // (C) 2003 Jackson Harper, All rights reserved
 //
 
-using PEAPI;
 using System;
-
+using System.Collections;
 
 namespace Mono.ILASM {
 
-       public class TypeRef {
+        /// <summary>
+        /// Reference to a type in the module being compiled.
+        /// </summary>
+        public class TypeRef : BaseClassRef {
 
-               public readonly PEAPI.Type Type;
-               public readonly string FullName;
+                private Location location;
+                public static readonly TypeRef Ellipsis = new TypeRef ("ELLIPSIS", false, null);
+                public static readonly TypeRef Any = new TypeRef ("any", false, null);
 
-               public TypeRef (PEAPI.Type type, string full_name)
-               {
-                       Type = type;
-                       FullName = full_name;
-               }
-       
-               public override string ToString ()
-               {
-                       return FullName;
-               }
-       }
+                public TypeRef (string full_name, bool is_valuetype, Location location)
+                        : this (full_name, is_valuetype, location, null, null)
+                {
+                }
 
-}
+                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 override BaseClassRef Clone ()
+                {
+                        return new TypeRef (full_name, is_valuetype, location, (ArrayList) ConversionList.Clone (), sig_mod);
+                }
+
+                protected override BaseMethodRef CreateMethodRef (BaseTypeRef ret_type,
+                        PEAPI.CallConv call_conv, string name, BaseTypeRef[] param, int gen_param_count)
+                {
+                        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);
+                }
+
+                protected override IFieldRef CreateFieldRef (BaseTypeRef ret_type, string name)
+                {
+                         return new FieldRef (this, ret_type, name);
+                }
+
+                public override void Resolve (CodeGen code_gen)
+                {
+                        if (is_resolved)
+                                return;
+
+                        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 BaseClassRef AsClassRef (CodeGen code_gen)
+                {
+                        return this;
+                }
+
+                public override string ToString ()
+                {
+                        return FullName;
+                }
+
+        }
+
+}