2 // Mono.ILASM.GenericParameters
5 // Ankit Jain <jankit@novell.com>
7 // Copyright 2006 Novell, Inc (http://www.novell.com)
11 using System.Collections;
14 namespace Mono.ILASM {
16 public class GenericParameter {
19 PEAPI.GenericParamAttributes attr;
20 ArrayList constraintsList;
22 public GenericParameter (string id)
27 public GenericParameter (string id, PEAPI.GenericParamAttributes attr, ArrayList constraints)
32 constraintsList = null;
34 if (constraints != null)
35 foreach (ITypeRef typeref in constraints)
36 AddConstraint (typeref);
48 public void AddConstraint (ITypeRef constraint)
50 if (constraint == null)
51 throw new ArgumentException ("constraint");
53 if (constraintsList == null)
54 constraintsList = new ArrayList ();
56 constraintsList.Add (constraint);
59 public override string ToString ()
64 public void Resolve (CodeGen code_gen, PEAPI.MethodDef methoddef)
66 PEAPI.GenericParameter gp = methoddef.AddGenericParameter ((short) num, id, attr);
67 ResolveConstraints (code_gen, gp);
70 public void Resolve (CodeGen code_gen, PEAPI.ClassDef classdef)
72 PEAPI.GenericParameter gp = classdef.AddGenericParameter ((short) num, id, attr);
73 ResolveConstraints (code_gen, gp);
76 public void ResolveConstraints (GenericParameters type_gen_params, GenericParameters method_gen_params)
78 if (constraintsList == null)
81 foreach (ITypeRef constraint in constraintsList) {
82 IGenericTypeRef gtr = constraint as IGenericTypeRef;
84 gtr.Resolve (type_gen_params, method_gen_params);
88 public void ResolveConstraints (CodeGen code_gen, PEAPI.GenericParameter gp)
90 if (constraintsList == null)
93 foreach (ITypeRef constraint in constraintsList) {
94 constraint.Resolve (code_gen);
95 gp.AddConstraint (constraint.PeapiType);
101 public class GenericParameters {
102 ArrayList param_list;
105 public GenericParameters ()
112 get { return (param_list == null ? 0 : param_list.Count); }
115 public GenericParameter this [int index] {
116 get { return (param_list != null ? (GenericParameter) param_list [index] : null); }
120 public void Add (GenericParameter gen_param)
122 if (gen_param == null)
123 throw new ArgumentException ("gen_param");
125 if (param_list == null)
126 param_list = new ArrayList ();
127 gen_param.Num = param_list.Count;
128 param_list.Add (gen_param);
132 public int GetGenericParamNum (string id)
134 if (param_list == null)
135 //FIXME: Report error
136 throw new Exception (String.Format ("Invalid type parameter '{0}'", id));
138 foreach (GenericParameter param in param_list)
144 public void Resolve (CodeGen code_gen, PEAPI.ClassDef classdef)
146 foreach (GenericParameter param in param_list)
147 param.Resolve (code_gen, classdef);
150 public void Resolve (CodeGen code_gen, PEAPI.MethodDef methoddef)
152 foreach (GenericParameter param in param_list)
153 param.Resolve (code_gen, methoddef);
156 public void ResolveConstraints (GenericParameters type_gen_params, GenericParameters method_gen_params)
158 foreach (GenericParameter param in param_list)
159 param.ResolveConstraints (type_gen_params, method_gen_params);
163 private void MakeString ()
165 //Build full_name (foo < , >)
166 StringBuilder sb = new StringBuilder ();
168 foreach (GenericParameter param in param_list)
169 sb.AppendFormat ("{0}, ", param);
170 //Remove the extra ', ' at the end
173 param_str = sb.ToString ();
176 public override string ToString ()
178 if (param_str == null)