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
.MonoBASIC
{
20 public interface ParameterData
{
21 Type
ParameterType (int pos
);
23 string ParameterName (int pos
);
24 string ParameterDesc (int pos
);
25 Expression
DefaultValue (int pos
);
26 Parameter
.Modifier
ParameterModifier (int pos
);
29 public class ReflectionParameters
: ParameterData
{
31 bool last_arg_is_params
= false;
33 public ReflectionParameters (ParameterInfo
[] pi
)
39 int count
= pi
.Length
-1;
42 attrs
= pi
[count
].GetCustomAttributes (TypeManager
.param_array_type
, true);
47 if (attrs
.Length
== 0)
50 last_arg_is_params
= true;
54 public Type
ParameterType (int pos
)
56 if (last_arg_is_params
&& pos
>= pi
.Length
- 1)
57 return pi
[pi
.Length
- 1].ParameterType
;
62 Type pt
= pi
[pos
].ParameterType
;
64 pt
= pt
.GetElementType();
69 public Expression
DefaultValue (int pos
)
71 Type type
= pi
[pos
].DefaultValue
.GetType();
74 // TODO : Enum is not handled here since ParameterInfo
75 // is not returning correct Data type for Enum
77 switch (Type
.GetTypeCode(type
)){
79 return new ByteConstant ((byte) pi
[pos
].DefaultValue
);
81 return new CharConstant ((char) pi
[pos
].DefaultValue
);
83 return new StringConstant ((string) pi
[pos
].DefaultValue
);
85 return new ShortConstant ((short) pi
[pos
].DefaultValue
);
87 return new UShortConstant ((ushort) pi
[pos
].DefaultValue
);
89 return new IntConstant ((int) pi
[pos
].DefaultValue
);
91 return new UIntConstant ((uint) pi
[pos
].DefaultValue
);
93 return new LongConstant ((long) pi
[pos
].DefaultValue
);
95 return new ULongConstant ((ulong) pi
[pos
].DefaultValue
);
96 case TypeCode
.Boolean
:
97 return new BoolConstant ((bool) pi
[pos
].DefaultValue
);
98 case TypeCode
.DateTime
:
99 return new DateConstant ((DateTime
) pi
[pos
].DefaultValue
);
100 case TypeCode
.Decimal
:
101 return new DecimalConstant ((decimal) pi
[pos
].DefaultValue
);
102 case TypeCode
.Double
:
103 return new DoubleConstant ((double) pi
[pos
].DefaultValue
);
105 return new SByteConstant ((sbyte) pi
[pos
].DefaultValue
);
108 "Internal Error : cannot handle the data type" +
109 "received from ParameterInfo class");
113 if (last_arg_is_params
&& pos
>= pi
.Length
- 1)
114 return pi
[pi
.Length
- 1].ParameterType
;
116 if (pos
>= pi
.Length
)
119 Type pt
= pi
[pos
].ParameterType
;
121 pt
= pt
.GetElementType();
127 public string ParameterName (int pos
)
129 if (last_arg_is_params
&& pos
>= pi
.Length
- 1)
130 return pi
[pi
.Length
- 1].Name
;
132 return pi
[pos
].Name
;
135 public string ParameterDesc (int pos
)
137 StringBuilder sb
= new StringBuilder ();
145 if (pos
>= pi
.Length
- 1 && last_arg_is_params
)
146 sb
.Append ("params ");
148 sb
.Append (TypeManager
.MonoBASIC_Name (ParameterType (pos
)));
150 return sb
.ToString ();
154 public Parameter
.Modifier
ParameterModifier (int pos
)
157 Parameter
.Modifier pm
= Parameter
.Modifier
.NONE
;
160 if (last_arg_is_params
) {
161 pm
|= Parameter
.Modifier
.PARAMS
;
165 Type t
= pi
[pos
].ParameterType
;
167 pm
|= Parameter
.Modifier
.ISBYREF
| Parameter
.Modifier
.REF
;
169 if (pi
[pos
].IsOptional
)
170 pm
|= Parameter
.Modifier
.OPTIONAL
;
183 public class InternalParameters
: ParameterData
{
186 public readonly Parameters Parameters
;
188 public InternalParameters (Type
[] param_types
, Parameters parameters
)
190 this.param_types
= param_types
;
191 this.Parameters
= parameters
;
194 public InternalParameters (DeclSpace ds
, Parameters parameters
)
195 : this (parameters
.GetParameterInfo (ds
), parameters
)
201 if (param_types
== null)
204 return param_types
.Length
;
208 public Type
ParameterType (int pos
)
210 if (param_types
== null)
213 Parameter
[] fixed_pars
= Parameters
.FixedParameters
;
214 if (fixed_pars
!= null && pos
< fixed_pars
.Length
)
215 return Parameters
.FixedParameters
[pos
].ParameterType
;
217 return Parameters
.ArrayParameter
.ParameterType
;
220 public Expression
DefaultValue (int pos
)
222 Parameter
[] fixed_pars
= Parameters
.FixedParameters
;
223 if (fixed_pars
!= null && pos
< fixed_pars
.Length
)
224 return Parameters
.FixedParameters
[pos
].ParameterInitializer
;
228 public string ParameterName (int pos
)
232 if (pos
>= Parameters
.FixedParameters
.Length
)
233 p
= Parameters
.ArrayParameter
;
235 p
= Parameters
.FixedParameters
[pos
];
240 public string ParameterDesc (int pos
)
242 string tmp
= String
.Empty
;
245 if (Parameters
.FixedParameters
== null || pos
>= Parameters
.FixedParameters
.Length
)
246 p
= Parameters
.ArrayParameter
;
248 p
= Parameters
.FixedParameters
[pos
];
250 if (p
.ModFlags
== Parameter
.Modifier
.REF
)
252 else if (p
.ModFlags
== Parameter
.Modifier
.OUT
)
254 else if (p
.ModFlags
== Parameter
.Modifier
.PARAMS
)
257 Type t
= ParameterType (pos
);
259 return tmp
+ TypeManager
.MonoBASIC_Name (t
);
262 public Parameter
.Modifier
ParameterModifier (int pos
)
264 Parameter
.Modifier mod
;
266 if (Parameters
.FixedParameters
== null) {
267 if (Parameters
.ArrayParameter
!= null)
268 mod
= Parameters
.ArrayParameter
.ModFlags
;
270 mod
= Parameter
.Modifier
.NONE
;
271 } else if (pos
>= Parameters
.FixedParameters
.Length
)
272 mod
= Parameters
.ArrayParameter
.ModFlags
;
274 mod
= Parameters
.FixedParameters
[pos
].ModFlags
;
276 if ((mod
& (Parameter
.Modifier
.REF
| Parameter
.Modifier
.OUT
)) != 0)
277 mod
|= Parameter
.Modifier
.ISBYREF
;
284 class PtrHashtable
: Hashtable
{
285 class PtrComparer
: IComparer
{
286 public int Compare (object x
, object y
)
295 public PtrHashtable ()
297 comparer
= new PtrComparer ();
298 hcp
= new CaseInsensitiveHashCodeProvider();
303 public class CaseInsensitiveHashtable
: Hashtable
{
304 public CaseInsensitiveHashtable() : base()
306 comparer
= new CaseInsensitiveComparer();
307 hcp
= new CaseInsensitiveHashCodeProvider();
312 // Compares member infos based on their name and
313 // also allows one argument to be a string
315 class MemberInfoCompare
: IComparer
{
317 public int Compare (object a
, object b
)
319 if (a
== null || b
== null){
320 Console
.WriteLine ("Invalid information passed");
321 throw new Exception ();
325 return String
.Compare ((string) a
, ((MemberInfo
)b
).Name
);
328 return String
.Compare (((MemberInfo
)a
).Name
, (string) b
);
330 return String
.Compare (((MemberInfo
)a
).Name
, ((MemberInfo
)b
).Name
);
336 public object Second
;
338 public Pair (object f
, object s
)