merged Sys.Web.Services 2.0 support in my branch:
[mono.git] / mcs / ilasm / codegen / GenericParamRef.cs
1 //
2 // Mono.ILASM.GenericParamRef
3 //
4 // Author(s):
5 //  Jackson Harper (Jackson@LatitudeGeo.com)
6 //  Ankit Jain  (JAnkit@novell.com)
7 //
8 // (C) 2003 Jackson Harper, All rights reserved
9 // (C) 2006 Novell, Inc (http://www.novell.com)
10 //
11
12
13 using System;
14 using System.Collections;
15
16 namespace Mono.ILASM {
17
18         public class GenericParamRef : BaseGenericTypeRef {
19
20                 /* PEAPI.Type type: Might get modified */
21                 /* Unmodified GenParam */
22                 private PEAPI.GenParam param;
23                 private bool is_added; /* Added to TypeSpec table ? */
24                 private static Hashtable param_table = new Hashtable ();
25
26                 public GenericParamRef (PEAPI.GenParam gen_param, string full_name)
27                         : this (gen_param, full_name, null)
28                 {
29                 }
30
31                 public GenericParamRef (PEAPI.GenParam gen_param, string full_name, ArrayList conv_list)
32                         : base (full_name, false, conv_list, "")
33                 {
34                         this.type = gen_param;
35                         this.param = gen_param;
36                         is_added = false;
37                 }
38
39                 public override string FullName {
40                         get { 
41                                 return (param.Type == PEAPI.GenParamType.Var ? "!" : "!!") 
42                                         + param.Index + sig_mod;
43                         }
44                 }
45
46                 public override void MakeValueClass ()
47                 {
48                         throw new InternalErrorException ("Not supported");
49                 }
50
51                 public override BaseClassRef Clone ()
52                 {
53                         return new GenericParamRef (param, full_name, (ArrayList) ConversionList.Clone ());
54                 }
55
56                 public override void ResolveNoTypeSpec (CodeGen code_gen)
57                 {
58                         if (is_resolved)
59                                 return;
60                         
61                         type = Modify (code_gen, type);
62                         is_resolved = true;
63                 }
64
65                 public override void Resolve (CodeGen code_gen)
66                 {
67                         ResolveNoTypeSpec (code_gen);
68                         if (is_added)
69                                 return;
70
71                         string key = param.Type.ToString () + param.Index.ToString ();
72                         PEAPI.GenParam val = (PEAPI.GenParam) param_table [key];
73                         if (val == null) {
74                                 code_gen.PEFile.AddGenericParam (param);
75                                 param_table [key] = param;
76                         } else {
77                                 /* Set this instance's "type" to the cached
78                                    PEAPI.GenParam, after applying modifications */
79                                 type = Modify (code_gen, val);
80                         }
81
82                         is_added = true;
83                 }
84                 
85                 public override void Resolve (GenericParameters type_gen_params, GenericParameters method_gen_params)
86                 {
87                         if (param.Name == "") {
88                                 /* Name wasn't specified */
89                                 return;
90                         }
91
92                         if (param.Type == PEAPI.GenParamType.MVar && method_gen_params != null)
93                                 param.Index = method_gen_params.GetGenericParamNum (param.Name); 
94                         else if (type_gen_params != null)
95                                 param.Index = type_gen_params.GetGenericParamNum (param.Name);
96
97                         if (param.Index < 0)
98                                 Report.Error (String.Format ("Invalid {0}type parameter '{1}'", 
99                                                         (param.Type == PEAPI.GenParamType.MVar ? "method " : ""),
100                                                          param.Name));
101                 }
102
103                 protected override BaseMethodRef CreateMethodRef (BaseTypeRef ret_type, PEAPI.CallConv call_conv,
104                                 string name, BaseTypeRef[] param, int gen_param_count)
105                 {
106                         return new TypeSpecMethodRef (this, call_conv, ret_type, name, param, gen_param_count);
107                 }
108
109                 protected override IFieldRef CreateFieldRef (BaseTypeRef ret_type, string name)
110                 {
111                         return new TypeSpecFieldRef (this, ret_type, name);
112                 }
113         }
114
115 }
116