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.CSharp {
20 public interface ParameterData {
21 Type ParameterType (int pos);
23 string ParameterName (int pos);
24 string ParameterDesc (int pos);
25 Parameter.Modifier ParameterModifier (int pos);
28 public class ReflectionParameters : ParameterData {
30 bool last_arg_is_params = false;
32 public ReflectionParameters (ParameterInfo [] pi)
38 int count = pi.Length-1;
41 attrs = pi [count].GetCustomAttributes (TypeManager.param_array_type, true);
46 if (attrs.Length == 0)
49 last_arg_is_params = true;
53 public Type ParameterType (int pos)
55 if (last_arg_is_params && pos >= pi.Length - 1)
56 return pi [pi.Length - 1].ParameterType;
58 return pi [pos].ParameterType;
61 public string ParameterName (int pos)
63 if (last_arg_is_params && pos >= pi.Length - 1)
64 return pi [pi.Length - 1].Name;
69 public string ParameterDesc (int pos)
71 StringBuilder sb = new StringBuilder ();
79 if (pos >= pi.Length - 1 && last_arg_is_params)
80 sb.Append ("params ");
82 sb.Append (TypeManager.CSharpName (ParameterType (pos)));
84 return sb.ToString ();
88 public Parameter.Modifier ParameterModifier (int pos)
93 if (last_arg_is_params)
94 return Parameter.Modifier.PARAMS;
96 Type t = pi [pos].ParameterType;
98 return Parameter.Modifier.ISBYREF;
100 return Parameter.Modifier.NONE;
111 public class InternalParameters : ParameterData {
114 public readonly Parameters Parameters;
116 public InternalParameters (Type [] param_types, Parameters parameters)
118 this.param_types = param_types;
119 this.Parameters = parameters;
122 public InternalParameters (DeclSpace ds, Parameters parameters)
123 : this (parameters.GetParameterInfo (ds), parameters)
129 if (param_types == null)
132 return param_types.Length;
136 public Type ParameterType (int pos)
138 if (param_types == null)
141 Parameter [] fixed_pars = Parameters.FixedParameters;
142 if (fixed_pars != null){
143 int len = fixed_pars.Length;
145 return Parameters.FixedParameters [pos].ParameterType;
147 return Parameters.ArrayParameter.ParameterType;
149 return Parameters.ArrayParameter.ParameterType;
152 public string ParameterName (int pos)
156 if (pos >= Parameters.FixedParameters.Length)
157 p = Parameters.ArrayParameter;
159 p = Parameters.FixedParameters [pos];
164 public string ParameterDesc (int pos)
166 string tmp = String.Empty;
169 if (pos >= Parameters.FixedParameters.Length)
170 p = Parameters.ArrayParameter;
172 p = Parameters.FixedParameters [pos];
174 if (p.ModFlags == Parameter.Modifier.REF)
176 else if (p.ModFlags == Parameter.Modifier.OUT)
178 else if (p.ModFlags == Parameter.Modifier.PARAMS)
181 Type t = ParameterType (pos);
183 return tmp + TypeManager.CSharpName (t);
186 public Parameter.Modifier ParameterModifier (int pos)
188 Parameter.Modifier mod;
190 if (Parameters.FixedParameters == null) {
191 if (Parameters.ArrayParameter != null)
192 mod = Parameters.ArrayParameter.ModFlags;
194 mod = Parameter.Modifier.NONE;
195 } else if (pos >= Parameters.FixedParameters.Length)
196 mod = Parameters.ArrayParameter.ModFlags;
198 mod = Parameters.FixedParameters [pos].ModFlags;
200 if ((mod & (Parameter.Modifier.REF | Parameter.Modifier.OUT)) != 0)
201 mod |= Parameter.Modifier.ISBYREF;
208 class PtrHashtable : Hashtable {
209 class PtrComparer : IComparer {
210 public int Compare (object x, object y)
219 public PtrHashtable ()
221 comparer = new PtrComparer ();
226 // Compares member infos based on their name and
227 // also allows one argument to be a string
229 class MemberInfoCompare : IComparer {
231 public int Compare (object a, object b)
233 if (a == null || b == null){
234 Console.WriteLine ("Invalid information passed");
235 throw new Exception ();
239 return String.Compare ((string) a, ((MemberInfo)b).Name);
242 return String.Compare (((MemberInfo)a).Name, (string) b);
244 return String.Compare (((MemberInfo)a).Name, ((MemberInfo)b).Name);
250 public object Second;
252 public Pair (object f, object s)