/// <summary> /// Looks up the method node corresponding to the method definition. /// Returns null if no matching node is found. /// </summary> public ILSpyTreeNode FindMethodNode(IMethod def) { TypeTreeNode typeNode = FindTypeNode(def.DeclaringTypeDefinition); if (typeNode == null) { return(null); } // method might be an accessor, must look for parent node ILSpyTreeNode parentNode = typeNode; MethodTreeNode methodNode; parentNode.EnsureLazyChildren(); switch (def.AccessorOwner) { case IProperty p: parentNode = parentNode.Children.OfType <PropertyTreeNode>().FirstOrDefault(m => m.PropertyDefinition.MetadataToken == p.MetadataToken && !m.IsHidden); if (parentNode == null) { return(null); } parentNode.EnsureLazyChildren(); methodNode = parentNode.Children.OfType <MethodTreeNode>().FirstOrDefault(m => m.MethodDefinition.MetadataToken == def.MetadataToken && !m.IsHidden); if (methodNode == null || methodNode.IsHidden) { return(parentNode); } return(methodNode); case IEvent e: parentNode = parentNode.Children.OfType <EventTreeNode>().FirstOrDefault(m => m.EventDefinition.MetadataToken == e.MetadataToken && !m.IsHidden); if (parentNode == null) { return(null); } parentNode.EnsureLazyChildren(); methodNode = parentNode.Children.OfType <MethodTreeNode>().FirstOrDefault(m => m.MethodDefinition.MetadataToken == def.MetadataToken && !m.IsHidden); if (methodNode == null || methodNode.IsHidden) { return(parentNode); } return(methodNode); default: methodNode = typeNode.Children.OfType <MethodTreeNode>().FirstOrDefault(m => m.MethodDefinition.MetadataToken == def.MetadataToken && !m.IsHidden); if (methodNode != null) { return(methodNode); } return(null); } }