diff options
Diffstat (limited to 'Xamarin.Forms.Build.Tasks/MethodReferenceExtensions.cs')
-rw-r--r-- | Xamarin.Forms.Build.Tasks/MethodReferenceExtensions.cs | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/Xamarin.Forms.Build.Tasks/MethodReferenceExtensions.cs b/Xamarin.Forms.Build.Tasks/MethodReferenceExtensions.cs new file mode 100644 index 00000000..e377a0c6 --- /dev/null +++ b/Xamarin.Forms.Build.Tasks/MethodReferenceExtensions.cs @@ -0,0 +1,63 @@ +using System; +using Mono.Cecil; +using Mono.Cecil.Rocks; + +namespace Xamarin.Forms.Build.Tasks +{ + static class MethodReferenceExtensions + { + [Obsolete] + public static MethodReference MakeGeneric(this MethodReference self, params TypeReference[] arguments) + { + var reference = new MethodReference(self.Name, self.ReturnType) + { + DeclaringType = self.DeclaringType.MakeGenericInstanceType(arguments), + HasThis = self.HasThis, + ExplicitThis = self.ExplicitThis, + CallingConvention = self.CallingConvention + }; + + foreach (var parameter in self.Parameters) + reference.Parameters.Add(new ParameterDefinition(parameter.ParameterType)); + + foreach (var generic_parameter in self.GenericParameters) + reference.GenericParameters.Add(new GenericParameter(generic_parameter.Name, reference)); + + return reference; + } + + public static MethodReference ResolveGenericParameters(this MethodReference self, TypeReference declaringTypeRef, + ModuleDefinition module) + { + if (self == null) + throw new ArgumentNullException("self"); + if (declaringTypeRef == null) + throw new ArgumentNullException("declaringTypeRef"); + + var reference = new MethodReference(self.Name, self.ReturnType) + { + DeclaringType = declaringTypeRef, + HasThis = self.HasThis, + ExplicitThis = self.ExplicitThis, + CallingConvention = self.CallingConvention + }; + + foreach (var parameter in self.Parameters) + reference.Parameters.Add(new ParameterDefinition(module.Import(parameter.ParameterType))); + + foreach (var generic_parameter in self.GenericParameters) + reference.GenericParameters.Add(new GenericParameter(generic_parameter.Name, reference)); + + return reference; + } + + public static void ImportTypes(this MethodReference self, ModuleDefinition module) + { + if (self.HasParameters) + { + for (var i = 0; i < self.Parameters.Count; i++) + self.Parameters[i].ParameterType = module.Import(self.Parameters[i].ParameterType); + } + } + } +}
\ No newline at end of file |