[sgen] Don't trigger collections during allocation of thread objects (#17970)
[mono-project.git] / mcs / mcs / typemanager.cs
blob7a16cda277449287463de3bf2957d70d94eaef05
1 //
2 // typemanager.cs: C# type manager
3 //
4 // Author: Miguel de Icaza (miguel@gnu.org)
5 // Ravi Pratap (ravi@ximian.com)
6 // Marek Safar (marek.safar@gmail.com)
7 //
8 // Dual licensed under the terms of the MIT X11 or GNU GPL
9 //
10 // Copyright 2001-2003 Ximian, Inc (http://www.ximian.com)
11 // Copyright 2003-2011 Novell, Inc.
12 // Copyright 2011 Xamarin Inc
15 using System;
16 using System.Globalization;
17 using System.Collections.Generic;
18 using System.Text;
19 using System.IO;
21 namespace Mono.CSharp
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 {
136 get {
137 return types;
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)
147 continue;
149 var tc = found.MemberDefinition as TypeDefinition;
150 if (tc != null) {
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)
160 return false;
162 // Set internal build-in types
163 Dynamic.SetDefinition (Object);
165 return true;
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 PredefinedType Array;
203 public readonly TypeSpec[] SwitchUserTypes;
206 // C# 3.0
208 public readonly PredefinedType Expression;
209 public readonly PredefinedType ExpressionGeneric;
210 public readonly PredefinedType ParameterExpression;
211 public readonly PredefinedType FieldInfo;
212 public readonly PredefinedType MethodBase;
213 public readonly PredefinedType MethodInfo;
214 public readonly PredefinedType ConstructorInfo;
215 public readonly PredefinedType MemberBinding;
218 // C# 4.0
220 public readonly PredefinedType Binder;
221 public readonly PredefinedType CallSite;
222 public readonly PredefinedType CallSiteGeneric;
223 public readonly PredefinedType BinderFlags;
226 // C# 5.0
228 public readonly PredefinedType AsyncVoidMethodBuilder;
229 public readonly PredefinedType AsyncTaskMethodBuilder;
230 public readonly PredefinedType AsyncTaskMethodBuilderGeneric;
231 public readonly PredefinedType Action;
232 public readonly PredefinedType Task;
233 public readonly PredefinedType TaskGeneric;
234 public readonly PredefinedType IAsyncStateMachine;
235 public readonly PredefinedType INotifyCompletion;
236 public readonly PredefinedType ICriticalNotifyCompletion;
238 // C# 6.0
239 public readonly PredefinedType IFormattable;
240 public readonly PredefinedType FormattableString;
241 public readonly PredefinedType FormattableStringFactory;
243 // C# 7.0
244 public readonly PredefinedType[] Tuples;
245 public readonly PredefinedType SpanGeneric;
247 public PredefinedTypes (ModuleContainer module)
249 TypedReference = new PredefinedType (module, MemberKind.Struct, "System", "TypedReference");
250 ArgIterator = new PredefinedType (module, MemberKind.Struct, "System", "ArgIterator");
252 MarshalByRefObject = new PredefinedType (module, MemberKind.Class, "System", "MarshalByRefObject");
253 RuntimeHelpers = new PredefinedType (module, MemberKind.Class, "System.Runtime.CompilerServices", "RuntimeHelpers");
254 IAsyncResult = new PredefinedType (module, MemberKind.Interface, "System", "IAsyncResult");
255 AsyncCallback = new PredefinedType (module, MemberKind.Delegate, "System", "AsyncCallback");
256 RuntimeArgumentHandle = new PredefinedType (module, MemberKind.Struct, "System", "RuntimeArgumentHandle");
257 CharSet = new PredefinedType (module, MemberKind.Enum, "System.Runtime.InteropServices", "CharSet");
258 IsVolatile = new PredefinedType (module, MemberKind.Class, "System.Runtime.CompilerServices", "IsVolatile");
259 IEnumeratorGeneric = new PredefinedType (module, MemberKind.Interface, "System.Collections.Generic", "IEnumerator", 1);
260 IListGeneric = new PredefinedType (module, MemberKind.Interface, "System.Collections.Generic", "IList", 1);
261 IReadOnlyListGeneric = new PredefinedType (module, MemberKind.Interface, "System.Collections.Generic", "IReadOnlyList", 1);
262 ICollectionGeneric = new PredefinedType (module, MemberKind.Interface, "System.Collections.Generic", "ICollection", 1);
263 IReadOnlyCollectionGeneric = new PredefinedType (module, MemberKind.Interface, "System.Collections.Generic", "IReadOnlyCollection", 1);
264 IEnumerableGeneric = new PredefinedType (module, MemberKind.Interface, "System.Collections.Generic", "IEnumerable", 1);
265 Nullable = new PredefinedType (module, MemberKind.Struct, "System", "Nullable", 1);
266 Activator = new PredefinedType (module, MemberKind.Class, "System", "Activator");
267 Interlocked = new PredefinedType (module, MemberKind.Class, "System.Threading", "Interlocked");
268 Monitor = new PredefinedType (module, MemberKind.Class, "System.Threading", "Monitor");
269 NotSupportedException = new PredefinedType (module, MemberKind.Class, "System", "NotSupportedException");
270 RuntimeFieldHandle = new PredefinedType (module, MemberKind.Struct, "System", "RuntimeFieldHandle");
271 RuntimeMethodHandle = new PredefinedType (module, MemberKind.Struct, "System", "RuntimeMethodHandle");
272 SecurityAction = new PredefinedType (module, MemberKind.Enum, "System.Security.Permissions", "SecurityAction");
273 Dictionary = new PredefinedType (module, MemberKind.Class, "System.Collections.Generic", "Dictionary", 2);
274 Hashtable = new PredefinedType (module, MemberKind.Class, "System.Collections", "Hashtable");
275 Array = new PredefinedType (module, MemberKind.Class, "System", "Array");
277 Expression = new PredefinedType (module, MemberKind.Class, "System.Linq.Expressions", "Expression");
278 ExpressionGeneric = new PredefinedType (module, MemberKind.Class, "System.Linq.Expressions", "Expression", 1);
279 MemberBinding = new PredefinedType (module, MemberKind.Class, "System.Linq.Expressions", "MemberBinding");
280 ParameterExpression = new PredefinedType (module, MemberKind.Class, "System.Linq.Expressions", "ParameterExpression");
281 FieldInfo = new PredefinedType (module, MemberKind.Class, "System.Reflection", "FieldInfo");
282 MethodBase = new PredefinedType (module, MemberKind.Class, "System.Reflection", "MethodBase");
283 MethodInfo = new PredefinedType (module, MemberKind.Class, "System.Reflection", "MethodInfo");
284 ConstructorInfo = new PredefinedType (module, MemberKind.Class, "System.Reflection", "ConstructorInfo");
286 CallSite = new PredefinedType (module, MemberKind.Class, "System.Runtime.CompilerServices", "CallSite");
287 CallSiteGeneric = new PredefinedType (module, MemberKind.Class, "System.Runtime.CompilerServices", "CallSite", 1);
288 Binder = new PredefinedType (module, MemberKind.Class, "Microsoft.CSharp.RuntimeBinder", "Binder");
289 BinderFlags = new PredefinedType (module, MemberKind.Enum, "Microsoft.CSharp.RuntimeBinder", "CSharpBinderFlags");
291 Action = new PredefinedType (module, MemberKind.Delegate, "System", "Action");
292 AsyncVoidMethodBuilder = new PredefinedType (module, MemberKind.Struct, "System.Runtime.CompilerServices", "AsyncVoidMethodBuilder");
293 AsyncTaskMethodBuilder = new PredefinedType (module, MemberKind.Struct, "System.Runtime.CompilerServices", "AsyncTaskMethodBuilder");
294 AsyncTaskMethodBuilderGeneric = new PredefinedType (module, MemberKind.Struct, "System.Runtime.CompilerServices", "AsyncTaskMethodBuilder", 1);
295 Task = new PredefinedType (module, MemberKind.Class, "System.Threading.Tasks", "Task");
296 TaskGeneric = new PredefinedType (module, MemberKind.Class, "System.Threading.Tasks", "Task", 1);
297 IAsyncStateMachine = new PredefinedType (module, MemberKind.Interface, "System.Runtime.CompilerServices", "IAsyncStateMachine");
298 INotifyCompletion = new PredefinedType (module, MemberKind.Interface, "System.Runtime.CompilerServices", "INotifyCompletion");
299 ICriticalNotifyCompletion = new PredefinedType (module, MemberKind.Interface, "System.Runtime.CompilerServices", "ICriticalNotifyCompletion");
301 IFormattable = new PredefinedType (module, MemberKind.Interface, "System", "IFormattable");
302 FormattableString = new PredefinedType (module, MemberKind.Class, "System", "FormattableString");
303 FormattableStringFactory = new PredefinedType (module, MemberKind.Class, "System.Runtime.CompilerServices", "FormattableStringFactory");
305 SpanGeneric = new PredefinedType (module, MemberKind.Struct, "System", "Span", 1);
308 // Define types which are used for comparison. It does not matter
309 // if they don't exist as no error report is needed
311 if (TypedReference.Define ())
312 TypedReference.TypeSpec.IsSpecialRuntimeType = true;
314 if (ArgIterator.Define ())
315 ArgIterator.TypeSpec.IsSpecialRuntimeType = true;
317 if (IEnumerableGeneric.Define ())
318 IEnumerableGeneric.TypeSpec.IsArrayGenericInterface = true;
320 if (IListGeneric.Define ())
321 IListGeneric.TypeSpec.IsArrayGenericInterface = true;
323 if (IReadOnlyListGeneric.Define ())
324 IReadOnlyListGeneric.TypeSpec.IsArrayGenericInterface = true;
326 if (ICollectionGeneric.Define ())
327 ICollectionGeneric.TypeSpec.IsArrayGenericInterface = true;
329 if (IReadOnlyCollectionGeneric.Define ())
330 IReadOnlyCollectionGeneric.TypeSpec.IsArrayGenericInterface = true;
332 if (Nullable.Define ())
333 Nullable.TypeSpec.IsNullableType = true;
335 if (ExpressionGeneric.Define ())
336 ExpressionGeneric.TypeSpec.IsExpressionTreeType = true;
338 Task.Define ();
339 if (TaskGeneric.Define ())
340 TaskGeneric.TypeSpec.IsGenericTask = true;
342 SwitchUserTypes = Switch.CreateSwitchUserTypes (module, Nullable.TypeSpec);
344 IFormattable.Define ();
345 FormattableString.Define ();
347 Tuples = new PredefinedType [8];
348 for (int i = 0; i < Tuples.Length; i++) {
349 var pt = new PredefinedType (module, MemberKind.Struct, "System", "ValueTuple", i + 1);
350 Tuples [i] = pt;
351 if (pt.Define ())
352 pt.TypeSpec.IsTupleType = true;
355 SpanGeneric.Define ();
359 class PredefinedMembers
361 public readonly PredefinedMember<MethodSpec> ActivatorCreateInstance;
362 public readonly PredefinedMember<MethodSpec> ArrayEmpty;
363 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderCreate;
364 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderStart;
365 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderSetResult;
366 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderSetException;
367 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderSetStateMachine;
368 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderOnCompleted;
369 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderOnCompletedUnsafe;
370 public readonly PredefinedMember<PropertySpec> AsyncTaskMethodBuilderTask;
371 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderGenericCreate;
372 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderGenericStart;
373 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderGenericSetResult;
374 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderGenericSetException;
375 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderGenericSetStateMachine;
376 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderGenericOnCompleted;
377 public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderGenericOnCompletedUnsafe;
378 public readonly PredefinedMember<PropertySpec> AsyncTaskMethodBuilderGenericTask;
379 public readonly PredefinedMember<MethodSpec> AsyncVoidMethodBuilderCreate;
380 public readonly PredefinedMember<MethodSpec> AsyncVoidMethodBuilderStart;
381 public readonly PredefinedMember<MethodSpec> AsyncVoidMethodBuilderSetException;
382 public readonly PredefinedMember<MethodSpec> AsyncVoidMethodBuilderSetResult;
383 public readonly PredefinedMember<MethodSpec> AsyncVoidMethodBuilderSetStateMachine;
384 public readonly PredefinedMember<MethodSpec> AsyncVoidMethodBuilderOnCompleted;
385 public readonly PredefinedMember<MethodSpec> AsyncVoidMethodBuilderOnCompletedUnsafe;
386 public readonly PredefinedMember<MethodSpec> AsyncStateMachineAttributeCtor;
387 public readonly PredefinedMember<MethodSpec> DebuggerBrowsableAttributeCtor;
388 public readonly PredefinedMember<MethodSpec> DecimalCtor;
389 public readonly PredefinedMember<MethodSpec> DecimalCtorInt;
390 public readonly PredefinedMember<MethodSpec> DecimalCtorLong;
391 public readonly PredefinedMember<MethodSpec> DecimalConstantAttributeCtor;
392 public readonly PredefinedMember<MethodSpec> DefaultMemberAttributeCtor;
393 public readonly PredefinedMember<MethodSpec> DelegateCombine;
394 public readonly PredefinedMember<MethodSpec> DelegateEqual;
395 public readonly PredefinedMember<MethodSpec> DelegateInequal;
396 public readonly PredefinedMember<MethodSpec> DelegateRemove;
397 public readonly PredefinedMember<MethodSpec> DynamicAttributeCtor;
398 public readonly PredefinedMember<MethodSpec> FieldInfoGetFieldFromHandle;
399 public readonly PredefinedMember<MethodSpec> FieldInfoGetFieldFromHandle2;
400 public readonly PredefinedMember<MethodSpec> IDisposableDispose;
401 public readonly PredefinedMember<MethodSpec> IEnumerableGetEnumerator;
402 public readonly PredefinedMember<MethodSpec> InterlockedCompareExchange;
403 public readonly PredefinedMember<MethodSpec> InterlockedCompareExchange_T;
404 public readonly PredefinedMember<MethodSpec> FixedBufferAttributeCtor;
405 public readonly PredefinedMember<MethodSpec> MethodInfoGetMethodFromHandle;
406 public readonly PredefinedMember<MethodSpec> MethodInfoGetMethodFromHandle2;
407 public readonly PredefinedMember<MethodSpec> MethodInfoCreateDelegate;
408 public readonly PredefinedMember<MethodSpec> MonitorEnter;
409 public readonly PredefinedMember<MethodSpec> MonitorEnter_v4;
410 public readonly PredefinedMember<MethodSpec> MonitorExit;
411 public readonly PredefinedMember<PropertySpec> RuntimeCompatibilityWrapNonExceptionThrows;
412 public readonly PredefinedMember<MethodSpec> RuntimeHelpersInitializeArray;
413 public readonly PredefinedMember<PropertySpec> RuntimeHelpersOffsetToStringData;
414 public readonly PredefinedMember<ConstSpec> SecurityActionRequestMinimum;
415 public readonly PredefinedMember<FieldSpec> StringEmpty;
416 public readonly PredefinedMember<MethodSpec> StringEqual;
417 public readonly PredefinedMember<MethodSpec> StringInequal;
418 public readonly PredefinedMember<MethodSpec> StructLayoutAttributeCtor;
419 public readonly PredefinedMember<FieldSpec> StructLayoutCharSet;
420 public readonly PredefinedMember<FieldSpec> StructLayoutSize;
421 public readonly PredefinedMember<MethodSpec> TypeGetTypeFromHandle;
422 public readonly PredefinedMember<MethodSpec> TupleElementNamesAttributeCtor;
424 public PredefinedMembers (ModuleContainer module)
426 var types = module.PredefinedTypes;
427 var atypes = module.PredefinedAttributes;
428 var btypes = module.Compiler.BuiltinTypes;
430 var tp = new TypeParameter (0, new MemberName ("T"), null, null, Variance.None);
432 ActivatorCreateInstance = new PredefinedMember<MethodSpec> (module, types.Activator,
433 MemberFilter.Method ("CreateInstance", 1, ParametersCompiled.EmptyReadOnlyParameters, null));
435 ArrayEmpty = new PredefinedMember<MethodSpec> (module, types.Array,
436 MemberFilter.Method ("Empty", 1, ParametersCompiled.EmptyReadOnlyParameters, null));
438 // TODO: Must me static
439 AsyncTaskMethodBuilderCreate = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilder,
440 MemberFilter.Method ("Create", 0, ParametersCompiled.EmptyReadOnlyParameters, types.AsyncTaskMethodBuilder.TypeSpec));
442 AsyncTaskMethodBuilderSetResult = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilder,
443 MemberFilter.Method ("SetResult", 0, ParametersCompiled.EmptyReadOnlyParameters, btypes.Void));
445 AsyncTaskMethodBuilderSetStateMachine = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilder,
446 "SetStateMachine", MemberKind.Method, () => new[] {
447 types.IAsyncStateMachine.TypeSpec
448 }, btypes.Void);
450 AsyncTaskMethodBuilderSetException = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilder,
451 MemberFilter.Method ("SetException", 0,
452 ParametersCompiled.CreateFullyResolved (btypes.Exception), btypes.Void));
454 AsyncTaskMethodBuilderOnCompleted = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilder,
455 MemberFilter.Method ("AwaitOnCompleted", 2,
456 new ParametersImported (
457 new[] {
458 new ParameterData (null, Parameter.Modifier.REF),
459 new ParameterData (null, Parameter.Modifier.REF)
461 new[] {
462 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
463 new TypeParameterSpec (1, tp, SpecialConstraint.None, Variance.None, null)
464 }, false),
465 btypes.Void));
467 AsyncTaskMethodBuilderOnCompletedUnsafe = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilder,
468 MemberFilter.Method ("AwaitUnsafeOnCompleted", 2,
469 new ParametersImported (
470 new[] {
471 new ParameterData (null, Parameter.Modifier.REF),
472 new ParameterData (null, Parameter.Modifier.REF)
474 new[] {
475 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
476 new TypeParameterSpec (1, tp, SpecialConstraint.None, Variance.None, null)
477 }, false),
478 btypes.Void));
480 AsyncTaskMethodBuilderStart = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilder,
481 MemberFilter.Method ("Start", 1,
482 new ParametersImported (
483 new[] {
484 new ParameterData (null, Parameter.Modifier.REF),
486 new[] {
487 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
488 }, false),
489 btypes.Void));
491 AsyncTaskMethodBuilderTask = new PredefinedMember<PropertySpec> (module, types.AsyncTaskMethodBuilder,
492 MemberFilter.Property ("Task", null));
494 // TODO: Must me static
495 AsyncTaskMethodBuilderGenericCreate = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilderGeneric,
496 MemberFilter.Method ("Create", 0, ParametersCompiled.EmptyReadOnlyParameters, types.AsyncVoidMethodBuilder.TypeSpec));
498 AsyncTaskMethodBuilderGenericSetResult = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilderGeneric,
499 "SetResult", MemberKind.Method, () => new TypeSpec[] {
500 types.AsyncTaskMethodBuilderGeneric.TypeSpec.MemberDefinition.TypeParameters[0]
501 }, btypes.Void);
503 AsyncTaskMethodBuilderGenericSetStateMachine = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilderGeneric,
504 "SetStateMachine", MemberKind.Method, () => new[] {
505 types.IAsyncStateMachine.TypeSpec
506 }, btypes.Void);
508 AsyncTaskMethodBuilderGenericSetException = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilderGeneric,
509 MemberFilter.Method ("SetException", 0,
510 ParametersCompiled.CreateFullyResolved (btypes.Exception), btypes.Void));
512 AsyncTaskMethodBuilderGenericOnCompleted = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilderGeneric,
513 MemberFilter.Method ("AwaitOnCompleted", 2,
514 new ParametersImported (
515 new[] {
516 new ParameterData (null, Parameter.Modifier.REF),
517 new ParameterData (null, Parameter.Modifier.REF)
519 new[] {
520 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
521 new TypeParameterSpec (1, tp, SpecialConstraint.None, Variance.None, null)
522 }, false),
523 btypes.Void));
525 AsyncTaskMethodBuilderGenericOnCompletedUnsafe = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilderGeneric,
526 MemberFilter.Method ("AwaitUnsafeOnCompleted", 2,
527 new ParametersImported (
528 new[] {
529 new ParameterData (null, Parameter.Modifier.REF),
530 new ParameterData (null, Parameter.Modifier.REF)
532 new[] {
533 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
534 new TypeParameterSpec (1, tp, SpecialConstraint.None, Variance.None, null)
535 }, false),
536 btypes.Void));
538 AsyncTaskMethodBuilderGenericStart = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilderGeneric,
539 MemberFilter.Method ("Start", 1,
540 new ParametersImported (
541 new[] {
542 new ParameterData (null, Parameter.Modifier.REF),
544 new[] {
545 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
546 }, false),
547 btypes.Void));
549 AsyncTaskMethodBuilderGenericTask = new PredefinedMember<PropertySpec> (module, types.AsyncTaskMethodBuilderGeneric,
550 MemberFilter.Property ("Task", null));
552 // TODO: Must me static
553 AsyncVoidMethodBuilderCreate = new PredefinedMember<MethodSpec> (module, types.AsyncVoidMethodBuilder,
554 MemberFilter.Method ("Create", 0, ParametersCompiled.EmptyReadOnlyParameters, types.AsyncVoidMethodBuilder.TypeSpec));
556 AsyncVoidMethodBuilderSetException = new PredefinedMember<MethodSpec> (module, types.AsyncVoidMethodBuilder,
557 MemberFilter.Method ("SetException", 0, null, btypes.Void));
559 AsyncVoidMethodBuilderSetResult = new PredefinedMember<MethodSpec> (module, types.AsyncVoidMethodBuilder,
560 MemberFilter.Method ("SetResult", 0, ParametersCompiled.EmptyReadOnlyParameters, btypes.Void));
562 AsyncVoidMethodBuilderSetStateMachine = new PredefinedMember<MethodSpec> (module, types.AsyncVoidMethodBuilder,
563 "SetStateMachine", MemberKind.Method, () => new[] {
564 types.IAsyncStateMachine.TypeSpec
565 }, btypes.Void);
567 AsyncVoidMethodBuilderOnCompleted = new PredefinedMember<MethodSpec> (module, types.AsyncVoidMethodBuilder,
568 MemberFilter.Method ("AwaitOnCompleted", 2,
569 new ParametersImported (
570 new[] {
571 new ParameterData (null, Parameter.Modifier.REF),
572 new ParameterData (null, Parameter.Modifier.REF)
574 new[] {
575 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
576 new TypeParameterSpec (1, tp, SpecialConstraint.None, Variance.None, null)
577 }, false),
578 btypes.Void));
580 AsyncVoidMethodBuilderOnCompletedUnsafe = new PredefinedMember<MethodSpec> (module, types.AsyncVoidMethodBuilder,
581 MemberFilter.Method ("AwaitUnsafeOnCompleted", 2,
582 new ParametersImported (
583 new[] {
584 new ParameterData (null, Parameter.Modifier.REF),
585 new ParameterData (null, Parameter.Modifier.REF)
587 new[] {
588 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
589 new TypeParameterSpec (1, tp, SpecialConstraint.None, Variance.None, null)
590 }, false),
591 btypes.Void));
593 AsyncVoidMethodBuilderStart = new PredefinedMember<MethodSpec> (module, types.AsyncVoidMethodBuilder,
594 MemberFilter.Method ("Start", 1,
595 new ParametersImported (
596 new[] {
597 new ParameterData (null, Parameter.Modifier.REF),
599 new[] {
600 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
601 }, false),
602 btypes.Void));
604 AsyncStateMachineAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.AsyncStateMachine,
605 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (
606 btypes.Type)));
608 DebuggerBrowsableAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.DebuggerBrowsable,
609 MemberFilter.Constructor (null));
611 DecimalCtor = new PredefinedMember<MethodSpec> (module, btypes.Decimal,
612 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (
613 btypes.Int, btypes.Int, btypes.Int, btypes.Bool, btypes.Byte)));
615 DecimalCtorInt = new PredefinedMember<MethodSpec> (module, btypes.Decimal,
616 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (btypes.Int)));
618 DecimalCtorLong = new PredefinedMember<MethodSpec> (module, btypes.Decimal,
619 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (btypes.Long)));
621 DecimalConstantAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.DecimalConstant,
622 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (
623 btypes.Byte, btypes.Byte, btypes.UInt, btypes.UInt, btypes.UInt)));
625 DefaultMemberAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.DefaultMember,
626 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (btypes.String)));
628 DelegateCombine = new PredefinedMember<MethodSpec> (module, btypes.Delegate, "Combine", btypes.Delegate, btypes.Delegate);
629 DelegateRemove = new PredefinedMember<MethodSpec> (module, btypes.Delegate, "Remove", btypes.Delegate, btypes.Delegate);
631 DelegateEqual = new PredefinedMember<MethodSpec> (module, btypes.Delegate,
632 new MemberFilter (Operator.GetMetadataName (Operator.OpType.Equality), 0, MemberKind.Operator, null, btypes.Bool));
634 DelegateInequal = new PredefinedMember<MethodSpec> (module, btypes.Delegate,
635 new MemberFilter (Operator.GetMetadataName (Operator.OpType.Inequality), 0, MemberKind.Operator, null, btypes.Bool));
637 DynamicAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.Dynamic,
638 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (
639 ArrayContainer.MakeType (module, btypes.Bool))));
641 FieldInfoGetFieldFromHandle = new PredefinedMember<MethodSpec> (module, types.FieldInfo,
642 "GetFieldFromHandle", MemberKind.Method, types.RuntimeFieldHandle);
644 FieldInfoGetFieldFromHandle2 = new PredefinedMember<MethodSpec> (module, types.FieldInfo,
645 "GetFieldFromHandle", MemberKind.Method, types.RuntimeFieldHandle, new PredefinedType (btypes.RuntimeTypeHandle));
647 FixedBufferAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.FixedBuffer,
648 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (btypes.Type, btypes.Int)));
650 IDisposableDispose = new PredefinedMember<MethodSpec> (module, btypes.IDisposable, "Dispose", TypeSpec.EmptyTypes);
652 IEnumerableGetEnumerator = new PredefinedMember<MethodSpec> (module, btypes.IEnumerable,
653 "GetEnumerator", TypeSpec.EmptyTypes);
655 InterlockedCompareExchange = new PredefinedMember<MethodSpec> (module, types.Interlocked,
656 MemberFilter.Method ("CompareExchange", 0,
657 new ParametersImported (
658 new[] {
659 new ParameterData (null, Parameter.Modifier.REF),
660 new ParameterData (null, Parameter.Modifier.NONE),
661 new ParameterData (null, Parameter.Modifier.NONE)
663 new[] {
664 btypes.Int, btypes.Int, btypes.Int
666 false),
667 btypes.Int));
669 InterlockedCompareExchange_T = new PredefinedMember<MethodSpec> (module, types.Interlocked,
670 MemberFilter.Method ("CompareExchange", 1,
671 new ParametersImported (
672 new[] {
673 new ParameterData (null, Parameter.Modifier.REF),
674 new ParameterData (null, Parameter.Modifier.NONE),
675 new ParameterData (null, Parameter.Modifier.NONE)
677 new[] {
678 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
679 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
680 new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null),
681 }, false),
682 null));
684 MethodInfoGetMethodFromHandle = new PredefinedMember<MethodSpec> (module, types.MethodBase,
685 "GetMethodFromHandle", MemberKind.Method, types.RuntimeMethodHandle);
687 MethodInfoGetMethodFromHandle2 = new PredefinedMember<MethodSpec> (module, types.MethodBase,
688 "GetMethodFromHandle", MemberKind.Method, types.RuntimeMethodHandle, new PredefinedType (btypes.RuntimeTypeHandle));
690 MethodInfoCreateDelegate = new PredefinedMember<MethodSpec> (module, types.MethodInfo,
691 "CreateDelegate", MemberKind.Method,
692 new PredefinedType (btypes.Type), new PredefinedType (btypes.Object));
694 MonitorEnter = new PredefinedMember<MethodSpec> (module, types.Monitor, "Enter", btypes.Object);
696 MonitorEnter_v4 = new PredefinedMember<MethodSpec> (module, types.Monitor,
697 MemberFilter.Method ("Enter", 0,
698 new ParametersImported (new[] {
699 new ParameterData (null, Parameter.Modifier.NONE),
700 new ParameterData (null, Parameter.Modifier.REF)
702 new[] {
703 btypes.Object, btypes.Bool
704 }, false), null));
706 MonitorExit = new PredefinedMember<MethodSpec> (module, types.Monitor, "Exit", btypes.Object);
708 RuntimeCompatibilityWrapNonExceptionThrows = new PredefinedMember<PropertySpec> (module, atypes.RuntimeCompatibility,
709 MemberFilter.Property ("WrapNonExceptionThrows", btypes.Bool));
711 RuntimeHelpersInitializeArray = new PredefinedMember<MethodSpec> (module, types.RuntimeHelpers,
712 "InitializeArray", btypes.Array, btypes.RuntimeFieldHandle);
714 RuntimeHelpersOffsetToStringData = new PredefinedMember<PropertySpec> (module, types.RuntimeHelpers,
715 MemberFilter.Property ("OffsetToStringData", btypes.Int));
717 SecurityActionRequestMinimum = new PredefinedMember<ConstSpec> (module, types.SecurityAction, "RequestMinimum",
718 MemberKind.Field, types.SecurityAction);
720 StringEmpty = new PredefinedMember<FieldSpec> (module, btypes.String, MemberFilter.Field ("Empty", btypes.String));
722 StringEqual = new PredefinedMember<MethodSpec> (module, btypes.String,
723 new MemberFilter (Operator.GetMetadataName (Operator.OpType.Equality), 0, MemberKind.Operator, null, btypes.Bool));
725 StringInequal = new PredefinedMember<MethodSpec> (module, btypes.String,
726 new MemberFilter (Operator.GetMetadataName (Operator.OpType.Inequality), 0, MemberKind.Operator, null, btypes.Bool));
728 StructLayoutAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.StructLayout,
729 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (btypes.Short)));
731 StructLayoutCharSet = new PredefinedMember<FieldSpec> (module, atypes.StructLayout, "CharSet",
732 MemberKind.Field, types.CharSet);
734 StructLayoutSize = new PredefinedMember<FieldSpec> (module, atypes.StructLayout,
735 MemberFilter.Field ("Size", btypes.Int));
737 TypeGetTypeFromHandle = new PredefinedMember<MethodSpec> (module, btypes.Type, "GetTypeFromHandle", btypes.RuntimeTypeHandle);
739 TupleElementNamesAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.TupleElementNames,
740 MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (
741 ArrayContainer.MakeType (module, btypes.String))));
745 public class PredefinedType
747 readonly string name;
748 readonly string ns;
749 readonly int arity;
750 readonly MemberKind kind;
751 protected readonly ModuleContainer module;
752 protected TypeSpec type;
753 bool defined;
755 public PredefinedType (ModuleContainer module, MemberKind kind, string ns, string name, int arity)
756 : this (module, kind, ns, name)
758 this.arity = arity;
761 public PredefinedType (ModuleContainer module, MemberKind kind, string ns, string name)
763 this.module = module;
764 this.kind = kind;
765 this.name = name;
766 this.ns = ns;
769 public PredefinedType (BuiltinTypeSpec type)
771 this.kind = type.Kind;
772 this.name = type.Name;
773 this.ns = type.Namespace;
774 this.type = type;
777 #region Properties
779 public int Arity {
780 get {
781 return arity;
785 public bool IsDefined {
786 get {
787 return type != null;
791 public string Name {
792 get {
793 return name;
797 public string Namespace {
798 get {
799 return ns;
803 public TypeSpec TypeSpec {
804 get {
805 return type;
809 #endregion
811 public bool Define ()
813 if (type != null)
814 return true;
816 if (!defined) {
817 defined = true;
818 type = Resolve (module, kind, ns, name, arity, false, false);
821 return type != null;
824 public string GetSignatureForError ()
826 return ns + "." + name;
829 public static TypeSpec Resolve (ModuleContainer module, MemberKind kind, string ns, string name, int arity, bool required, bool reportErrors)
832 // Cannot call it with true because it could create non-existent namespaces for
833 // predefined types. It's set to true only for build-in types which all must
834 // exist therefore it does not matter, for predefined types we don't want to create
835 // fake namespaces when type is optional and does not exist (e.g. System.Linq).
837 Namespace type_ns = module.GlobalRootNamespace.GetNamespace (ns, required);
839 IList<TypeSpec> found = null;
840 if (type_ns != null)
841 found = type_ns.GetAllTypes (name);
843 if (found == null) {
844 if (reportErrors)
845 module.Compiler.Report.Error (518, "The predefined type `{0}.{1}' is not defined or imported", ns, name);
847 return null;
850 TypeSpec best_match = null;
851 foreach (var candidate in found) {
852 if (candidate.Kind != kind) {
853 if (candidate.Kind == MemberKind.Struct && kind == MemberKind.Void && candidate.MemberDefinition is TypeContainer) {
854 // Void is declared as struct but we keep it internally as
855 // special kind, the swap will be done by caller
856 } else {
857 continue;
861 if (candidate.Arity != arity)
862 continue;
864 if ((candidate.Modifiers & Modifiers.INTERNAL) != 0 && !candidate.MemberDefinition.IsInternalAsPublic (module.DeclaringAssembly))
865 continue;
867 if (best_match == null) {
868 best_match = candidate;
869 continue;
872 var other_match = best_match;
873 if (!best_match.MemberDefinition.IsImported &&
874 module.Compiler.BuiltinTypes.Object.MemberDefinition.DeclaringAssembly == candidate.MemberDefinition.DeclaringAssembly) {
875 best_match = candidate;
878 string location;
879 if (best_match.MemberDefinition is MemberCore) {
880 location = ((MemberCore) best_match.MemberDefinition).Location.Name;
881 } else {
882 var assembly = (ImportedAssemblyDefinition) best_match.MemberDefinition.DeclaringAssembly;
883 location = Path.GetFileName (assembly.Location);
886 module.Compiler.Report.SymbolRelatedToPreviousError (other_match);
887 module.Compiler.Report.SymbolRelatedToPreviousError (candidate);
889 module.Compiler.Report.Warning (1685, 1,
890 "The predefined type `{0}.{1}' is defined multiple times. Using definition from `{2}'",
891 ns, name, location);
893 break;
896 if (best_match == null && reportErrors) {
897 var found_member = found[0];
899 if (found_member.Kind == MemberKind.MissingType) {
900 // CSC: should be different error number
901 module.Compiler.Report.Error (518, "The predefined type `{0}.{1}' is defined in an assembly that is not referenced.", ns, name);
902 } else {
903 Location loc;
904 if (found_member.MemberDefinition is MemberCore) {
905 loc = ((MemberCore) found_member.MemberDefinition).Location;
906 } else {
907 loc = Location.Null;
908 module.Compiler.Report.SymbolRelatedToPreviousError (found_member);
911 module.Compiler.Report.Error (520, loc, "The predefined type `{0}.{1}' is not declared correctly", ns, name);
915 return best_match;
918 public TypeSpec Resolve ()
920 if (type == null)
921 type = Resolve (module, kind, ns, name, arity, false, true);
923 return type;
927 public class PredefinedMember<T> where T : MemberSpec
929 readonly ModuleContainer module;
930 T member;
931 TypeSpec declaring_type;
932 readonly PredefinedType declaring_type_predefined;
933 MemberFilter filter;
934 readonly Func<TypeSpec[]> filter_builder;
936 public PredefinedMember (ModuleContainer module, PredefinedType type, MemberFilter filter)
938 this.module = module;
939 this.declaring_type_predefined = type;
940 this.filter = filter;
943 public PredefinedMember (ModuleContainer module, TypeSpec type, MemberFilter filter)
945 this.module = module;
946 this.declaring_type = type;
947 this.filter = filter;
950 public PredefinedMember (ModuleContainer module, PredefinedType type, string name, params TypeSpec[] types)
951 : this (module, type, MemberFilter.Method (name, 0, ParametersCompiled.CreateFullyResolved (types), null))
955 public PredefinedMember (ModuleContainer module, PredefinedType type, string name, MemberKind kind, params PredefinedType[] types)
956 : this (module, type, new MemberFilter (name, 0, kind, null, null))
958 filter_builder = () => {
959 var ptypes = new TypeSpec[types.Length];
960 for (int i = 0; i < ptypes.Length; ++i) {
961 var p = types[i];
962 if (!p.Define ())
963 return null;
965 ptypes[i] = p.TypeSpec;
968 return ptypes;
972 public PredefinedMember (ModuleContainer module, PredefinedType type, string name, MemberKind kind, Func<TypeSpec[]> typesBuilder, TypeSpec returnType)
973 : this (module, type, new MemberFilter (name, 0, kind, null, returnType))
975 filter_builder = typesBuilder;
978 public PredefinedMember (ModuleContainer module, BuiltinTypeSpec type, string name, params TypeSpec[] types)
979 : this (module, type, MemberFilter.Method (name, 0, ParametersCompiled.CreateFullyResolved (types), null))
983 public T Get ()
985 if (member != null)
986 return member;
988 if (declaring_type == null) {
989 if (!declaring_type_predefined.Define ())
990 return null;
992 declaring_type = declaring_type_predefined.TypeSpec;
995 if (filter_builder != null) {
996 var types = filter_builder ();
998 if (filter.Kind == MemberKind.Field)
999 filter = new MemberFilter (filter.Name, filter.Arity, filter.Kind, null, types [0]);
1000 else
1001 filter = new MemberFilter (filter.Name, filter.Arity, filter.Kind,
1002 ParametersCompiled.CreateFullyResolved (types), filter.MemberType);
1005 member = MemberCache.FindMember (declaring_type, filter, BindingRestriction.DeclaredOnly) as T;
1006 if (member == null)
1007 return null;
1009 if (!member.IsAccessible (module))
1010 return null;
1012 return member;
1015 public T Resolve (Location loc)
1017 if (Get () != null)
1018 return member;
1020 if (declaring_type == null) {
1021 if (declaring_type_predefined.Resolve () == null)
1022 return null;
1025 if (filter_builder != null) {
1026 filter = new MemberFilter (filter.Name, filter.Arity, filter.Kind,
1027 ParametersCompiled.CreateFullyResolved (filter_builder ()), filter.MemberType);
1030 string method_args = null;
1031 if (filter.Parameters != null)
1032 method_args = filter.Parameters.GetSignatureForError ();
1034 module.Compiler.Report.Error (656, loc, "The compiler required member `{0}.{1}{2}' could not be found or is inaccessible",
1035 declaring_type.GetSignatureForError (), filter.Name, method_args);
1037 return null;
1041 public class AwaiterDefinition
1043 public PropertySpec IsCompleted { get; set; }
1044 public MethodSpec GetResult { get; set; }
1045 public bool INotifyCompletion { get; set; }
1047 public bool IsValidPattern {
1048 get {
1049 return IsCompleted != null && GetResult != null && IsCompleted.HasGet;
1054 partial class TypeManager {
1056 static public string CSharpName(IList<TypeSpec> types)
1058 if (types.Count == 0)
1059 return string.Empty;
1061 StringBuilder sb = new StringBuilder ();
1062 for (int i = 0; i < types.Count; ++i) {
1063 if (i > 0)
1064 sb.Append (",");
1066 sb.Append (types [i].GetSignatureForError ());
1068 return sb.ToString ();
1071 static public string GetFullNameSignature (MemberSpec mi)
1073 return mi.GetSignatureForError ();
1076 static public string CSharpSignature (MemberSpec mb)
1078 return mb.GetSignatureForError ();
1081 public static bool IsFamilyAccessible (TypeSpec type, TypeSpec parent)
1083 // TypeParameter tparam = LookupTypeParameter (type);
1084 // TypeParameter pparam = LookupTypeParameter (parent);
1086 if (type.Kind == MemberKind.TypeParameter && parent.Kind == MemberKind.TypeParameter) { // (tparam != null) && (pparam != null)) {
1087 if (type == parent)
1088 return true;
1090 throw new NotImplementedException ("net");
1091 // return tparam.IsSubclassOf (parent);
1094 do {
1095 if (IsInstantiationOfSameGenericType (type, parent))
1096 return true;
1098 type = type.BaseType;
1099 } while (type != null);
1101 return false;
1105 // Checks whether `type' is a nested child of `parent'.
1107 public static bool IsNestedChildOf (TypeSpec type, ITypeDefinition parent)
1109 if (type == null)
1110 return false;
1112 if (type.MemberDefinition == parent)
1113 return false;
1115 type = type.DeclaringType;
1116 while (type != null) {
1117 if (type.MemberDefinition == parent)
1118 return true;
1120 type = type.DeclaringType;
1123 return false;
1126 public static TypeSpec GetElementType (TypeSpec t)
1128 return ((ElementTypeSpec)t).Element;
1131 /// <summary>
1132 /// This method is not implemented by MS runtime for dynamic types
1133 /// </summary>
1134 public static bool HasElementType (TypeSpec t)
1136 return t is ElementTypeSpec;
1139 /// <summary>
1140 /// Utility function that can be used to probe whether a type
1141 /// is managed or not.
1142 /// </summary>
1143 public static bool VerifyUnmanaged (ModuleContainer rc, TypeSpec t, Location loc)
1145 if (t.IsUnmanaged)
1146 return true;
1148 while (t.IsPointer)
1149 t = ((ElementTypeSpec) t).Element;
1151 rc.Compiler.Report.SymbolRelatedToPreviousError (t);
1152 rc.Compiler.Report.Error (208, loc,
1153 "Cannot take the address of, get the size of, or declare a pointer to a managed type `{0}'",
1154 t.GetSignatureForError ());
1156 return false;
1158 #region Generics
1159 // This method always return false for non-generic compiler,
1160 // while Type.IsGenericParameter is returned if it is supported.
1161 public static bool IsGenericParameter (TypeSpec type)
1163 return type.IsGenericParameter;
1166 public static bool IsGenericType (TypeSpec type)
1168 return type.IsGeneric;
1171 public static TypeSpec[] GetTypeArguments (TypeSpec t)
1173 // TODO: return empty array !!
1174 return t.TypeArguments;
1177 /// <summary>
1178 /// Check whether `type' and `parent' are both instantiations of the same
1179 /// generic type. Note that we do not check the type parameters here.
1180 /// </summary>
1181 public static bool IsInstantiationOfSameGenericType (TypeSpec type, TypeSpec parent)
1183 return type == parent || type.MemberDefinition == parent.MemberDefinition;
1185 #endregion