2 // support.cs: Support routines to work around the fact that System.Reflection.Emit
\r
3 // can not introspect types that are being constructed
\r
6 // Miguel de Icaza (miguel@ximian.com)
\r
8 // (C) 2001 Ximian, Inc (http://www.ximian.com)
\r
13 using System.Reflection;
\r
14 using System.Collections;
\r
15 using System.Reflection.Emit;
\r
17 namespace Mono.CSharp {
\r
19 public interface ParameterData {
\r
20 Type ParameterType (int pos);
\r
22 string ParameterDesc (int pos);
\r
23 Parameter.Modifier ParameterModifier (int pos);
\r
26 public class ReflectionParameters : ParameterData {
\r
27 ParameterInfo [] pi;
\r
28 bool last_arg_is_params;
\r
30 public ReflectionParameters (ParameterInfo [] pi)
\r
36 int count = pi.Length-1;
\r
39 a = pi [count].GetCustomAttributes (TypeManager.param_array_type, false);
\r
43 last_arg_is_params = true;
\r
47 public Type ParameterType (int pos)
\r
49 if (last_arg_is_params && pos >= pi.Length - 1)
\r
50 return pi [pi.Length -1].ParameterType;
\r
52 return pi [pos].ParameterType;
\r
55 public string ParameterDesc (int pos)
\r
57 StringBuilder sb = new StringBuilder ();
\r
65 if (pos >= pi.Length - 1 && last_arg_is_params)
\r
66 sb.Append ("params ");
\r
68 sb.Append (TypeManager.CSharpName (ParameterType (pos)));
\r
70 return sb.ToString ();
\r
74 public Parameter.Modifier ParameterModifier (int pos)
\r
76 if (pos >= pi.Length - 1)
\r
77 if (last_arg_is_params)
\r
78 return Parameter.Modifier.PARAMS;
\r
80 Type t = pi [pos].ParameterType;
\r
82 return Parameter.Modifier.OUT;
\r
84 return Parameter.Modifier.NONE;
\r
95 public class InternalParameters : ParameterData {
\r
96 Type [] param_types;
\r
98 Parameters parameters;
\r
100 public InternalParameters (Type [] param_types, Parameters parameters)
\r
102 this.param_types = param_types;
\r
103 this.parameters = parameters;
\r
106 public InternalParameters (TypeContainer tc, Parameters parameters)
\r
107 : this (parameters.GetParameterInfo (tc), parameters)
\r
113 if (param_types == null)
\r
116 return param_types.Length;
\r
120 public Type ParameterType (int pos)
\r
122 if (param_types == null)
\r
125 Parameter [] fixed_pars = parameters.FixedParameters;
\r
126 if (fixed_pars != null){
\r
127 int len = fixed_pars.Length;
\r
129 return parameters.FixedParameters [pos].ParameterType;
\r
131 return parameters.ArrayParameter.ParameterType;
\r
133 return parameters.ArrayParameter.ParameterType;
\r
136 public string ParameterDesc (int pos)
\r
141 if (pos >= parameters.FixedParameters.Length)
\r
142 p = parameters.ArrayParameter;
\r
144 p = parameters.FixedParameters [pos];
\r
146 if (p.ModFlags == Parameter.Modifier.REF)
\r
148 else if (p.ModFlags == Parameter.Modifier.OUT)
\r
150 else if (p.ModFlags == Parameter.Modifier.PARAMS)
\r
153 Type t = ParameterType (pos);
\r
155 return tmp + TypeManager.CSharpName (t);
\r
158 public Parameter.Modifier ParameterModifier (int pos)
\r
160 if (parameters.FixedParameters == null)
\r
161 return parameters.ArrayParameter.ModFlags;
\r
163 if (pos >= parameters.FixedParameters.Length)
\r
164 return parameters.ArrayParameter.ModFlags;
\r
166 Parameter.Modifier m = parameters.FixedParameters [pos].ModFlags;
\r
169 // We use a return value of "OUT" for "reference" parameters.
\r
170 // both out and ref flags in the source map to reference parameters.
\r
172 if (m == Parameter.Modifier.OUT || m == Parameter.Modifier.REF)
\r
173 return Parameter.Modifier.OUT;
\r
175 return Parameter.Modifier.NONE;
\r
181 class PtrHashtable : Hashtable {
\r
182 class PtrComparer : IComparer {
\r
183 public int Compare (object x, object y)
\r
192 public PtrHashtable ()
\r
194 comparer = new PtrComparer ();
\r
199 // Compares member infos based on their name and
\r
200 // also allows one argument to be a string
\r
202 class MemberInfoCompare : IComparer {
\r
204 public int Compare (object a, object b)
\r
206 if (a == null || b == null){
\r
207 Console.WriteLine ("Invalid information passed");
\r
208 throw new Exception ();
\r
212 return String.Compare ((string) a, ((MemberInfo)b).Name);
\r
215 return String.Compare (((MemberInfo)a).Name, (string) b);
\r
217 return String.Compare (((MemberInfo)a).Name, ((MemberInfo)b).Name);
\r
222 public object First;
\r
223 public object Second;
\r
225 public Pair (object f, object s)
\r