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;
17 namespace Mono.CSharp {
19 public interface ParameterData {
20 Type ParameterType (int pos);
22 string ParameterDesc (int pos);
23 Parameter.Modifier ParameterModifier (int pos);
26 public class ReflectionParameters : ParameterData {
28 bool last_arg_is_params = false;
30 public ReflectionParameters (ParameterInfo [] pi)
36 int count = pi.Length-1;
39 attrs = pi [count].GetCustomAttributes (TypeManager.param_array_type, true);
44 if (attrs.Length == 0)
47 last_arg_is_params = true;
51 public Type ParameterType (int pos)
53 if (last_arg_is_params && pos >= pi.Length - 1)
54 return pi [pi.Length - 1].ParameterType;
56 return pi [pos].ParameterType;
59 public string ParameterDesc (int pos)
61 StringBuilder sb = new StringBuilder ();
69 if (pos >= pi.Length - 1 && last_arg_is_params)
70 sb.Append ("params ");
72 sb.Append (TypeManager.CSharpName (ParameterType (pos)));
74 return sb.ToString ();
78 public Parameter.Modifier ParameterModifier (int pos)
83 if (last_arg_is_params)
84 return Parameter.Modifier.PARAMS;
86 Type t = pi [pos].ParameterType;
88 return Parameter.Modifier.OUT;
90 return Parameter.Modifier.NONE;
101 public class InternalParameters : ParameterData {
104 Parameters parameters;
106 public InternalParameters (Type [] param_types, Parameters parameters)
108 this.param_types = param_types;
109 this.parameters = parameters;
112 public InternalParameters (DeclSpace ds, Parameters parameters)
113 : this (parameters.GetParameterInfo (ds), parameters)
119 if (param_types == null)
122 return param_types.Length;
126 public Type ParameterType (int pos)
128 if (param_types == null)
131 Parameter [] fixed_pars = parameters.FixedParameters;
132 if (fixed_pars != null){
133 int len = fixed_pars.Length;
135 return parameters.FixedParameters [pos].ParameterType;
137 return parameters.ArrayParameter.ParameterType;
139 return parameters.ArrayParameter.ParameterType;
142 public string ParameterDesc (int pos)
144 string tmp = String.Empty;
147 if (pos >= parameters.FixedParameters.Length)
148 p = parameters.ArrayParameter;
150 p = parameters.FixedParameters [pos];
152 if (p.ModFlags == Parameter.Modifier.REF)
154 else if (p.ModFlags == Parameter.Modifier.OUT)
156 else if (p.ModFlags == Parameter.Modifier.PARAMS)
159 Type t = ParameterType (pos);
161 return tmp + TypeManager.CSharpName (t);
164 public Parameter.Modifier ParameterModifier (int pos)
166 if (parameters.FixedParameters == null) {
167 if (parameters.ArrayParameter != null)
168 return parameters.ArrayParameter.ModFlags;
170 return Parameter.Modifier.NONE;
173 if (pos >= parameters.FixedParameters.Length)
174 return parameters.ArrayParameter.ModFlags;
176 Parameter.Modifier m = parameters.FixedParameters [pos].ModFlags;
179 // We use a return value of "OUT" for "reference" parameters.
180 // both out and ref flags in the source map to reference parameters.
182 if (m == Parameter.Modifier.OUT || m == Parameter.Modifier.REF)
183 return Parameter.Modifier.OUT;
185 return Parameter.Modifier.NONE;
191 class PtrHashtable : Hashtable {
192 class PtrComparer : IComparer {
193 public int Compare (object x, object y)
202 public PtrHashtable ()
204 comparer = new PtrComparer ();
209 // Compares member infos based on their name and
210 // also allows one argument to be a string
212 class MemberInfoCompare : IComparer {
214 public int Compare (object a, object b)
216 if (a == null || b == null){
217 Console.WriteLine ("Invalid information passed");
218 throw new Exception ();
222 return String.Compare ((string) a, ((MemberInfo)b).Name);
225 return String.Compare (((MemberInfo)a).Name, (string) b);
227 return String.Compare (((MemberInfo)a).Name, ((MemberInfo)b).Name);
233 public object Second;
235 public Pair (object f, object s)