private void AnalyzeIntroducedMembers(InterfaceIntroductionDefinition introducedInterface)
        {
            MemberImplementationFinder memberFinder = new MemberImplementationFinder(introducedInterface.InterfaceType, _mixin);
            var specialMethods = new HashSet <MethodInfo> ();

            AnalyzeProperties(introducedInterface, memberFinder, specialMethods);
            AnalyzeEvents(introducedInterface, memberFinder, specialMethods);
            AnalyzeMethods(introducedInterface, memberFinder, specialMethods);
        }
        private void AnalyzeEvents(InterfaceIntroductionDefinition introducedInterface, MemberImplementationFinder memberFinder,
                                   HashSet <MethodInfo> specialMethods)
        {
            foreach (EventInfo interfaceEvent in introducedInterface.InterfaceType.GetEvents())
            {
                EventDefinition implementer = memberFinder.FindEventImplementation(interfaceEvent);
                CheckMemberImplementationFound(implementer, interfaceEvent);
                MemberVisibility visibility = GetVisibility(implementer.MemberInfo);
                introducedInterface.IntroducedEvents.Add(new EventIntroductionDefinition(introducedInterface, interfaceEvent, implementer, visibility));

                specialMethods.Add(interfaceEvent.GetAddMethod());
                specialMethods.Add(interfaceEvent.GetRemoveMethod());
            }
        }
 private void AnalyzeMethods(InterfaceIntroductionDefinition introducedInterface, MemberImplementationFinder memberFinder,
                             HashSet <MethodInfo> specialMethods)
 {
     foreach (MethodInfo interfaceMethod in introducedInterface.InterfaceType.GetMethods())
     {
         if (!specialMethods.Contains(interfaceMethod))
         {
             MethodDefinition implementer = memberFinder.FindMethodImplementation(interfaceMethod);
             CheckMemberImplementationFound(implementer, interfaceMethod);
             MemberVisibility visibility = GetVisibility(implementer.MemberInfo);
             introducedInterface.IntroducedMethods.Add(new MethodIntroductionDefinition(introducedInterface, interfaceMethod, implementer, visibility));
         }
     }
 }
        private void AnalyzeProperties(InterfaceIntroductionDefinition introducedInterface, MemberImplementationFinder memberFinder,
                                       HashSet <MethodInfo> specialMethods)
        {
            foreach (PropertyInfo interfaceProperty in introducedInterface.InterfaceType.GetProperties())
            {
                PropertyDefinition implementer = memberFinder.FindPropertyImplementation(interfaceProperty);
                CheckMemberImplementationFound(implementer, interfaceProperty);
                MemberVisibility visibility = GetVisibility(implementer.MemberInfo);
                introducedInterface.IntroducedProperties.Add(new PropertyIntroductionDefinition(introducedInterface, interfaceProperty, implementer, visibility));

                MethodInfo getMethod = interfaceProperty.GetGetMethod();
                if (getMethod != null)
                {
                    specialMethods.Add(getMethod);
                }

                MethodInfo setMethod = interfaceProperty.GetSetMethod();
                if (setMethod != null)
                {
                    specialMethods.Add(setMethod);
                }
            }
        }