1 //
2 // Author:
3 //   Jb Evain (jbevain@gmail.com)
4 //
5 // Copyright (c) 2008 - 2015 Jb Evain
6 // Copyright (c) 2008 - 2011 Novell, Inc.
7 //
8 // Licensed under the MIT/X11 license.
9 //
10 
11 
12 using Mono.Collections.Generic;
13 
14 namespace Mono.Cecil {
15 
16 	public interface IGenericParameterProvider : IMetadataTokenProvider {
17 
18 		bool HasGenericParameters { get; }
19 		bool IsDefinition { get; }
20 		ModuleDefinition Module { get; }
21 		Collection<GenericParameter> GenericParameters { get; }
22 		GenericParameterType GenericParameterType { get; }
23 	}
24 
25 	public enum GenericParameterType {
26 		Type,
27 		Method
28 	}
29 
30 	interface IGenericContext {
31 
32 		bool IsDefinition { get; }
33 		IGenericParameterProvider Type { get; }
34 		IGenericParameterProvider Method { get; }
35 	}
36 
37 	static partial class Mixin {
38 
GetHasGenericParameters( this IGenericParameterProvider self, ModuleDefinition module)39 		public static bool GetHasGenericParameters (
40 			this IGenericParameterProvider self,
41 			ModuleDefinition module)
42 		{
43 			return module.HasImage () && module.Read (self, (provider, reader) => reader.HasGenericParameters (provider));
44 		}
45 
GetGenericParameters( this IGenericParameterProvider self, ref Collection<GenericParameter> collection, ModuleDefinition module)46 		public static Collection<GenericParameter> GetGenericParameters (
47 			this IGenericParameterProvider self,
48 			ref Collection<GenericParameter> collection,
49 			ModuleDefinition module)
50 		{
51 			return module.HasImage ()
52 				? module.Read (ref collection, self, (provider, reader) => reader.ReadGenericParameters (provider))
53 				: collection = new GenericParameterCollection (self);
54 		}
55 	}
56 }
57