1 //
2 // IGenericParameterProvider.cs
3 //
4 // Author:
5 //   Jb Evain (jbevain@gmail.com)
6 //
7 // Copyright (c) 2008 - 2011 Jb Evain
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28 
29 
30 using Mono.Collections.Generic;
31 
32 namespace Mono.Cecil {
33 
34 	public interface IGenericParameterProvider : IMetadataTokenProvider {
35 
36 		bool HasGenericParameters { get; }
37 		bool IsDefinition { get; }
38 		ModuleDefinition Module { get; }
39 		Collection<GenericParameter> GenericParameters { get; }
40 		GenericParameterType GenericParameterType { get; }
41 	}
42 
43 	public enum GenericParameterType {
44 		Type,
45 		Method
46 	}
47 
48 	interface IGenericContext {
49 
50 		bool IsDefinition { get; }
51 		IGenericParameterProvider Type { get; }
52 		IGenericParameterProvider Method { get; }
53 	}
54 
55 	static partial class Mixin {
56 
GetHasGenericParameters( this IGenericParameterProvider self, ModuleDefinition module)57 		public static bool GetHasGenericParameters (
58 			this IGenericParameterProvider self,
59 			ModuleDefinition module)
60 		{
61 			return module.HasImage () && module.Read (self, (provider, reader) => reader.HasGenericParameters (provider));
62 		}
63 
GetGenericParameters( this IGenericParameterProvider self, ModuleDefinition module)64 		public static Collection<GenericParameter> GetGenericParameters (
65 			this IGenericParameterProvider self,
66 			ModuleDefinition module)
67 		{
68 			return module.HasImage ()
69 				? module.Read (self, (provider, reader) => reader.ReadGenericParameters (provider))
70 				: new GenericParameterCollection (self);
71 		}
72 	}
73 }
74