IKVM11  11
Java SE 11 Virtual Machine for .NET
Loading...
Searching...
No Matches
GenericMethodInstance.cs
Go to the documentation of this file.
1/*
2 Copyright (C) 2009, 2010 Jeroen Frijters
3
4 This software is provided 'as-is', without any express or implied
5 warranty. In no event will the authors be held liable for any damages
6 arising from the use of this software.
7
8 Permission is granted to anyone to use this software for any purpose,
9 including commercial applications, and to alter it and redistribute it
10 freely, subject to the following restrictions:
11
12 1. The origin of this software must not be misrepresented; you must not
13 claim that you wrote the original software. If you use this software
14 in a product, an acknowledgment in the product documentation would be
15 appreciated but is not required.
16 2. Altered source versions must be plainly marked as such, and must not be
17 misrepresented as being the original software.
18 3. This notice may not be removed or altered from any source distribution.
19
20 Jeroen Frijters
21 jeroen@frijters.net
22
23*/
24using System;
25
26namespace IKVM.Reflection
27{
28
29 // this represents both generic method instantiations and non-generic methods on generic type instantations
30 // (this means that it can be a generic method declaration as well as a generic method instance)
31 sealed class GenericMethodInstance : MethodInfo
32 {
33
34 readonly Type declaringType;
35 readonly MethodInfo method;
36 readonly Type[] methodArgs;
37 MethodSignature lazyMethodSignature;
38
45 internal GenericMethodInstance(Type declaringType, MethodInfo method, Type[] methodArgs)
46 {
47 System.Diagnostics.Debug.Assert(method is not GenericMethodInstance);
48 this.declaringType = declaringType;
49 this.method = method;
50 this.methodArgs = methodArgs;
51 }
52
53 public override bool Equals(object obj)
54 {
55 var other = obj as GenericMethodInstance;
56 return other != null
57 && other.method.Equals(method)
58 && other.declaringType.Equals(declaringType)
59 && Util.ArrayEquals(other.methodArgs, methodArgs);
60 }
61
62 public override int GetHashCode()
63 {
64 return declaringType.GetHashCode() * 33 ^ method.GetHashCode() ^ Util.GetHashCode(methodArgs);
65 }
66
67 public override Type ReturnType
68 {
69 get { return method.ReturnType.BindTypeParameters(this); }
70 }
71
72 public override ParameterInfo ReturnParameter
73 {
74 get { return new GenericParameterInfoImpl(this, method.ReturnParameter); }
75 }
76
77 public override ParameterInfo[] GetParameters()
78 {
79 var parameters = method.GetParameters();
80 for (int i = 0; i < parameters.Length; i++)
81 parameters[i] = new GenericParameterInfoImpl(this, parameters[i]);
82
83 return parameters;
84 }
85
86 internal override Type[] GetParameterTypes()
87 {
88 var parameterTypes = method.GetParameterTypes();
89 for (int i = 0; i < parameterTypes.Length; i++)
90 parameterTypes[i] = parameterTypes[i].BindTypeParameters(method);
91
92 return parameterTypes;
93 }
94
95 internal override int ParameterCount
96 {
97 get { return method.ParameterCount; }
98 }
99
100 public override CallingConventions CallingConvention
101 {
102 get { return method.CallingConvention; }
103 }
104
105 public override MethodAttributes Attributes
106 {
107 get { return method.Attributes; }
108 }
109
110 public override MethodImplAttributes GetMethodImplementationFlags()
111 {
112 return method.GetMethodImplementationFlags();
113 }
114
115 public override string Name
116 {
117 get { return method.Name; }
118 }
119
120 public override Type DeclaringType
121 {
122 get { return declaringType.IsModulePseudoType ? null : declaringType; }
123 }
124
125 public override Module Module
126 {
127 get { return method.Module; }
128 }
129
130 public override int MetadataToken
131 {
132 get { return method.MetadataToken; }
133 }
134
135 public override MethodBody GetMethodBody()
136 {
137 var md = method as IKVM.Reflection.Reader.MethodDefImpl;
138 if (md != null)
139 return md.GetMethodBody(this);
140
141 throw new NotSupportedException();
142 }
143
144 public override int __MethodRVA
145 {
146 get { return method.__MethodRVA; }
147 }
148
149 public override MethodInfo MakeGenericMethod(params Type[] typeArguments)
150 {
151 return new GenericMethodInstance(declaringType, method, typeArguments);
152 }
153
154 public override bool IsGenericMethod
155 {
156 get { return method.IsGenericMethod; }
157 }
158
159 public override bool IsGenericMethodDefinition
160 {
161 get { return method.IsGenericMethodDefinition && methodArgs == null; }
162 }
163
164 public override bool ContainsGenericParameters
165 {
166 get
167 {
168 if (declaringType.ContainsGenericParameters)
169 return true;
170
171 if (methodArgs != null)
172 foreach (var type in methodArgs)
173 if (type.ContainsGenericParameters)
174 return true;
175
176 return false;
177 }
178 }
179
180 public override MethodInfo GetGenericMethodDefinition()
181 {
182 if (IsGenericMethod)
183 {
185 return this;
186 else if (declaringType.IsConstructedGenericType)
187 return new GenericMethodInstance(declaringType, method, null);
188 else
189 return method;
190 }
191
192 throw new InvalidOperationException();
193 }
194
195 public override MethodBase __GetMethodOnTypeDefinition()
196 {
197 return method;
198 }
199
200 public override Type[] GetGenericArguments()
201 {
202 if (methodArgs == null)
203 return method.GetGenericArguments();
204 else
205 return (Type[])methodArgs.Clone();
206 }
207
208 internal override Type GetGenericMethodArgument(int index)
209 {
210 if (methodArgs == null)
211 return method.GetGenericMethodArgument(index);
212 else
213 return methodArgs[index];
214 }
215
216 internal override int GetGenericMethodArgumentCount()
217 {
218 return method.GetGenericMethodArgumentCount();
219 }
220
221 internal override MethodInfo GetMethodOnTypeDefinition()
222 {
223 return method.GetMethodOnTypeDefinition();
224 }
225
226 internal override int ImportTo(Emit.ModuleBuilder module)
227 {
228 if (methodArgs == null)
229 return module.ImportMethodOrField(declaringType, method.Name, method.MethodSignature);
230 else
231 return module.ImportMethodSpec(declaringType, method, methodArgs);
232 }
233
234 internal override MethodSignature MethodSignature
235 {
236 get { return lazyMethodSignature ?? (lazyMethodSignature = method.MethodSignature.Bind(declaringType, methodArgs)); }
237 }
238
239 internal override MethodBase BindTypeParameters(Type type)
240 {
241 System.Diagnostics.Debug.Assert(methodArgs == null);
242 return new GenericMethodInstance(declaringType.BindTypeParameters(type), method, null);
243 }
244
245 internal override bool HasThis
246 {
247 get { return method.HasThis; }
248 }
249
250 public override MethodInfo[] __GetMethodImpls()
251 {
252 var methods = method.__GetMethodImpls();
253 for (int i = 0; i < methods.Length; i++)
254 methods[i] = (MethodInfo)methods[i].BindTypeParameters(declaringType);
255
256 return methods;
257 }
258
259 internal override int GetCurrentToken()
260 {
261 return method.GetCurrentToken();
262 }
263
264 internal override bool IsBaked
265 {
266 get { return method.IsBaked; }
267 }
268
269 }
270
271}
IKVM.Reflection.Type Type
IKVM.Reflection.MethodInfo MethodInfo
IKVM.Reflection.MethodBase MethodBase
global::java.lang.invoke.LambdaForm.Name Name
System.Runtime.InteropServices.CallingConvention CallingConvention
Definition Signature.cs:35
override MethodImplAttributes GetMethodImplementationFlags()
override MethodInfo MakeGenericMethod(params Type[] typeArguments)
Represents a method signature from IL metadadata.
override MethodBody GetMethodBody()