In ilasm/tests:
[mono.git] / mcs / ilasm / codegen / GenericParameters.cs
1 //
2 // Mono.ILASM.GenericParameters
3 //
4 // Author(s):
5 //  Ankit Jain  <jankit@novell.com>
6 //
7 // Copyright 2006 Novell, Inc (http://www.novell.com)
8 //
9
10 using System;
11 using System.Collections;
12 using System.Text;
13
14 namespace Mono.ILASM {
15
16         public class GenericParameter {
17                 string id;
18                 int num;
19                 PEAPI.GenericParamAttributes attr;
20                 ArrayList constraintsList;
21                 
22                 public GenericParameter (string id) 
23                         : this (id, 0, null)
24                 {
25                 }
26
27                 public GenericParameter (string id, PEAPI.GenericParamAttributes attr, ArrayList constraints)
28                 {
29                         this.id = id;
30                         this.attr = attr;
31                         num = -1;
32                         constraintsList = null;
33                                 
34                         if (constraints != null)
35                                 foreach (ITypeRef typeref in constraints)
36                                         AddConstraint (typeref);
37                 }
38
39                 public string Id {
40                         get { return id; }
41                 }
42
43                 public int Num {
44                         get { return num; }
45                         set { num = value; }
46                 }
47
48                 public void AddConstraint (ITypeRef constraint)
49                 {
50                         if (constraint == null)
51                                 throw new ArgumentException ("constraint");
52
53                         if (constraintsList == null)
54                                 constraintsList = new ArrayList ();
55
56                         constraintsList.Add (constraint);
57                 }
58
59                 public override string ToString ()
60                 {
61                         return Id;
62                 }
63
64                 public void Resolve (CodeGen code_gen, PEAPI.MethodDef methoddef)
65                 {
66                         PEAPI.GenericParameter gp = methoddef.AddGenericParameter ((short) num, id, attr);
67                         ResolveConstraints (code_gen, gp);
68                 }
69
70                 public void Resolve (CodeGen code_gen, PEAPI.ClassDef classdef)
71                 {
72                         PEAPI.GenericParameter gp = classdef.AddGenericParameter ((short) num, id, attr);
73                         ResolveConstraints (code_gen, gp);
74                 }
75
76                 public void ResolveConstraints (GenericParameters type_gen_params, GenericParameters method_gen_params)
77                 {
78                         if (constraintsList == null)
79                                 return;
80                                 
81                         foreach (ITypeRef constraint in constraintsList) {
82                                 IGenericTypeRef gtr = constraint as IGenericTypeRef;
83                                 if (gtr != null)
84                                         gtr.Resolve (type_gen_params, method_gen_params);
85                         }
86                 }
87
88                 public void ResolveConstraints (CodeGen code_gen, PEAPI.GenericParameter gp)
89                 {
90                         if (constraintsList == null)
91                                 return;
92
93                         foreach (ITypeRef constraint in constraintsList) {
94                                 constraint.Resolve (code_gen);
95                                 gp.AddConstraint (constraint.PeapiType);
96                         }
97                 }
98
99         }
100
101         public class GenericParameters {
102                 ArrayList param_list;
103                 string param_str;
104
105                 public GenericParameters ()
106                 {
107                         param_list = null;
108                         param_str = null;
109                 }
110
111                 public int Count {
112                         get { return (param_list == null ? 0 : param_list.Count); }
113                 }
114
115                 public GenericParameter this [int index] {
116                         get { return (param_list != null ? (GenericParameter) param_list [index] : null); }
117                         set { Add (value); }
118                 }
119
120                 public void Add (GenericParameter gen_param)
121                 {
122                         if (gen_param == null)
123                                 throw new ArgumentException ("gen_param");
124
125                         if (param_list == null)
126                                 param_list = new ArrayList ();
127                         gen_param.Num = param_list.Count;
128                         param_list.Add (gen_param);
129                         param_str = null;
130                 }
131                 
132                 public int GetGenericParamNum (string id)
133                 {
134                         if (param_list == null)
135                                 //FIXME: Report error
136                                 throw new Exception (String.Format ("Invalid type parameter '{0}'", id));
137
138                         foreach (GenericParameter param in param_list)
139                                 if (param.Id == id)
140                                         return param.Num;
141                         return -1;
142                 }
143
144                 public void Resolve (CodeGen code_gen, PEAPI.ClassDef classdef)
145                 {
146                         foreach (GenericParameter param in param_list)
147                                 param.Resolve (code_gen, classdef);
148                 }
149                 
150                 public void Resolve (CodeGen code_gen, PEAPI.MethodDef methoddef)
151                 {
152                         foreach (GenericParameter param in param_list)
153                                 param.Resolve (code_gen, methoddef);
154                 }
155
156                 public void ResolveConstraints (GenericParameters type_gen_params, GenericParameters method_gen_params)
157                 {
158                         foreach (GenericParameter param in param_list)
159                                 param.ResolveConstraints (type_gen_params, method_gen_params);
160                         param_str = null;
161                 }
162
163                 private void MakeString ()
164                 {
165                         //Build full_name (foo < , >)
166                         StringBuilder sb = new StringBuilder ();
167                         sb.Append ("<");
168                         foreach (GenericParameter param in param_list)
169                                 sb.AppendFormat ("{0}, ", param);
170                         //Remove the extra ', ' at the end
171                         sb.Length -= 2;
172                         sb.Append (">");
173                         param_str = sb.ToString ();
174                 }
175
176                 public override string ToString ()
177                 {
178                         if (param_str == null)
179                                 MakeString ();
180                         return param_str;
181                 }
182         }
183
184 }