Exemplo n.º 1
0
        /// <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);
            }
        }