2 // typemanager.cs: C# type manager
4 // Author: Miguel de Icaza (miguel@gnu.org)
5 // Ravi Pratap (ravi@ximian.com)
6 // Marek Safar (marek.safar@gmail.com)
8 // Dual licensed under the terms of the MIT X11 or GNU GPL
10 // Copyright 2001-2003 Ximian, Inc (http://www.ximian.com)
11 // Copyright 2003-2011 Novell, Inc.
12 // Copyright 2011 Xamarin Inc
16 using System.Globalization;
17 using System.Collections.Generic;
24 // All compiler built-in types (they have to exist otherwise the compiler will not work)
26 public class BuiltinTypes
28 public readonly BuiltinTypeSpec Object;
29 public readonly BuiltinTypeSpec ValueType;
30 public readonly BuiltinTypeSpec Attribute;
32 public readonly BuiltinTypeSpec Int;
33 public readonly BuiltinTypeSpec UInt;
34 public readonly BuiltinTypeSpec Long;
35 public readonly BuiltinTypeSpec ULong;
36 public readonly BuiltinTypeSpec Float;
37 public readonly BuiltinTypeSpec Double;
38 public readonly BuiltinTypeSpec Char;
39 public readonly BuiltinTypeSpec Short;
40 public readonly BuiltinTypeSpec Decimal;
41 public readonly BuiltinTypeSpec Bool;
42 public readonly BuiltinTypeSpec SByte;
43 public readonly BuiltinTypeSpec Byte;
44 public readonly BuiltinTypeSpec UShort;
45 public readonly BuiltinTypeSpec String;
47 public readonly BuiltinTypeSpec Enum;
48 public readonly BuiltinTypeSpec Delegate;
49 public readonly BuiltinTypeSpec MulticastDelegate;
50 public readonly BuiltinTypeSpec Void;
51 public readonly BuiltinTypeSpec Array;
52 public readonly BuiltinTypeSpec Type;
53 public readonly BuiltinTypeSpec IEnumerator;
54 public readonly BuiltinTypeSpec IEnumerable;
55 public readonly BuiltinTypeSpec IDisposable;
56 public readonly BuiltinTypeSpec IntPtr;
57 public readonly BuiltinTypeSpec UIntPtr;
58 public readonly BuiltinTypeSpec RuntimeFieldHandle;
59 public readonly BuiltinTypeSpec RuntimeTypeHandle;
60 public readonly BuiltinTypeSpec Exception;
63 // These are internal buil-in types which depend on other
64 // build-in type (mostly object)
66 public readonly BuiltinTypeSpec Dynamic;
68 // Predefined operators tables
69 public readonly Binary.PredefinedOperator[] OperatorsBinaryStandard;
70 public readonly Binary.PredefinedOperator[] OperatorsBinaryEquality;
71 public readonly Binary.PredefinedOperator[] OperatorsBinaryUnsafe;
72 public readonly TypeSpec[][] OperatorsUnary;
73 public readonly TypeSpec[] OperatorsUnaryMutator;
75 public readonly TypeSpec[] BinaryPromotionsTypes;
77 readonly BuiltinTypeSpec[] types;
79 public BuiltinTypes ()
81 Object = new BuiltinTypeSpec (MemberKind.Class, "System", "Object", BuiltinTypeSpec.Type.Object);
82 ValueType = new BuiltinTypeSpec (MemberKind.Class, "System", "ValueType", BuiltinTypeSpec.Type.ValueType);
83 Attribute = new BuiltinTypeSpec (MemberKind.Class, "System", "Attribute", BuiltinTypeSpec.Type.Attribute);
85 Int = new BuiltinTypeSpec (MemberKind.Struct, "System", "Int32", BuiltinTypeSpec.Type.Int);
86 Long = new BuiltinTypeSpec (MemberKind.Struct, "System", "Int64", BuiltinTypeSpec.Type.Long);
87 UInt = new BuiltinTypeSpec (MemberKind.Struct, "System", "UInt32", BuiltinTypeSpec.Type.UInt);
88 ULong = new BuiltinTypeSpec (MemberKind.Struct, "System", "UInt64", BuiltinTypeSpec.Type.ULong);
89 Byte = new BuiltinTypeSpec (MemberKind.Struct, "System", "Byte", BuiltinTypeSpec.Type.Byte);
90 SByte = new BuiltinTypeSpec (MemberKind.Struct, "System", "SByte", BuiltinTypeSpec.Type.SByte);
91 Short = new BuiltinTypeSpec (MemberKind.Struct, "System", "Int16", BuiltinTypeSpec.Type.Short);
92 UShort = new BuiltinTypeSpec (MemberKind.Struct, "System", "UInt16", BuiltinTypeSpec.Type.UShort);
94 IEnumerator = new BuiltinTypeSpec (MemberKind.Interface, "System.Collections", "IEnumerator", BuiltinTypeSpec.Type.IEnumerator);
95 IEnumerable = new BuiltinTypeSpec (MemberKind.Interface, "System.Collections", "IEnumerable", BuiltinTypeSpec.Type.IEnumerable);
96 IDisposable = new BuiltinTypeSpec (MemberKind.Interface, "System", "IDisposable", BuiltinTypeSpec.Type.IDisposable);
98 Char = new BuiltinTypeSpec (MemberKind.Struct, "System", "Char", BuiltinTypeSpec.Type.Char);
99 String = new BuiltinTypeSpec (MemberKind.Class, "System", "String", BuiltinTypeSpec.Type.String);
100 Float = new BuiltinTypeSpec (MemberKind.Struct, "System", "Single", BuiltinTypeSpec.Type.Float);
101 Double = new BuiltinTypeSpec (MemberKind.Struct, "System", "Double", BuiltinTypeSpec.Type.Double);
102 Decimal = new BuiltinTypeSpec (MemberKind.Struct, "System", "Decimal", BuiltinTypeSpec.Type.Decimal);
103 Bool = new BuiltinTypeSpec (MemberKind.Struct, "System", "Boolean", BuiltinTypeSpec.Type.Bool);
104 IntPtr = new BuiltinTypeSpec (MemberKind.Struct, "System", "IntPtr", BuiltinTypeSpec.Type.IntPtr);
105 UIntPtr = new BuiltinTypeSpec (MemberKind.Struct, "System", "UIntPtr", BuiltinTypeSpec.Type.UIntPtr);
107 MulticastDelegate = new BuiltinTypeSpec (MemberKind.Class, "System", "MulticastDelegate", BuiltinTypeSpec.Type.MulticastDelegate);
108 Delegate = new BuiltinTypeSpec (MemberKind.Class, "System", "Delegate", BuiltinTypeSpec.Type.Delegate);
109 Enum = new BuiltinTypeSpec (MemberKind.Class, "System", "Enum", BuiltinTypeSpec.Type.Enum);
110 Array = new BuiltinTypeSpec (MemberKind.Class, "System", "Array", BuiltinTypeSpec.Type.Array);
111 Void = new BuiltinTypeSpec (MemberKind.Void, "System", "Void", BuiltinTypeSpec.Type.Other);
112 Type = new BuiltinTypeSpec (MemberKind.Class, "System", "Type", BuiltinTypeSpec.Type.Type);
113 Exception = new BuiltinTypeSpec (MemberKind.Class, "System", "Exception", BuiltinTypeSpec.Type.Exception);
114 RuntimeFieldHandle = new BuiltinTypeSpec (MemberKind.Struct, "System", "RuntimeFieldHandle", BuiltinTypeSpec.Type.Other);
115 RuntimeTypeHandle = new BuiltinTypeSpec (MemberKind.Struct, "System", "RuntimeTypeHandle", BuiltinTypeSpec.Type.Other);
117 // TODO: Maybe I should promote it to different kind for faster compares
118 Dynamic = new BuiltinTypeSpec ("dynamic", BuiltinTypeSpec.Type.Dynamic);
120 OperatorsBinaryStandard = Binary.CreateStandardOperatorsTable (this);
121 OperatorsBinaryEquality = Binary.CreateEqualityOperatorsTable (this);
122 OperatorsBinaryUnsafe = Binary.CreatePointerOperatorsTable (this);
123 OperatorsUnary = Unary.CreatePredefinedOperatorsTable (this);
124 OperatorsUnaryMutator = UnaryMutator.CreatePredefinedOperatorsTable (this);
126 BinaryPromotionsTypes = ConstantFold.CreateBinaryPromotionsTypes (this);
128 types = new BuiltinTypeSpec[] {
129 Object, ValueType, Attribute,
130 Int, UInt, Long, ULong, Float, Double, Char, Short, Decimal, Bool, SByte, Byte, UShort, String,
131 Enum, Delegate, MulticastDelegate, Void, Array, Type, IEnumerator, IEnumerable, IDisposable,
132 IntPtr, UIntPtr, RuntimeFieldHandle, RuntimeTypeHandle, Exception };
135 public BuiltinTypeSpec[] AllTypes {
141 public bool CheckDefinitions (ModuleContainer module)
143 var ctx = module.Compiler;
144 foreach (var p in types) {
145 var found = PredefinedType.Resolve (module, p.Kind, p.Namespace, p.Name, p.Arity, true, true);
146 if (found == null || found == p)
149 var tc = found.MemberDefinition as TypeDefinition;
151 var ns = module.GlobalRootNamespace.GetNamespace (p.Namespace, false);
152 ns.SetBuiltinType (p);
154 tc.SetPredefinedSpec (p);
155 p.SetDefinition (found);
159 if (ctx.Report.Errors != 0)
162 // Set internal build-in types
163 Dynamic.SetDefinition (Object);
170 // Compiler predefined types. Usually used for compiler generated
171 // code or for comparison against well known framework type. They
172 // may not exist as they are optional
174 class PredefinedTypes
176 public readonly PredefinedType ArgIterator;
177 public readonly PredefinedType TypedReference;
178 public readonly PredefinedType MarshalByRefObject;
179 public readonly PredefinedType RuntimeHelpers;
180 public readonly PredefinedType IAsyncResult;
181 public readonly PredefinedType AsyncCallback;
182 public readonly PredefinedType RuntimeArgumentHandle;
183 public readonly PredefinedType CharSet;
184 public readonly PredefinedType IsVolatile;
185 public readonly PredefinedType IEnumeratorGeneric;
186 public readonly PredefinedType IListGeneric;
187 public readonly PredefinedType IReadOnlyListGeneric;
188 public readonly PredefinedType ICollectionGeneric;
189 public readonly PredefinedType IReadOnlyCollectionGeneric;
190 public readonly PredefinedType IEnumerableGeneric;
191 public readonly PredefinedType Nullable;
192 public readonly PredefinedType Activator;
193 public readonly PredefinedType Interlocked;
194 public readonly PredefinedType Monitor;
195 public readonly PredefinedType NotSupportedException;
196 public readonly PredefinedType RuntimeFieldHandle;
197 public readonly PredefinedType RuntimeMethodHandle;
198 public readonly PredefinedType SecurityAction;
199 public readonly PredefinedType Dictionary;
200 public readonly PredefinedType Hashtable;
201 public readonly TypeSpec[] SwitchUserTypes;
206 public readonly PredefinedType Expression;
207 public readonly PredefinedType ExpressionGeneric;
208 public readonly PredefinedType ParameterExpression;
209 public readonly PredefinedType FieldInfo;
210 public readonly PredefinedType MethodBase;
211 public readonly PredefinedType MethodInfo;
212 public readonly PredefinedType ConstructorInfo;
213 public readonly PredefinedType MemberBinding;
218 public readonly PredefinedType Binder;
219 public readonly PredefinedType CallSite;
220 public readonly PredefinedType CallSiteGeneric;
221 public readonly PredefinedType BinderFlags;
226 public readonly PredefinedType AsyncVoidMethodBuilder;
227 public readonly PredefinedType AsyncTaskMethodBuilder;
228 public readonly PredefinedType AsyncTaskMethodBuilderGeneric;
229 public readonly PredefinedType Action;
230 public readonly PredefinedType Task;
231 public readonly PredefinedType TaskGeneric;
232 public readonly PredefinedType IAsyncStateMachine;
233 public readonly PredefinedType INotifyCompletion;
234 public readonly PredefinedType ICriticalNotifyCompletion;
237 public readonly PredefinedType IFormattable;
238 public readonly PredefinedType FormattableString;
239 public readonly PredefinedType FormattableStringFactory;
241 public PredefinedTypes (ModuleContainer module)
243 TypedReference = new PredefinedType (module, MemberKind.Struct, "System", "TypedReference");
244 ArgIterator = new PredefinedType (module, MemberKind.Struct, "System", "ArgIterator");
246 MarshalByRefObject = new PredefinedType (module, MemberKind.Class, "System", "MarshalByRefObject");
247 RuntimeHelpers = new PredefinedType (module, MemberKind.Class, "System.Runtime.CompilerServices", "RuntimeHelpers");
248 IAsyncResult = new PredefinedType (module, MemberKind.Interface, "System", "IAsyncResult");
249 AsyncCallback = new PredefinedType (module, MemberKind.Delegate, "System", "AsyncCallback");
250 RuntimeArgumentHandle = new PredefinedType (module, MemberKind.Struct, "System", "RuntimeArgumentHandle");
251 CharSet = new PredefinedType (module, MemberKind.Enum, "System.Runtime.InteropServices", "CharSet");
252 IsVolatile = new PredefinedType (module, MemberKind.Class, "System.Runtime.CompilerServices", "IsVolatile");
253 IEnumeratorGeneric = new PredefinedType (module, MemberKind.Interface, "System.Collections.Generic", "IEnumerator", 1);
254 IListGeneric = new PredefinedType (module, MemberKind.Interface, "System.Collections.Generic", "IList", 1);
255 IReadOnlyListGeneric = new PredefinedType (module, MemberKind.Interface, "System.Collections.Generic", "IReadOnlyList", 1);
256 ICollectionGeneric = new PredefinedType (module, MemberKind.Interface, "System.Collections.Generic", "ICollection", 1);
257 IReadOnlyCollectionGeneric = new PredefinedType (module, MemberKind.Interface, "System.Collections.Generic", "IReadOnlyCollection", 1);
258 IEnumerableGeneric = new PredefinedType (module, MemberKind.Interface, "System.Collections.Generic", "IEnumerable", 1);
259 Nullable = new PredefinedType (module, MemberKind.Struct, "System", "Nullable", 1);
260 Activator = new PredefinedType (module, MemberKind.Class, "System", "Activator");
261 Interlocked = new PredefinedType (module, MemberKind.Class, "System.Threading", "Interlocked");
262 Monitor = new PredefinedType (module, MemberKind.Class, "System.Threading", "Monitor");
263 NotSupportedException = new PredefinedType (module, MemberKind.Class, "System", "NotSupportedException");
264 RuntimeFieldHandle = new PredefinedType (module, MemberKind.Struct, "System", "RuntimeFieldHandle");
265 RuntimeMethodHandle = new PredefinedType (module, MemberKind.Struct, "System", "RuntimeMethodHandle");
266 SecurityAction = new PredefinedType (module, MemberKind.Enum, "System.Security.Permissions", "SecurityAction");
267 Dictionary = new PredefinedType (module, MemberKind.Class, "System.Collections.Generic", "Dictionary", 2);
268 Hashtable = new PredefinedType (module, MemberKind.Class, "System.Collections", "Hashtable");
270 Expression = new PredefinedType (module, MemberKind.Class, "System.Linq.Expressions", "Expression");
271 ExpressionGeneric = new PredefinedType (module, MemberKind.Class, "System.Linq.Expressions", "Expression", 1);
272 MemberBinding = new PredefinedType (module, MemberKind.Class, "System.Linq.Expressions", "MemberBinding");
273 ParameterExpression = new PredefinedType (module, MemberKind.Class, "System.Linq.Expressions", "ParameterExpression");
274 FieldInfo = new PredefinedType (module, MemberKind.Class, "System.Reflection", "FieldInfo");
275 MethodBase = new PredefinedType (module, MemberKind.Class, "System.Reflection", "MethodBase");
276 MethodInfo = new PredefinedType (module, MemberKind.Class, "System.Reflection", "MethodInfo");
277 ConstructorInfo = new PredefinedType (module, MemberKind.Class, "System.Reflection", "ConstructorInfo");
279 CallSite = new PredefinedType (module, MemberKind.Class, "System.Runtime.CompilerServices", "CallSite");
280 CallSiteGeneric = new PredefinedType (module, MemberKind.Class, "System.Runtime.CompilerServices", "CallSite", 1);
281 Binder = new PredefinedType (module, MemberKind.Class, "Microsoft.CSharp.RuntimeBinder", "Binder");
282 BinderFlags = new PredefinedType (module, MemberKind.Enum, "Microsoft.CSharp.RuntimeBinder", "CSharpBinderFlags");
284 Action = new PredefinedType (module, MemberKind.Delegate, "System", "Action");
285 AsyncVoidMethodBuilder = new PredefinedType (module, MemberKind.Struct, "System.Runtime.CompilerServices", "AsyncVoidMethodBuilder");
286 AsyncTaskMethodBuilder = new PredefinedType (module, MemberKind.Struct, "System.Runtime.CompilerServices", "AsyncTaskMethodBuilder");
287 AsyncTaskMethodBuilderGeneric = new PredefinedType (module, MemberKind.Struct, "System.Runtime.CompilerServices", "AsyncTaskMethodBuilder", 1);
288 Task = new PredefinedType (module, MemberKind.Class, "System.Threading.Tasks", "Task");
289 TaskGeneric = new PredefinedType (module, MemberKind.Class, "System.Threading.Tasks", "Task", 1);
290 IAsyncStateMachine = new PredefinedType (module, MemberKind.Interface, "System.Runtime.CompilerServices", "IAsyncStateMachine");
291 INotifyCompletion = new PredefinedType (module, MemberKind.Interface, "System.Runtime.CompilerServices", "INotifyCompletion");
292 ICriticalNotifyCompletion = new PredefinedType (module, MemberKind.Interface, "System.Runtime.CompilerServices", "ICriticalNotifyCompletion");
294 IFormattable = new PredefinedType (module, MemberKind.Interface, "System", "IFormattable");
295 FormattableString = new PredefinedType (module, MemberKind.Class, "System", "FormattableString");
296 FormattableStringFactory = new PredefinedType (module, MemberKind.Class, "System.Runtime.CompilerServices", "FormattableStringFactory");
299 // Define types which are used for comparison. It does not matter
300 // if they don't exist as no error report is needed
302 if (TypedReference.Define ())
303 TypedReference.TypeSpec.IsSpecialRuntimeType = true;
305 if (ArgIterator.Define ())
306 ArgIterator.TypeSpec.IsSpecialRuntimeType = true;
308 if (IEnumerableGeneric.Define ())
309 IEnumerableGeneric.TypeSpec.IsArrayGenericInterface = true;
311 if (IListGeneric.Define ())
312 IListGeneric.TypeSpec.IsArrayGenericInterface = true;
314 if (IReadOnlyListGeneric.Define ())
315 IReadOnlyListGeneric.TypeSpec.IsArrayGenericInterface = true;
317 if (ICollectionGeneric.Define ())
318 ICollectionGeneric.TypeSpec.IsArrayGenericInterface = true;
320 if (IReadOnlyCollectionGeneric.Define ())
321 IReadOnlyCollectionGeneric.TypeSpec.IsArrayGenericInterface = true;
323 if (Nullable.Define ())
324 Nullable.TypeSpec.IsNullableType = true;
326 if (ExpressionGeneric.Define ())
327 ExpressionGeneric.TypeSpec.IsExpressionTreeType = true;
330 if (TaskGeneric.Define ())
331 TaskGeneric.TypeSpec.IsGenericTask = true;
333 SwitchUserTypes = Switch.CreateSwitchUserTypes (module, Nullable.TypeSpec);
335 IFormattable.Define ();
336 FormattableString.Define ();
340 class PredefinedMembers
342 public readonly PredefinedMember<MethodSpec> ActivatorCreateInstance;
343 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderCreate;
344 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderStart;
345 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderSetResult;
346 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderSetException;
347 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderSetStateMachine;
348 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderOnCompleted;
349 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderOnCompletedUnsafe;
350 public readonly PredefinedMember<PropertySpec> AsyncTaskMethodBuilderTask;
351 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderGenericCreate;
352 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderGenericStart;
353 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderGenericSetResult;
354 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderGenericSetException;
355 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderGenericSetStateMachine;
356 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderGenericOnCompleted;
357 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderGenericOnCompletedUnsafe;
358 public readonly PredefinedMember<PropertySpec> AsyncTaskMethodBuilderGenericTask;
359 public readonly PredefinedMember<MethodSpec> AsyncVoidMethodBuilderCreate;
360 public readonly PredefinedMember<MethodSpec> AsyncVoidMethodBuilderStart;
361 public readonly PredefinedMember<MethodSpec> AsyncVoidMethodBuilderSetException;
362 public readonly PredefinedMember<MethodSpec> AsyncVoidMethodBuilderSetResult;
363 public readonly PredefinedMember<MethodSpec> AsyncVoidMethodBuilderSetStateMachine;
364 public readonly PredefinedMember<MethodSpec> AsyncVoidMethodBuilderOnCompleted;
365 public readonly PredefinedMember<MethodSpec> AsyncVoidMethodBuilderOnCompletedUnsafe;
366 public readonly PredefinedMember<MethodSpec> AsyncStateMachineAttributeCtor;
367 public readonly PredefinedMember<MethodSpec> DebuggerBrowsableAttributeCtor;
368 public readonly PredefinedMember<MethodSpec> DecimalCtor;
369 public readonly PredefinedMember<MethodSpec> DecimalCtorInt;
370 public readonly PredefinedMember<MethodSpec> DecimalCtorLong;
371 public readonly PredefinedMember<MethodSpec> DecimalConstantAttributeCtor;
372 public readonly PredefinedMember<MethodSpec> DefaultMemberAttributeCtor;
373 public readonly PredefinedMember<MethodSpec> DelegateCombine;
374 public readonly PredefinedMember<MethodSpec> DelegateEqual;
375 public readonly PredefinedMember<MethodSpec> DelegateInequal;
376 public readonly PredefinedMember<MethodSpec> DelegateRemove;
377 public readonly PredefinedMember<MethodSpec> DynamicAttributeCtor;
378 public readonly PredefinedMember<MethodSpec> FieldInfoGetFieldFromHandle;
379 public readonly PredefinedMember<MethodSpec> FieldInfoGetFieldFromHandle2;
380 public readonly PredefinedMember<MethodSpec> IDisposableDispose;
381 public readonly PredefinedMember<MethodSpec> IEnumerableGetEnumerator;
382 public readonly PredefinedMember<MethodSpec> InterlockedCompareExchange;
383 public readonly PredefinedMember<MethodSpec> InterlockedCompareExchange_T;
384 public readonly PredefinedMember<MethodSpec> FixedBufferAttributeCtor;
385 public readonly PredefinedMember<MethodSpec> MethodInfoGetMethodFromHandle;
386 public readonly PredefinedMember<MethodSpec> MethodInfoGetMethodFromHandle2;
387 public readonly PredefinedMember<MethodSpec> MonitorEnter;
388 public readonly PredefinedMember<MethodSpec> MonitorEnter_v4;
389 public readonly PredefinedMember<MethodSpec> MonitorExit;
390 public readonly PredefinedMember<PropertySpec> RuntimeCompatibilityWrapNonExceptionThrows;
391 public readonly PredefinedMember<MethodSpec> RuntimeHelpersInitializeArray;
392 public readonly PredefinedMember<PropertySpec> RuntimeHelpersOffsetToStringData;
393 public readonly PredefinedMember<ConstSpec> SecurityActionRequestMinimum;
394 public readonly PredefinedMember<FieldSpec> StringEmpty;
395 public readonly PredefinedMember<MethodSpec> StringEqual;
396 public readonly PredefinedMember<MethodSpec> StringInequal;
397 public readonly PredefinedMember<MethodSpec> StructLayoutAttributeCtor;
398 public readonly PredefinedMember<FieldSpec> StructLayoutCharSet;
399 public readonly PredefinedMember<FieldSpec> StructLayoutSize;
400 public readonly PredefinedMember<MethodSpec> TypeGetTypeFromHandle;
402 public PredefinedMembers (ModuleContainer module)
404 var types = module.PredefinedTypes;
405 var atypes = module.PredefinedAttributes;
406 var btypes = module.Compiler.BuiltinTypes;
408 var tp = new TypeParameter (0, new MemberName ("T"), null, null, Variance.None);
410 ActivatorCreateInstance = new PredefinedMember<MethodSpec> (module, types.Activator,
411 MemberFilter.Method ("CreateInstance", 1, ParametersCompiled.EmptyReadOnlyParameters, null));
413 AsyncTaskMethodBuilderCreate = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilder,
414 MemberFilter.Method ("Create", 0, ParametersCompiled.EmptyReadOnlyParameters, types.AsyncTaskMethodBuilder.TypeSpec));
416 AsyncTaskMethodBuilderSetResult = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilder,
417 MemberFilter.Method ("SetResult", 0, ParametersCompiled.EmptyReadOnlyParameters, btypes.Void));
419 AsyncTaskMethodBuilderSetStateMachine = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilder,
420 "SetStateMachine", MemberKind.Method, () => new[] {
421 types.IAsyncStateMachine.TypeSpec
424 AsyncTaskMethodBuilderSetException = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilder,
425 MemberFilter.Method ("SetException", 0,
426 ParametersCompiled.CreateFullyResolved (btypes.Exception), btypes.Void));
428 AsyncTaskMethodBuilderOnCompleted = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilder,
429 MemberFilter.Method ("AwaitOnCompleted", 2,
430 new ParametersImported (
432 new ParameterData (null, Parameter.Modifier.REF),
433 new ParameterData (null, Parameter.Modifier.REF)
436 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
437 new TypeParameterSpec (1, tp, SpecialConstraint.None, Variance.None, null)
441 AsyncTaskMethodBuilderOnCompletedUnsafe = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilder,
442 MemberFilter.Method ("AwaitUnsafeOnCompleted", 2,
443 new ParametersImported (
445 new ParameterData (null, Parameter.Modifier.REF),
446 new ParameterData (null, Parameter.Modifier.REF)
449 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
450 new TypeParameterSpec (1, tp, SpecialConstraint.None, Variance.None, null)
454 AsyncTaskMethodBuilderStart = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilder,
455 MemberFilter.Method ("Start", 1,
456 new ParametersImported (
458 new ParameterData (null, Parameter.Modifier.REF),
461 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
465 AsyncTaskMethodBuilderTask = new PredefinedMember<PropertySpec> (module, types.AsyncTaskMethodBuilder,
466 MemberFilter.Property ("Task", null));
468 AsyncTaskMethodBuilderGenericCreate = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilderGeneric,
469 MemberFilter.Method ("Create", 0, ParametersCompiled.EmptyReadOnlyParameters, types.AsyncVoidMethodBuilder.TypeSpec));
471 AsyncTaskMethodBuilderGenericSetResult = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilderGeneric,
472 "SetResult", MemberKind.Method, () => new TypeSpec[] {
473 types.AsyncTaskMethodBuilderGeneric.TypeSpec.MemberDefinition.TypeParameters[0]
476 AsyncTaskMethodBuilderGenericSetStateMachine = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilderGeneric,
477 "SetStateMachine", MemberKind.Method, () => new[] {
478 types.IAsyncStateMachine.TypeSpec
481 AsyncTaskMethodBuilderGenericSetException = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilderGeneric,
482 MemberFilter.Method ("SetException", 0,
483 ParametersCompiled.CreateFullyResolved (btypes.Exception), btypes.Void));
485 AsyncTaskMethodBuilderGenericOnCompleted = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilderGeneric,
486 MemberFilter.Method ("AwaitOnCompleted", 2,
487 new ParametersImported (
489 new ParameterData (null, Parameter.Modifier.REF),
490 new ParameterData (null, Parameter.Modifier.REF)
493 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
494 new TypeParameterSpec (1, tp, SpecialConstraint.None, Variance.None, null)
498 AsyncTaskMethodBuilderGenericOnCompletedUnsafe = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilderGeneric,
499 MemberFilter.Method ("AwaitUnsafeOnCompleted", 2,
500 new ParametersImported (
502 new ParameterData (null, Parameter.Modifier.REF),
503 new ParameterData (null, Parameter.Modifier.REF)
506 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
507 new TypeParameterSpec (1, tp, SpecialConstraint.None, Variance.None, null)
511 AsyncTaskMethodBuilderGenericStart = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilderGeneric,
512 MemberFilter.Method ("Start", 1,
513 new ParametersImported (
515 new ParameterData (null, Parameter.Modifier.REF),
518 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
522 AsyncTaskMethodBuilderGenericTask = new PredefinedMember<PropertySpec> (module, types.AsyncTaskMethodBuilderGeneric,
523 MemberFilter.Property ("Task", null));
525 AsyncVoidMethodBuilderCreate = new PredefinedMember<MethodSpec> (module, types.AsyncVoidMethodBuilder,
526 MemberFilter.Method ("Create", 0, ParametersCompiled.EmptyReadOnlyParameters, types.AsyncVoidMethodBuilder.TypeSpec));
528 AsyncVoidMethodBuilderSetException = new PredefinedMember<MethodSpec> (module, types.AsyncVoidMethodBuilder,
529 MemberFilter.Method ("SetException", 0, null, btypes.Void));
531 AsyncVoidMethodBuilderSetResult = new PredefinedMember<MethodSpec> (module, types.AsyncVoidMethodBuilder,
532 MemberFilter.Method ("SetResult", 0, ParametersCompiled.EmptyReadOnlyParameters, btypes.Void));
534 AsyncVoidMethodBuilderSetStateMachine = new PredefinedMember<MethodSpec> (module, types.AsyncVoidMethodBuilder,
535 "SetStateMachine", MemberKind.Method, () => new[] {
536 types.IAsyncStateMachine.TypeSpec
539 AsyncVoidMethodBuilderOnCompleted = new PredefinedMember<MethodSpec> (module, types.AsyncVoidMethodBuilder,
540 MemberFilter.Method ("AwaitOnCompleted", 2,
541 new ParametersImported (
543 new ParameterData (null, Parameter.Modifier.REF),
544 new ParameterData (null, Parameter.Modifier.REF)
547 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
548 new TypeParameterSpec (1, tp, SpecialConstraint.None, Variance.None, null)
552 AsyncVoidMethodBuilderOnCompletedUnsafe = new PredefinedMember<MethodSpec> (module, types.AsyncVoidMethodBuilder,
553 MemberFilter.Method ("AwaitUnsafeOnCompleted", 2,
554 new ParametersImported (
556 new ParameterData (null, Parameter.Modifier.REF),
557 new ParameterData (null, Parameter.Modifier.REF)
560 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
561 new TypeParameterSpec (1, tp, SpecialConstraint.None, Variance.None, null)
565 AsyncVoidMethodBuilderStart = new PredefinedMember<MethodSpec> (module, types.AsyncVoidMethodBuilder,
566 MemberFilter.Method ("Start", 1,
567 new ParametersImported (
569 new ParameterData (null, Parameter.Modifier.REF),
572 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
576 AsyncStateMachineAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.AsyncStateMachine,
577 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (
580 DebuggerBrowsableAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.DebuggerBrowsable,
581 MemberFilter.Constructor (null));
583 DecimalCtor = new PredefinedMember<MethodSpec> (module, btypes.Decimal,
584 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (
585 btypes.Int, btypes.Int, btypes.Int, btypes.Bool, btypes.Byte)));
587 DecimalCtorInt = new PredefinedMember<MethodSpec> (module, btypes.Decimal,
588 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (btypes.Int)));
590 DecimalCtorLong = new PredefinedMember<MethodSpec> (module, btypes.Decimal,
591 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (btypes.Long)));
593 DecimalConstantAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.DecimalConstant,
594 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (
595 btypes.Byte, btypes.Byte, btypes.UInt, btypes.UInt, btypes.UInt)));
597 DefaultMemberAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.DefaultMember,
598 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (btypes.String)));
600 DelegateCombine = new PredefinedMember<MethodSpec> (module, btypes.Delegate, "Combine", btypes.Delegate, btypes.Delegate);
601 DelegateRemove = new PredefinedMember<MethodSpec> (module, btypes.Delegate, "Remove", btypes.Delegate, btypes.Delegate);
603 DelegateEqual = new PredefinedMember<MethodSpec> (module, btypes.Delegate,
604 new MemberFilter (Operator.GetMetadataName (Operator.OpType.Equality), 0, MemberKind.Operator, null, btypes.Bool));
606 DelegateInequal = new PredefinedMember<MethodSpec> (module, btypes.Delegate,
607 new MemberFilter (Operator.GetMetadataName (Operator.OpType.Inequality), 0, MemberKind.Operator, null, btypes.Bool));
609 DynamicAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.Dynamic,
610 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (
611 ArrayContainer.MakeType (module, btypes.Bool))));
613 FieldInfoGetFieldFromHandle = new PredefinedMember<MethodSpec> (module, types.FieldInfo,
614 "GetFieldFromHandle", MemberKind.Method, types.RuntimeFieldHandle);
616 FieldInfoGetFieldFromHandle2 = new PredefinedMember<MethodSpec> (module, types.FieldInfo,
617 "GetFieldFromHandle", MemberKind.Method, types.RuntimeFieldHandle, new PredefinedType (btypes.RuntimeTypeHandle));
619 FixedBufferAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.FixedBuffer,
620 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (btypes.Type, btypes.Int)));
622 IDisposableDispose = new PredefinedMember<MethodSpec> (module, btypes.IDisposable, "Dispose", TypeSpec.EmptyTypes);
624 IEnumerableGetEnumerator = new PredefinedMember<MethodSpec> (module, btypes.IEnumerable,
625 "GetEnumerator", TypeSpec.EmptyTypes);
627 InterlockedCompareExchange = new PredefinedMember<MethodSpec> (module, types.Interlocked,
628 MemberFilter.Method ("CompareExchange", 0,
629 new ParametersImported (
631 new ParameterData (null, Parameter.Modifier.REF),
632 new ParameterData (null, Parameter.Modifier.NONE),
633 new ParameterData (null, Parameter.Modifier.NONE)
636 btypes.Int, btypes.Int, btypes.Int
641 InterlockedCompareExchange_T = new PredefinedMember<MethodSpec> (module, types.Interlocked,
642 MemberFilter.Method ("CompareExchange", 1,
643 new ParametersImported (
645 new ParameterData (null, Parameter.Modifier.REF),
646 new ParameterData (null, Parameter.Modifier.NONE),
647 new ParameterData (null, Parameter.Modifier.NONE)
650 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
651 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
652 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
656 MethodInfoGetMethodFromHandle = new PredefinedMember<MethodSpec> (module, types.MethodBase,
657 "GetMethodFromHandle", MemberKind.Method, types.RuntimeMethodHandle);
659 MethodInfoGetMethodFromHandle2 = new PredefinedMember<MethodSpec> (module, types.MethodBase,
660 "GetMethodFromHandle", MemberKind.Method, types.RuntimeMethodHandle, new PredefinedType (btypes.RuntimeTypeHandle));
662 MonitorEnter = new PredefinedMember<MethodSpec> (module, types.Monitor, "Enter", btypes.Object);
664 MonitorEnter_v4 = new PredefinedMember<MethodSpec> (module, types.Monitor,
665 MemberFilter.Method ("Enter", 0,
666 new ParametersImported (new[] {
667 new ParameterData (null, Parameter.Modifier.NONE),
668 new ParameterData (null, Parameter.Modifier.REF)
671 btypes.Object, btypes.Bool
674 MonitorExit = new PredefinedMember<MethodSpec> (module, types.Monitor, "Exit", btypes.Object);
676 RuntimeCompatibilityWrapNonExceptionThrows = new PredefinedMember<PropertySpec> (module, atypes.RuntimeCompatibility,
677 MemberFilter.Property ("WrapNonExceptionThrows", btypes.Bool));
679 RuntimeHelpersInitializeArray = new PredefinedMember<MethodSpec> (module, types.RuntimeHelpers,
680 "InitializeArray", btypes.Array, btypes.RuntimeFieldHandle);
682 RuntimeHelpersOffsetToStringData = new PredefinedMember<PropertySpec> (module, types.RuntimeHelpers,
683 MemberFilter.Property ("OffsetToStringData", btypes.Int));
685 SecurityActionRequestMinimum = new PredefinedMember<ConstSpec> (module, types.SecurityAction, "RequestMinimum",
686 MemberKind.Field, types.SecurityAction);
688 StringEmpty = new PredefinedMember<FieldSpec> (module, btypes.String, MemberFilter.Field ("Empty", btypes.String));
690 StringEqual = new PredefinedMember<MethodSpec> (module, btypes.String,
691 new MemberFilter (Operator.GetMetadataName (Operator.OpType.Equality), 0, MemberKind.Operator, null, btypes.Bool));
693 StringInequal = new PredefinedMember<MethodSpec> (module, btypes.String,
694 new MemberFilter (Operator.GetMetadataName (Operator.OpType.Inequality), 0, MemberKind.Operator, null, btypes.Bool));
696 StructLayoutAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.StructLayout,
697 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (btypes.Short)));
699 StructLayoutCharSet = new PredefinedMember<FieldSpec> (module, atypes.StructLayout, "CharSet",
700 MemberKind.Field, types.CharSet);
702 StructLayoutSize = new PredefinedMember<FieldSpec> (module, atypes.StructLayout,
703 MemberFilter.Field ("Size", btypes.Int));
705 TypeGetTypeFromHandle = new PredefinedMember<MethodSpec> (module, btypes.Type, "GetTypeFromHandle", btypes.RuntimeTypeHandle);
709 public class PredefinedType
711 readonly string name;
714 readonly MemberKind kind;
715 protected readonly ModuleContainer module;
716 protected TypeSpec type;
719 public PredefinedType (ModuleContainer module, MemberKind kind, string ns, string name, int arity)
720 : this (module, kind, ns, name)
725 public PredefinedType (ModuleContainer module, MemberKind kind, string ns, string name)
727 this.module = module;
733 public PredefinedType (BuiltinTypeSpec type)
735 this.kind = type.Kind;
736 this.name = type.Name;
737 this.ns = type.Namespace;
749 public bool IsDefined {
761 public string Namespace {
767 public TypeSpec TypeSpec {
775 public bool Define ()
782 type = Resolve (module, kind, ns, name, arity, false, false);
788 public string GetSignatureForError ()
790 return ns + "." + name;
793 public static TypeSpec Resolve (ModuleContainer module, MemberKind kind, string ns, string name, int arity, bool required, bool reportErrors)
796 // Cannot call it with true because it could create non-existent namespaces for
797 // predefined types. It's set to true only for build-in types which all must
798 // exist therefore it does not matter, for predefined types we don't want to create
799 // fake namespaces when type is optional and does not exist (e.g. System.Linq).
801 Namespace type_ns = module.GlobalRootNamespace.GetNamespace (ns, required);
803 IList<TypeSpec> found = null;
805 found = type_ns.GetAllTypes (name);
809 module.Compiler.Report.Error (518, "The predefined type `{0}.{1}' is not defined or imported", ns, name);
814 TypeSpec best_match = null;
815 foreach (var candidate in found) {
816 if (candidate.Kind != kind) {
817 if (candidate.Kind == MemberKind.Struct && kind == MemberKind.Void && candidate.MemberDefinition is TypeContainer) {
818 // Void is declared as struct but we keep it internally as
819 // special kind, the swap will be done by caller
825 if (candidate.Arity != arity)
828 if ((candidate.Modifiers & Modifiers.INTERNAL) != 0 && !candidate.MemberDefinition.IsInternalAsPublic (module.DeclaringAssembly))
831 if (best_match == null) {
832 best_match = candidate;
836 var other_match = best_match;
837 if (!best_match.MemberDefinition.IsImported &&
838 module.Compiler.BuiltinTypes.Object.MemberDefinition.DeclaringAssembly == candidate.MemberDefinition.DeclaringAssembly) {
839 best_match = candidate;
843 if (best_match.MemberDefinition is MemberCore) {
844 location = ((MemberCore) best_match.MemberDefinition).Location.Name;
846 var assembly = (ImportedAssemblyDefinition) best_match.MemberDefinition.DeclaringAssembly;
847 location = Path.GetFileName (assembly.Location);
850 module.Compiler.Report.SymbolRelatedToPreviousError (other_match);
851 module.Compiler.Report.SymbolRelatedToPreviousError (candidate);
853 module.Compiler.Report.Warning (1685, 1,
854 "The predefined type `{0}.{1}' is defined multiple times. Using definition from `{2}'",
860 if (best_match == null && reportErrors) {
861 var found_member = found[0];
863 if (found_member.Kind == MemberKind.MissingType) {
864 // CSC: should be different error number
865 module.Compiler.Report.Error (518, "The predefined type `{0}.{1}' is defined in an assembly that is not referenced.", ns, name);
868 if (found_member.MemberDefinition is MemberCore) {
869 loc = ((MemberCore) found_member.MemberDefinition).Location;
872 module.Compiler.Report.SymbolRelatedToPreviousError (found_member);
875 module.Compiler.Report.Error (520, loc, "The predefined type `{0}.{1}' is not declared correctly", ns, name);
882 public TypeSpec Resolve ()
885 type = Resolve (module, kind, ns, name, arity, false, true);
891 public class PredefinedMember<T> where T : MemberSpec
893 readonly ModuleContainer module;
895 TypeSpec declaring_type;
896 readonly PredefinedType declaring_type_predefined;
898 readonly Func<TypeSpec[]> filter_builder;
900 public PredefinedMember (ModuleContainer module, PredefinedType type, MemberFilter filter)
902 this.module = module;
903 this.declaring_type_predefined = type;
904 this.filter = filter;
907 public PredefinedMember (ModuleContainer module, TypeSpec type, MemberFilter filter)
909 this.module = module;
910 this.declaring_type = type;
911 this.filter = filter;
914 public PredefinedMember (ModuleContainer module, PredefinedType type, string name, params TypeSpec[] types)
915 : this (module, type, MemberFilter.Method (name, 0, ParametersCompiled.CreateFullyResolved (types), null))
919 public PredefinedMember (ModuleContainer module, PredefinedType type, string name, MemberKind kind, params PredefinedType[] types)
920 : this (module, type, new MemberFilter (name, 0, kind, null, null))
922 filter_builder = () => {
923 var ptypes = new TypeSpec[types.Length];
924 for (int i = 0; i < ptypes.Length; ++i) {
929 ptypes[i] = p.TypeSpec;
936 public PredefinedMember (ModuleContainer module, PredefinedType type, string name, MemberKind kind, Func<TypeSpec[]> typesBuilder, TypeSpec returnType)
937 : this (module, type, new MemberFilter (name, 0, kind, null, returnType))
939 filter_builder = typesBuilder;
942 public PredefinedMember (ModuleContainer module, BuiltinTypeSpec type, string name, params TypeSpec[] types)
943 : this (module, type, MemberFilter.Method (name, 0, ParametersCompiled.CreateFullyResolved (types), null))
952 if (declaring_type == null) {
953 if (!declaring_type_predefined.Define ())
956 declaring_type = declaring_type_predefined.TypeSpec;
959 if (filter_builder != null) {
960 var types = filter_builder ();
962 if (filter.Kind == MemberKind.Field)
963 filter = new MemberFilter (filter.Name, filter.Arity, filter.Kind, null, types [0]);
965 filter = new MemberFilter (filter.Name, filter.Arity, filter.Kind,
966 ParametersCompiled.CreateFullyResolved (types), filter.MemberType);
969 member = MemberCache.FindMember (declaring_type, filter, BindingRestriction.DeclaredOnly) as T;
973 if (!member.IsAccessible (module))
979 public T Resolve (Location loc)
987 if (declaring_type == null) {
988 if (declaring_type_predefined.Resolve () == null)
992 if (filter_builder != null) {
993 filter = new MemberFilter (filter.Name, filter.Arity, filter.Kind,
994 ParametersCompiled.CreateFullyResolved (filter_builder ()), filter.MemberType);
997 string method_args = null;
998 if (filter.Parameters != null)
999 method_args = filter.Parameters.GetSignatureForError ();
1001 module.Compiler.Report.Error (656, loc, "The compiler required member `{0}.{1}{2}' could not be found or is inaccessible",
1002 declaring_type.GetSignatureForError (), filter.Name, method_args);
1008 public class AwaiterDefinition
1010 public PropertySpec IsCompleted { get; set; }
1011 public MethodSpec GetResult { get; set; }
1012 public bool INotifyCompletion { get; set; }
1014 public bool IsValidPattern {
1016 return IsCompleted != null && GetResult != null && IsCompleted.HasGet;
1021 partial class TypeManager {
1023 static public string CSharpName(IList<TypeSpec> types)
1025 if (types.Count == 0)
1026 return string.Empty;
1028 StringBuilder sb = new StringBuilder ();
1029 for (int i = 0; i < types.Count; ++i) {
1033 sb.Append (types [i].GetSignatureForError ());
1035 return sb.ToString ();
1038 static public string GetFullNameSignature (MemberSpec mi)
1040 return mi.GetSignatureForError ();
1043 static public string CSharpSignature (MemberSpec mb)
1045 return mb.GetSignatureForError ();
1048 public static bool IsFamilyAccessible (TypeSpec type, TypeSpec parent)
1050 // TypeParameter tparam = LookupTypeParameter (type);
1051 // TypeParameter pparam = LookupTypeParameter (parent);
1053 if (type.Kind == MemberKind.TypeParameter && parent.Kind == MemberKind.TypeParameter) { // (tparam != null) && (pparam != null)) {
1057 throw new NotImplementedException ("net");
1058 // return tparam.IsSubclassOf (parent);
1062 if (IsInstantiationOfSameGenericType (type, parent))
1065 type = type.BaseType;
1066 } while (type != null);
1072 // Checks whether `type' is a nested child of `parent'.
1074 public static bool IsNestedChildOf (TypeSpec type, ITypeDefinition parent)
1079 if (type.MemberDefinition == parent)
1082 type = type.DeclaringType;
1083 while (type != null) {
1084 if (type.MemberDefinition == parent)
1087 type = type.DeclaringType;
1093 public static TypeSpec GetElementType (TypeSpec t)
1095 return ((ElementTypeSpec)t).Element;
1099 /// This method is not implemented by MS runtime for dynamic types
1101 public static bool HasElementType (TypeSpec t)
1103 return t is ElementTypeSpec;
1107 /// Utility function that can be used to probe whether a type
1108 /// is managed or not.
1110 public static bool VerifyUnmanaged (ModuleContainer rc, TypeSpec t, Location loc)
1116 t = ((ElementTypeSpec) t).Element;
1118 rc.Compiler.Report.SymbolRelatedToPreviousError (t);
1119 rc.Compiler.Report.Error (208, loc,
1120 "Cannot take the address of, get the size of, or declare a pointer to a managed type `{0}'",
1121 t.GetSignatureForError ());
1126 // This method always return false for non-generic compiler,
1127 // while Type.IsGenericParameter is returned if it is supported.
1128 public static bool IsGenericParameter (TypeSpec type)
1130 return type.IsGenericParameter;
1133 public static bool IsGenericType (TypeSpec type)
1135 return type.IsGeneric;
1138 public static TypeSpec[] GetTypeArguments (TypeSpec t)
1140 // TODO: return empty array !!
1141 return t.TypeArguments;
1145 /// Check whether `type' and `parent' are both instantiations of the same
1146 /// generic type. Note that we do not check the type parameters here.
1148 public static bool IsInstantiationOfSameGenericType (TypeSpec type, TypeSpec parent)
1150 return type == parent || type.MemberDefinition == parent.MemberDefinition;