2 // support.cs: Support routines to work around the fact that System.Reflection.Emit
3 // can not introspect types that are being constructed
6 // Miguel de Icaza (miguel@ximian.com)
8 // (C) 2001 Ximian, Inc (http://www.ximian.com)
13 using System.Reflection;
14 using System.Collections;
15 using System.Reflection.Emit;
16 using System.Globalization;
18 namespace Mono.MonoBASIC {
20 public interface ParameterData {
21 Type ParameterType (int pos);
23 string ParameterName (int pos);
24 string ParameterDesc (int pos);
25 Expression DefaultValue (int pos);
26 Parameter.Modifier ParameterModifier (int pos);
29 public class ReflectionParameters : ParameterData {
31 bool last_arg_is_params = false;
33 public ReflectionParameters (ParameterInfo [] pi)
39 int count = pi.Length-1;
42 attrs = pi [count].GetCustomAttributes (TypeManager.param_array_type, true);
47 if (attrs.Length == 0)
50 last_arg_is_params = true;
54 public Type ParameterType (int pos)
56 if (last_arg_is_params && pos >= pi.Length - 1)
57 return pi [pi.Length - 1].ParameterType;
62 Type pt = pi [pos].ParameterType;
64 pt = pt.GetElementType();
69 public Expression DefaultValue (int pos)
73 if (last_arg_is_params && pos >= pi.Length - 1)
74 return pi [pi.Length - 1].ParameterType;
79 Type pt = pi [pos].ParameterType;
81 pt = pt.GetElementType();
87 public string ParameterName (int pos)
89 if (last_arg_is_params && pos >= pi.Length - 1)
90 return pi [pi.Length - 1].Name;
95 public string ParameterDesc (int pos)
97 StringBuilder sb = new StringBuilder ();
105 if (pos >= pi.Length - 1 && last_arg_is_params)
106 sb.Append ("params ");
108 sb.Append (TypeManager.MonoBASIC_Name (ParameterType (pos)));
110 return sb.ToString ();
114 public Parameter.Modifier ParameterModifier (int pos)
117 Parameter.Modifier pm = Parameter.Modifier.NONE;
120 if (last_arg_is_params) {
121 pm |= Parameter.Modifier.PARAMS;
125 Type t = pi [pos].ParameterType;
127 pm |= Parameter.Modifier.ISBYREF | Parameter.Modifier.REF;
129 if (pi [pos].IsOptional)
130 pm |= Parameter.Modifier.OPTIONAL;
143 public class InternalParameters : ParameterData {
146 public readonly Parameters Parameters;
148 public InternalParameters (Type [] param_types, Parameters parameters)
150 this.param_types = param_types;
151 this.Parameters = parameters;
154 public InternalParameters (DeclSpace ds, Parameters parameters)
155 : this (parameters.GetParameterInfo (ds), parameters)
161 if (param_types == null)
164 return param_types.Length;
168 public Type ParameterType (int pos)
170 if (param_types == null)
173 Parameter [] fixed_pars = Parameters.FixedParameters;
174 if (fixed_pars != null && pos < fixed_pars.Length)
175 return Parameters.FixedParameters [pos].ParameterType;
177 return Parameters.ArrayParameter.ParameterType;
180 public Expression DefaultValue (int pos)
182 Parameter [] fixed_pars = Parameters.FixedParameters;
183 if (fixed_pars != null && pos < fixed_pars.Length)
184 return Parameters.FixedParameters [pos].ParameterInitializer;
188 public string ParameterName (int pos)
192 if (pos >= Parameters.FixedParameters.Length)
193 p = Parameters.ArrayParameter;
195 p = Parameters.FixedParameters [pos];
200 public string ParameterDesc (int pos)
202 string tmp = String.Empty;
205 if (Parameters.FixedParameters == null || pos >= Parameters.FixedParameters.Length)
206 p = Parameters.ArrayParameter;
208 p = Parameters.FixedParameters [pos];
210 if (p.ModFlags == Parameter.Modifier.REF)
212 else if (p.ModFlags == Parameter.Modifier.OUT)
214 else if (p.ModFlags == Parameter.Modifier.PARAMS)
217 Type t = ParameterType (pos);
219 return tmp + TypeManager.MonoBASIC_Name (t);
222 public Parameter.Modifier ParameterModifier (int pos)
224 Parameter.Modifier mod;
226 if (Parameters.FixedParameters == null) {
227 if (Parameters.ArrayParameter != null)
228 mod = Parameters.ArrayParameter.ModFlags;
230 mod = Parameter.Modifier.NONE;
231 } else if (pos >= Parameters.FixedParameters.Length)
232 mod = Parameters.ArrayParameter.ModFlags;
234 mod = Parameters.FixedParameters [pos].ModFlags;
236 if ((mod & (Parameter.Modifier.REF | Parameter.Modifier.OUT)) != 0)
237 mod |= Parameter.Modifier.ISBYREF;
244 class PtrHashtable : Hashtable {
245 class PtrComparer : IComparer {
246 public int Compare (object x, object y)
255 public PtrHashtable ()
257 comparer = new PtrComparer ();
258 hcp = new CaseInsensitiveHashCodeProvider();
263 public class CaseInsensitiveHashtable : Hashtable {
264 public CaseInsensitiveHashtable() : base()
266 comparer = new CaseInsensitiveComparer();
267 hcp = new CaseInsensitiveHashCodeProvider();
272 // Compares member infos based on their name and
273 // also allows one argument to be a string
275 class MemberInfoCompare : IComparer {
277 public int Compare (object a, object b)
279 if (a == null || b == null){
280 Console.WriteLine ("Invalid information passed");
281 throw new Exception ();
285 return String.Compare ((string) a, ((MemberInfo)b).Name);
288 return String.Compare (((MemberInfo)a).Name, (string) b);
290 return String.Compare (((MemberInfo)a).Name, ((MemberInfo)b).Name);
296 public object Second;
298 public Pair (object f, object s)