a4cfc9ca4fdd2985fc620038b0d4e006580f3609
[mono.git] / mcs / class / corlib / System.Reflection.Emit / GenericTypeParameterBuilder.cs
1 //
2 // System.Reflection.Emit.GenericTypeParameterBuilder
3 //
4 // Martin Baulig (martin@ximian.com)
5 //
6 // (C) 2004 Novell, Inc.
7 //
8
9 //
10 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
11 //
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
19 // 
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 // 
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 //
31
32 #if !FULL_AOT_RUNTIME
33 using System.Reflection;
34 using System.Reflection.Emit;
35 using System.Collections;
36 using System.Runtime.CompilerServices;
37 using System.Runtime.InteropServices;
38 using System.Globalization;
39 using System.Runtime.Serialization;
40
41 namespace System.Reflection.Emit
42 {
43         [ComVisible (true)]
44         [StructLayout (LayoutKind.Sequential)]
45         public sealed class GenericTypeParameterBuilder : 
46 #if NET_4_5
47                 TypeInfo
48 #else
49                 Type
50 #endif  
51         {
52         #region Sync with reflection.h
53                 private TypeBuilder tbuilder;
54                 private MethodBuilder mbuilder;
55                 private string name;
56                 private int index;
57                 private Type base_type;
58 #pragma warning disable 414
59                 private Type[] iface_constraints;
60                 private CustomAttributeBuilder[] cattrs;
61                 private GenericParameterAttributes attrs;
62 #pragma warning restore
63         #endregion
64
65                 public void SetBaseTypeConstraint (Type baseTypeConstraint)
66                 {
67                         this.base_type = baseTypeConstraint ?? typeof (object);
68                 }
69
70                 [ComVisible (true)]
71                 public void SetInterfaceConstraints (params Type[] interfaceConstraints)
72                 {
73                         this.iface_constraints = interfaceConstraints;
74                 }
75
76                 public void SetGenericParameterAttributes (GenericParameterAttributes genericParameterAttributes)
77                 {
78                         this.attrs = genericParameterAttributes;
79                 }
80
81                 internal GenericTypeParameterBuilder (TypeBuilder tbuilder,
82                                                       MethodBuilder mbuilder,
83                                                       string name, int index)
84                 {
85                         this.tbuilder = tbuilder;
86                         this.mbuilder = mbuilder;
87                         this.name = name;
88                         this.index = index;
89
90                         initialize ();
91                 }
92
93                 internal override Type InternalResolve ()
94                 {
95                         return tbuilder.InternalResolve ().GetGenericArguments () [index]; 
96                 }
97
98                 [MethodImplAttribute(MethodImplOptions.InternalCall)]
99                 private extern void initialize ();
100
101                 [ComVisible (true)]
102                 public override bool IsSubclassOf (Type c)
103                 {
104                         throw not_supported ();
105                 }
106
107                 protected override TypeAttributes GetAttributeFlagsImpl ()
108                 {
109 #if NET_4_0
110                         return TypeAttributes.Public;
111 #else
112                         throw not_supported ();
113 #endif
114                 }
115
116                 protected override ConstructorInfo GetConstructorImpl (BindingFlags bindingAttr,
117                                                                        Binder binder,
118                                                                        CallingConventions callConvention,
119                                                                        Type[] types,
120                                                                        ParameterModifier[] modifiers)
121                 {
122                         throw not_supported ();
123                 }
124
125                 [ComVisible (true)]
126                 public override ConstructorInfo[] GetConstructors (BindingFlags bindingAttr)
127                 {
128                         throw not_supported ();
129                 }
130
131                 public override EventInfo GetEvent (string name, BindingFlags bindingAttr)
132                 {
133                         throw not_supported ();
134                 }
135
136                 public override EventInfo[] GetEvents ()
137                 {
138                         throw not_supported ();
139                 }
140
141                 public override EventInfo[] GetEvents (BindingFlags bindingAttr)
142                 {
143                         throw not_supported ();
144                 }
145
146                 public override FieldInfo GetField (string name, BindingFlags bindingAttr)
147                 {
148                         throw not_supported ();
149                 }
150
151                 public override FieldInfo[] GetFields (BindingFlags bindingAttr)
152                 {
153                         throw not_supported ();
154                 }
155                 
156                 public override Type GetInterface (string name, bool ignoreCase)
157                 {
158                         throw not_supported ();
159                 }
160
161                 public override Type[] GetInterfaces ()
162                 {
163                         throw not_supported ();
164                 }
165                 
166                 public override MemberInfo[] GetMembers (BindingFlags bindingAttr)
167                 {
168                         throw not_supported ();
169                 }
170
171                 public override MemberInfo[] GetMember (string name, MemberTypes type, BindingFlags bindingAttr)
172                 {
173                         throw not_supported ();
174                 }
175
176                 public override MethodInfo [] GetMethods (BindingFlags bindingAttr)
177                 {
178                         throw not_supported ();
179                 }
180
181                 protected override MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr,
182                                                              Binder binder,
183                                                              CallingConventions callConvention,
184                                                              Type[] types, ParameterModifier[] modifiers)
185                 {
186                         throw not_supported ();
187                 }
188
189                 public override Type GetNestedType (string name, BindingFlags bindingAttr)
190                 {
191                         throw not_supported ();
192                 }
193
194                 public override Type[] GetNestedTypes (BindingFlags bindingAttr)
195                 {
196                         throw not_supported ();
197                 }
198
199                 public override PropertyInfo [] GetProperties (BindingFlags bindingAttr)
200                 {
201                         throw not_supported ();
202                 }
203
204                 protected override PropertyInfo GetPropertyImpl (string name, BindingFlags bindingAttr,
205                                                                  Binder binder, Type returnType,
206                                                                  Type[] types,
207                                                                  ParameterModifier[] modifiers)
208                 {
209                         throw not_supported ();
210                 }
211
212                 protected override bool HasElementTypeImpl ()
213                 {
214                         return false;
215                 }
216
217                 public override bool IsAssignableFrom (Type c)
218                 {
219                         throw not_supported ();
220                 }
221
222                 public override bool IsInstanceOfType (object o)
223                 {
224                         throw not_supported ();
225                 }
226
227                 protected override bool IsArrayImpl ()
228                 {
229                         return false;
230                 }
231
232                 protected override bool IsByRefImpl ()
233                 {
234                         return false;
235                 }
236
237                 protected override bool IsCOMObjectImpl ()
238                 {
239                         return false;
240                 }
241
242                 protected override bool IsPointerImpl ()
243                 {
244                         return false;
245                 }
246
247                 protected override bool IsPrimitiveImpl ()
248                 {
249                         return false;
250                 }
251
252                 protected override bool IsValueTypeImpl ()
253                 {
254                         return base_type != null ? base_type.IsValueType : false;
255                 }
256                 
257                 public override object InvokeMember (string name, BindingFlags invokeAttr,
258                                                      Binder binder, object target, object[] args,
259                                                      ParameterModifier[] modifiers,
260                                                      CultureInfo culture, string[] namedParameters)
261                 {
262                         throw not_supported ();
263                 }
264
265                 public override Type GetElementType ()
266                 {
267                         throw not_supported ();
268                 }
269
270                 public override Type UnderlyingSystemType {
271                         get {
272                                 return this;
273                         }
274                 }
275
276                 public override Assembly Assembly {
277                         get { return tbuilder.Assembly; }
278                 }
279
280                 public override string AssemblyQualifiedName {
281                         get { return null; }
282                 }
283
284                 public override Type BaseType {
285                         get { return base_type; }
286                 }
287
288                 public override string FullName {
289                         get { return null; }
290                 }
291
292                 public override Guid GUID {
293                         get { throw not_supported (); }
294                 }
295
296                 public override bool IsDefined (Type attributeType, bool inherit)
297                 {
298                         throw not_supported ();
299                 }
300
301                 public override object[] GetCustomAttributes (bool inherit)
302                 {
303                         throw not_supported ();
304                 }
305
306                 public override object[] GetCustomAttributes (Type attributeType, bool inherit)
307                 {
308                         throw not_supported ();
309                 }
310
311                 [ComVisible (true)]
312                 public override InterfaceMapping GetInterfaceMap (Type interfaceType)
313                 {
314                         throw not_supported ();
315                 }
316
317                 public override string Name {
318                         get { return name; }
319                 }
320
321                 public override string Namespace {
322                         get { return null; }
323                 }
324
325                 public override Module Module {
326                         get { return tbuilder.Module; }
327                 }
328
329                 public override Type DeclaringType {
330                         get { return mbuilder != null ? mbuilder.DeclaringType : tbuilder; }
331                 }
332
333                 public override Type ReflectedType {
334                         get { return DeclaringType; }
335                 }
336
337                 public override RuntimeTypeHandle TypeHandle {
338                         get { throw not_supported (); }
339                 }
340
341                 public override Type[] GetGenericArguments ()
342                 {
343                         throw new InvalidOperationException ();
344                 }
345
346                 public override Type GetGenericTypeDefinition ()
347                 {
348                         throw new InvalidOperationException ();
349                 }
350
351                 public override bool ContainsGenericParameters {
352                         get { return true; }
353                 }
354
355                 public override bool IsGenericParameter {
356                         get { return true; }
357                 }
358
359                 public override bool IsGenericType {
360                         get { return false; }
361                 }
362
363                 public override bool IsGenericTypeDefinition {
364                         get { return false; }
365                 }
366
367                 public override GenericParameterAttributes GenericParameterAttributes {
368                         get {
369                                 throw new NotSupportedException ();
370                         }
371                 }
372
373                 public override int GenericParameterPosition {
374                         get { return index; }
375                 }
376
377                 public override Type[] GetGenericParameterConstraints ()
378                 {
379                         throw new InvalidOperationException ();
380                 }
381
382                 public override MethodBase DeclaringMethod {
383                         get { return mbuilder; }
384                 }
385
386                 public void SetCustomAttribute (CustomAttributeBuilder customBuilder)
387                 {
388                         if (customBuilder == null)
389                                 throw new ArgumentNullException ("customBuilder");
390
391                         if (cattrs != null) {
392                                 CustomAttributeBuilder[] new_array = new CustomAttributeBuilder [cattrs.Length + 1];
393                                 cattrs.CopyTo (new_array, 0);
394                                 new_array [cattrs.Length] = customBuilder;
395                                 cattrs = new_array;
396                         } else {
397                                 cattrs = new CustomAttributeBuilder [1];
398                                 cattrs [0] = customBuilder;
399                         }
400                 }
401
402                 [MonoTODO ("unverified implementation")]
403                 public void SetCustomAttribute (ConstructorInfo con, byte [] binaryAttribute)
404                 {
405                         SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute));
406                 }
407
408                 private Exception not_supported ()
409                 {
410                         return new NotSupportedException ();
411                 }
412
413                 public override string ToString ()
414                 {
415                         return name;
416                 }
417
418                 [MonoTODO]
419                 public override bool Equals (object o)
420                 {
421                         return base.Equals (o);
422                 }
423
424                 [MonoTODO]
425                 public override int GetHashCode ()
426                 {
427                         return base.GetHashCode ();
428                 }
429
430                 public override Type MakeArrayType ()
431                 {
432                         return  new ArrayType (this, 0);
433                 }
434
435                 public override Type MakeArrayType (int rank)
436                 {
437                         if (rank < 1)
438                                 throw new IndexOutOfRangeException ();
439                         return new ArrayType (this, rank);
440                 }
441
442                 public override Type MakeByRefType ()
443                 {
444                         return new ByRefType (this);
445                 }
446
447                 [MonoTODO]
448                 public override Type MakeGenericType (params Type [] typeArguments)
449                 {
450                         return base.MakeGenericType (typeArguments);
451                 }
452
453                 public override Type MakePointerType ()
454                 {
455                         return new PointerType (this);
456                 }
457
458                 internal override bool IsUserType {
459                         get {
460                                 return false;
461                         }
462                 }
463         }
464 }
465 #endif