| File: MethodDefinitionExtensions.cs | Web Access |
| Project: src\src\Controls\src\Build.Tasks\Controls.Build.Tasks.csproj (Microsoft.Maui.Controls.Build.Tasks) |
using System.Collections.Generic; using Microsoft.Maui.Controls.Xaml; using Mono.Cecil; namespace Microsoft.Maui.Controls.Build.Tasks { static class MethodDefinitionExtensions { public static bool MatchXArguments(this MethodDefinition methodDef, ElementNode enode, TypeReference declaringTypeRef, ModuleDefinition module, ILContext context) { if (!enode.Properties.ContainsKey(XmlName.xArguments)) return !methodDef.HasParameters; var arguments = new List<INode>(); var node = enode.Properties[XmlName.xArguments] as ElementNode; if (node != null) arguments.Add(node); var list = enode.Properties[XmlName.xArguments] as ListNode; if (list != null) foreach (var n in list.CollectionItems) arguments.Add(n); if (methodDef.Parameters.Count != arguments.Count) return false; for (var i = 0; i < methodDef.Parameters.Count; i++) { var paramType = methodDef.Parameters[i].ParameterType; var genParam = paramType as GenericParameter; if (genParam != null) { var index = genParam.DeclaringType.GenericParameters.IndexOf(genParam); paramType = (declaringTypeRef as GenericInstanceType).GenericArguments[index]; } var argType = context.Variables[arguments[i] as IElementNode].VariableType; if (!argType.InheritsFromOrImplements(context.Cache, paramType)) return false; } return true; } public static TypeReference ResolveGenericReturnType(this MethodDefinition self, TypeReference declaringTypeRef, ModuleDefinition module) { if (self == null) throw new System.ArgumentNullException(nameof(self)); if (declaringTypeRef == null) throw new System.ArgumentNullException(nameof(declaringTypeRef)); if (!self.ReturnType.IsGenericParameter) return self.ReturnType; var t = ((GenericInstanceType)declaringTypeRef).GenericArguments[((GenericParameter)self.ReturnType).Position]; return t; } public static bool HasCustomAttributes(this MethodDefinition self, TypeReference attribute) { if (!self.HasCustomAttributes) return false; foreach (var arg in self.CustomAttributes) { if (TypeRefComparer.Default.Equals(arg.AttributeType, attribute)) return true; } return false; } } }