示例#1
0
 public MemberOptionTree(UnityObject target, MemberFilter memberFilter, TypeFilter memberTypeFilter, MemberAction action)
     : this(EditorUnityObjectUtility.GetUnityTypes(target), memberFilter, memberTypeFilter, action)
 {
     rootMode = RootMode.Types;
 }
 public static CodebaseSubset Subset(IEnumerable <Type> typeSet, TypeFilter typeFilter, MemberFilter memberFilter, TypeFilter memberTypeFilter = null)
 {
     return(new CodebaseSubset(typeSet, typeFilter, memberFilter, memberTypeFilter));
 }
        public bool ValidateMember(MemberInfo member, TypeFilter typeFilter = null)
        {
            if (member is FieldInfo field)
            {
                // Whitelist
                var isGettable  = true;
                var isSettable  = !field.IsLiteral && !field.IsInitOnly;
                var whitelisted = Fields || (Gettable && isGettable) || (Settable && isSettable);
                if (!whitelisted)
                {
                    return(false);
                }

                // Targetting
                var isTargeted = !field.IsStatic;
                if (!Targeted && isTargeted)
                {
                    return(false);
                }
                if (!NonTargeted && !isTargeted)
                {
                    return(false);
                }

                // Accessibility
                if (!WriteOnly && !isGettable)
                {
                    return(false);
                }
                if (!ReadOnly && !isSettable)
                {
                    return(false);
                }

                // Visibility
                if (!Public && field.IsPublic)
                {
                    return(false);
                }
                if (!NonPublic && !field.IsPublic)
                {
                    return(false);
                }

                // Type
                if (typeFilter != null && !typeFilter.ValidateType(field.FieldType))
                {
                    return(false);
                }

                // Other
                if (field.IsSpecialName)
                {
                    return(false);
                }
            }
            else if (member is PropertyInfo property)
            {
                var getter = property.GetGetMethod(true);
                var setter = property.GetSetMethod(true);

                // Whitelist
                var isGettable  = property.CanRead;
                var isSettable  = property.CanWrite;
                var whitelisted = Properties || (Gettable && isGettable) || (Settable && isSettable);
                if (!whitelisted)
                {
                    return(false);
                }

                // Visibility & Accessibility
                // TODO: Refactor + Take into account when Public = false
                var requiresRead  = (!WriteOnly || (!Properties && Gettable));
                var requiresWrite = (!ReadOnly || (!Properties && Settable));
                var canRead       = property.CanRead && (NonPublic || getter.IsPublic);
                var canWrite      = property.CanWrite && (NonPublic || setter.IsPublic);
                if (requiresRead && !canRead)
                {
                    return(false);
                }
                if (requiresWrite && !canWrite)
                {
                    return(false);
                }

                // Targetting
                var isTargeted = !(getter ?? setter).IsStatic;
                if (!Targeted && isTargeted)
                {
                    return(false);
                }
                if (!NonTargeted && !isTargeted)
                {
                    return(false);
                }

                // Type
                if (typeFilter != null && !typeFilter.ValidateType(property.PropertyType))
                {
                    return(false);
                }

                // Other
                if (!Indexers && property.IsSpecialName)
                {
                    return(false);
                }
                if (!Indexers && property.IsIndexer())
                {
                    return(false);
                }
            }
            else if (member is MethodBase methodOrConstructor)
            {
                var isExtension = methodOrConstructor.IsExtensionMethod();
                var isOperator  = methodOrConstructor.IsOperator();
                var isTargeted  = !methodOrConstructor.IsStatic || isExtension || isOperator;

                // Visibility
                if (!Public && methodOrConstructor.IsPublic)
                {
                    return(false);
                }
                if (!NonPublic && !methodOrConstructor.IsPublic)
                {
                    return(false);
                }

                // Other
                if (!Parameters && (methodOrConstructor.GetParameters().Length > (isExtension || isOperator ? 1 : 0)))
                {
                    return(false);
                }
                if (!OpenConstructedGeneric && methodOrConstructor.ContainsGenericParameters)
                {
                    return(false);
                }

                if (methodOrConstructor is MethodInfo method)
                {
                    var isConversion = method.IsUserDefinedConversion();

                    // Whitelist
                    var isGettable  = method.ReturnType != typeof(void);
                    var isSettable  = false;
                    var whitelisted = Methods || (Gettable && isGettable) || (Settable && isSettable);
                    if (!whitelisted)
                    {
                        return(false);
                    }

                    // Targetting
                    if (!Targeted && isTargeted)
                    {
                        return(false);
                    }
                    if (!NonTargeted && !isTargeted)
                    {
                        return(false);
                    }

                    // Operators
                    if (!Operators && isOperator)
                    {
                        return(false);
                    }

                    // Extensions
                    if (!Extensions && isExtension)
                    {
                        return(false);
                    }

                    // Type
                    if (typeFilter != null && !typeFilter.ValidateType(method.ReturnType))
                    {
                        return(false);
                    }

                    // Other
                    if (method.IsSpecialName && !(isOperator || isConversion))
                    {
                        return(false);
                    }
                }
                else if (member is ConstructorInfo constructor)
                {
                    // Whitelist
                    var isGettable  = true;
                    var isSettable  = false;
                    var whitelisted = Constructors || (Gettable && isGettable) || (Settable && isSettable);
                    if (!whitelisted)
                    {
                        return(false);
                    }

                    // Type
                    if (typeFilter != null && !typeFilter.ValidateType(constructor.DeclaringType))
                    {
                        return(false);
                    }

                    // Type Initializers
                    if (constructor.IsStatic && !TypeInitializers)
                    {
                        return(false);
                    }

                    // Other
                    if (typeof(Component).IsAssignableFrom(member.DeclaringType) || typeof(ScriptableObject).IsAssignableFrom(member.DeclaringType))
                    {
                        return(false);
                    }
                }
            }
            else if (member is EventInfo @event)
            {
                // Whitelist
                if (!Events)
                {
                    return(false);
                }

                // Targetting
                var isTargeted = [email protected]();
                if (!Targeted && isTargeted)
                {
                    return(false);
                }
                if (!NonTargeted && !isTargeted)
                {
                    return(false);
                }

                // Visibility
                var isPublic = @event.IsPublic();
                if (!Public && isPublic)
                {
                    return(false);
                }
                if (!NonPublic && !isPublic)
                {
                    return(false);
                }

                // Type
                if (typeFilter != null && !typeFilter.ValidateType(@event.EventHandlerType))
                {
                    return(false);
                }

                // Other
                if (@event.IsSpecialName)
                {
                    return(false);
                }
            }

            // Obsolete
            if (!Obsolete && member.HasAttribute <ObsoleteAttribute>(false))
            {
                return(false);
            }

            return(true);
        }
示例#4
0
        public CodebaseSubset(IEnumerable <Type> typeSet, TypeFilter typeFilter, MemberFilter memberFilter, TypeFilter memberTypeFilter = null)
        {
            Ensure.That(nameof(typeSet)).IsNotNull(typeSet);
            Ensure.That(nameof(typeFilter)).IsNotNull(typeFilter);
            Ensure.That(nameof(memberFilter)).IsNotNull(memberFilter);

            this.typeSet          = typeSet;
            this.typeFilter       = typeFilter;
            this.memberFilter     = memberFilter;
            this.memberTypeFilter = memberTypeFilter;

            Filter();
        }