/// <summary>
/// Reference to a type in the module being compiled.
/// </summary>
- public class TypeRef : ModifiableType, IClassRef {
-
+ 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;
base_type = code_gen.TypeManager.GetPeapiType (full_name);
if (base_type == null) {
- code_gen.Report.Error ("Reference to undefined class '" +
+ Report.Error ("Reference to undefined class '" +
FullName + "'");
return;
}
is_resolved = true;
}
- public IClassRef AsClassRef (CodeGen code_gen)
+ public BaseClassRef AsClassRef (CodeGen code_gen)
{
return this;
}