public override TreeViewNodeFilterResult GetFilterResult(TypeDef type)
        {
            var childrenFlags = VisibleMembersFlags.AnyTypeDef | VisibleMembersFlags.FieldDef |
                    VisibleMembersFlags.MethodDef | VisibleMembersFlags.InstanceConstructor |
                    VisibleMembersFlags.PropertyDef | VisibleMembersFlags.EventDef |
                    VisibleMembersFlags.BaseTypes | VisibleMembersFlags.DerivedTypes |
                    VisibleMembersFlags.MethodBody | VisibleMembersFlags.ParamDefs |
                    VisibleMembersFlags.ParamDef | VisibleMembersFlags.Locals |
                    VisibleMembersFlags.Local;
            var visibleFlags = VisibleMembersFlags.AnyTypeDef | childrenFlags;
            if ((flags & visibleFlags) == 0)
                return new TreeViewNodeFilterResult(FilterResult.Hidden, false);
            if ((flags & VisibleMembersFlags.GenericTypeDef) != 0 && type.GenericParameters.Count > 0)
                return new TreeViewNodeFilterResult(FilterResult.Match, true);
            else if ((flags & VisibleMembersFlags.NonGenericTypeDef) != 0 && type.GenericParameters.Count == 0)
                return new TreeViewNodeFilterResult(FilterResult.Match, true);
            else if ((flags & VisibleMembersFlags.EnumTypeDef) != 0 && type.IsEnum)
                return new TreeViewNodeFilterResult(FilterResult.Match, true);
            else if ((flags & VisibleMembersFlags.InterfaceTypeDef) != 0 && type.IsInterface)
                return new TreeViewNodeFilterResult(FilterResult.Match, true);
            else if ((flags & VisibleMembersFlags.ClassTypeDef) != 0 && !type.IsValueType && !type.IsInterface)
                return new TreeViewNodeFilterResult(FilterResult.Match, true);
            else if ((flags & VisibleMembersFlags.StructTypeDef) != 0 && type.IsValueType && !type.IsEnum)
                return new TreeViewNodeFilterResult(FilterResult.Match, true);
            else if ((flags & VisibleMembersFlags.DelegateTypeDef) != 0 && TypeTreeNode.IsDelegate(type))
                return new TreeViewNodeFilterResult(FilterResult.Match, true);
            else if ((flags & VisibleMembersFlags.TypeDef) != 0)
                return new TreeViewNodeFilterResult(FilterResult.Match, true);
            else if ((flags & childrenFlags) == 0)
                return new TreeViewNodeFilterResult(FilterResult.Hidden, false);

            var defaultValue = new TreeViewNodeFilterResult(FilterResult.Recurse, false);
            if (type.HasNestedTypes)
                return defaultValue;
            if ((flags & VisibleMembersFlags.FieldDef) != 0 && type.HasFields)
                return defaultValue;
            if ((flags & VisibleMembersFlags.MethodDef) != 0 && type.HasMethods)
                return defaultValue;
            if ((flags & VisibleMembersFlags.InstanceConstructor) != 0 && HasInstanceConstructors(type))
                return defaultValue;
            if ((flags & VisibleMembersFlags.PropertyDef) != 0 && type.HasProperties)
                return defaultValue;
            if ((flags & VisibleMembersFlags.EventDef) != 0 && type.HasEvents)
                return defaultValue;
            if ((flags & VisibleMembersFlags.BaseTypes) != 0 || (flags & VisibleMembersFlags.DerivedTypes) != 0)
                return defaultValue;
            if ((flags & VisibleMembersFlags.MethodBody) != 0 && HasMethodBodies(type))
                return defaultValue;
            if ((flags & (VisibleMembersFlags.ParamDefs | VisibleMembersFlags.ParamDef)) != 0 && HasParamDefs(type))
                return defaultValue;
            if ((flags & (VisibleMembersFlags.Locals | VisibleMembersFlags.Local)) != 0 && HasLocals(type))
                return defaultValue;

            return new TreeViewNodeFilterResult(FilterResult.Hidden, false);
        }
        public override TreeViewNodeFilterResult GetFilterResult(TypeDef type)
        {
            var childrenFlags = VisibleMembersFlags.AnyTypeDef | VisibleMembersFlags.FieldDef |
                                VisibleMembersFlags.MethodDef | VisibleMembersFlags.InstanceConstructor |
                                VisibleMembersFlags.PropertyDef | VisibleMembersFlags.EventDef |
                                VisibleMembersFlags.BaseTypes | VisibleMembersFlags.DerivedTypes |
                                VisibleMembersFlags.MethodBody | VisibleMembersFlags.ParamDefs |
                                VisibleMembersFlags.ParamDef | VisibleMembersFlags.Locals |
                                VisibleMembersFlags.Local;
            var visibleFlags = VisibleMembersFlags.AnyTypeDef | childrenFlags;

            if ((flags & visibleFlags) == 0)
            {
                return(new TreeViewNodeFilterResult(FilterResult.Hidden, false));
            }
            if ((flags & VisibleMembersFlags.GenericTypeDef) != 0 && type.GenericParameters.Count > 0)
            {
                return(new TreeViewNodeFilterResult(FilterResult.Match, true));
            }
            else if ((flags & VisibleMembersFlags.NonGenericTypeDef) != 0 && type.GenericParameters.Count == 0)
            {
                return(new TreeViewNodeFilterResult(FilterResult.Match, true));
            }
            else if ((flags & VisibleMembersFlags.EnumTypeDef) != 0 && type.IsEnum)
            {
                return(new TreeViewNodeFilterResult(FilterResult.Match, true));
            }
            else if ((flags & VisibleMembersFlags.InterfaceTypeDef) != 0 && type.IsInterface)
            {
                return(new TreeViewNodeFilterResult(FilterResult.Match, true));
            }
            else if ((flags & VisibleMembersFlags.ClassTypeDef) != 0 && !type.IsValueType && !type.IsInterface)
            {
                return(new TreeViewNodeFilterResult(FilterResult.Match, true));
            }
            else if ((flags & VisibleMembersFlags.StructTypeDef) != 0 && type.IsValueType && !type.IsEnum)
            {
                return(new TreeViewNodeFilterResult(FilterResult.Match, true));
            }
            else if ((flags & VisibleMembersFlags.DelegateTypeDef) != 0 && TypeTreeNode.IsDelegate(type))
            {
                return(new TreeViewNodeFilterResult(FilterResult.Match, true));
            }
            else if ((flags & VisibleMembersFlags.TypeDef) != 0)
            {
                return(new TreeViewNodeFilterResult(FilterResult.Match, true));
            }
            else if ((flags & childrenFlags) == 0)
            {
                return(new TreeViewNodeFilterResult(FilterResult.Hidden, false));
            }

            var defaultValue = new TreeViewNodeFilterResult(FilterResult.Recurse, false);

            if (type.HasNestedTypes)
            {
                return(defaultValue);
            }
            if ((flags & VisibleMembersFlags.FieldDef) != 0 && type.HasFields)
            {
                return(defaultValue);
            }
            if ((flags & VisibleMembersFlags.MethodDef) != 0 && type.HasMethods)
            {
                return(defaultValue);
            }
            if ((flags & VisibleMembersFlags.InstanceConstructor) != 0 && HasInstanceConstructors(type))
            {
                return(defaultValue);
            }
            if ((flags & VisibleMembersFlags.PropertyDef) != 0 && type.HasProperties)
            {
                return(defaultValue);
            }
            if ((flags & VisibleMembersFlags.EventDef) != 0 && type.HasEvents)
            {
                return(defaultValue);
            }
            if ((flags & VisibleMembersFlags.BaseTypes) != 0 || (flags & VisibleMembersFlags.DerivedTypes) != 0)
            {
                return(defaultValue);
            }
            if ((flags & VisibleMembersFlags.MethodBody) != 0 && HasMethodBodies(type))
            {
                return(defaultValue);
            }
            if ((flags & (VisibleMembersFlags.ParamDefs | VisibleMembersFlags.ParamDef)) != 0 && HasParamDefs(type))
            {
                return(defaultValue);
            }
            if ((flags & (VisibleMembersFlags.Locals | VisibleMembersFlags.Local)) != 0 && HasLocals(type))
            {
                return(defaultValue);
            }

            return(new TreeViewNodeFilterResult(FilterResult.Hidden, false));
        }