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)
11 using System.Reflection.Emit;
12 using System.Reflection;
16 namespace Mono.CSharp {
18 public interface ParameterData {
19 Type ParameterType (int pos);
21 string ParameterDesc (int pos);
22 Parameter.Modifier ParameterModifier (int pos);
25 public class ReflectionParameters : ParameterData {
27 bool last_arg_is_params;
29 public ReflectionParameters (ParameterInfo [] pi)
35 int count = pi.Length-1;
37 a = pi [count-1].GetCustomAttributes (TypeManager.param_array_type, false);
41 last_arg_is_params = true;
45 public Type ParameterType (int pos)
47 return pi [pos].ParameterType;
50 public string ParameterDesc (int pos)
52 StringBuilder sb = new StringBuilder ();
60 if (pos == pi.Length - 1)
61 sb.Append ("params ");
63 sb.Append (TypeManager.CSharpName (ParameterType (pos)));
65 return sb.ToString ();
69 public Parameter.Modifier ParameterModifier (int pos)
72 return Parameter.Modifier.OUT;
74 if (pos == pi.Length-1)
75 if (last_arg_is_params)
76 return Parameter.Modifier.PARAMS;
78 return Parameter.Modifier.NONE;
89 public class InternalParameters : ParameterData {
92 Parameters parameters;
94 public InternalParameters (TypeContainer tc, Parameters parameters)
96 this.param_types = parameters.GetParameterInfo (tc);
97 this.parameters = parameters;
102 if (param_types == null)
105 return param_types.Length;
109 public Type ParameterType (int pos)
111 if (param_types == null)
114 int len = parameters.FixedParameters.Length;
118 p = parameters.ArrayParameter;
120 p = parameters.FixedParameters [pos];
122 p = parameters.ArrayParameter;
126 Type t = param_types [pos];
127 string name = t.FullName;
129 if (p.ModFlags == Parameter.Modifier.REF ||
130 p.ModFlags == Parameter.Modifier.OUT)
131 t = Type.GetType (name.Substring (0, name.Length - 1));
136 public string ParameterDesc (int pos)
141 if (pos >= parameters.FixedParameters.Length)
142 p = parameters.ArrayParameter;
144 p = parameters.FixedParameters [pos];
146 if (p.ModFlags == Parameter.Modifier.REF)
148 else if (p.ModFlags == Parameter.Modifier.OUT)
150 else if (p.ModFlags == Parameter.Modifier.PARAMS)
153 Type t = ParameterType (pos);
155 return tmp + TypeManager.CSharpName (t);
158 public Parameter.Modifier ParameterModifier (int pos)
160 if (pos >= parameters.FixedParameters.Length)
161 return parameters.ArrayParameter.ModFlags;
163 return parameters.FixedParameters [pos].ModFlags;