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 ParameterDesc (int pos);
24 Parameter.Modifier ParameterModifier (int pos);
27 public class ReflectionParameters : ParameterData {
29 bool last_arg_is_params = false;
31 public ReflectionParameters (ParameterInfo [] pi)
37 int count = pi.Length-1;
40 attrs = pi [count].GetCustomAttributes (TypeManager.param_array_type, true);
45 if (attrs.Length == 0)
48 last_arg_is_params = true;
52 public Type ParameterType (int pos)
54 if (last_arg_is_params && pos >= pi.Length - 1)
55 return pi [pi.Length - 1].ParameterType;
57 return pi [pos].ParameterType;
60 public string ParameterDesc (int pos)
62 StringBuilder sb = new StringBuilder ();
70 if (pos >= pi.Length - 1 && last_arg_is_params)
71 sb.Append ("params ");
73 sb.Append (TypeManager.CSharpName (ParameterType (pos)));
75 return sb.ToString ();
79 public Parameter.Modifier ParameterModifier (int pos)
84 if (last_arg_is_params)
85 return Parameter.Modifier.PARAMS;
87 Type t = pi [pos].ParameterType;
89 return Parameter.Modifier.OUT;
91 return Parameter.Modifier.NONE;
102 public class InternalParameters : ParameterData {
105 Parameters parameters;
107 public InternalParameters (Type [] param_types, Parameters parameters)
109 this.param_types = param_types;
110 this.parameters = parameters;
113 public InternalParameters (DeclSpace ds, Parameters parameters)
114 : this (parameters.GetParameterInfo (ds), parameters)
120 if (param_types == null)
123 return param_types.Length;
127 public Type ParameterType (int pos)
129 if (param_types == null)
132 Parameter [] fixed_pars = parameters.FixedParameters;
133 if (fixed_pars != null){
134 int len = fixed_pars.Length;
136 return parameters.FixedParameters [pos].ParameterType;
138 return parameters.ArrayParameter.ParameterType;
140 return parameters.ArrayParameter.ParameterType;
143 public string ParameterDesc (int pos)
145 string tmp = String.Empty;
148 if (pos >= parameters.FixedParameters.Length)
149 p = parameters.ArrayParameter;
151 p = parameters.FixedParameters [pos];
153 if (p.ModFlags == Parameter.Modifier.REF)
155 else if (p.ModFlags == Parameter.Modifier.OUT)
157 else if (p.ModFlags == Parameter.Modifier.PARAMS)
160 Type t = ParameterType (pos);
162 return tmp + TypeManager.CSharpName (t);
165 public Parameter.Modifier ParameterModifier (int pos)
167 if (parameters.FixedParameters == null) {
168 if (parameters.ArrayParameter != null)
169 return parameters.ArrayParameter.ModFlags;
171 return Parameter.Modifier.NONE;
174 if (pos >= parameters.FixedParameters.Length)
175 return parameters.ArrayParameter.ModFlags;
177 Parameter.Modifier m = parameters.FixedParameters [pos].ModFlags;
180 // We use a return value of "OUT" for "reference" parameters.
181 // both out and ref flags in the source map to reference parameters.
183 if (m == Parameter.Modifier.OUT || m == Parameter.Modifier.REF)
184 return Parameter.Modifier.OUT;
186 return Parameter.Modifier.NONE;
192 class PtrHashtable : Hashtable {
193 class PtrComparer : IComparer {
194 public int Compare (object x, object y)
203 public PtrHashtable ()
205 comparer = new PtrComparer ();
210 // Compares member infos based on their name and
211 // also allows one argument to be a string
213 class MemberInfoCompare : IComparer {
215 public int Compare (object a, object b)
217 if (a == null || b == null){
218 Console.WriteLine ("Invalid information passed");
219 throw new Exception ();
223 return String.Compare ((string) a, ((MemberInfo)b).Name);
226 return String.Compare (((MemberInfo)a).Name, (string) b);
228 return String.Compare (((MemberInfo)a).Name, ((MemberInfo)b).Name);
234 public object Second;
236 public Pair (object f, object s)