Example #1
0
        private static void GetUserSortingComparers()
        {
            m_SortingMethods = new List <MethodInfo>();
            foreach (var sortingMethod in EditorAssemblies.GetAllMethodsWithAttribute <GridPaintSortingAttribute>())
            {
                if (!sortingMethod.ReturnType.IsAssignableFrom(typeof(IComparer <GameObject>)))
                {
                    continue;
                }
                if (sortingMethod.GetGenericArguments().Length > 0)
                {
                    continue;
                }
                m_SortingMethods.Add(sortingMethod);
            }

            m_SortingTypes = new List <Type>();
            foreach (var sortingType in TypeCache.GetTypesWithAttribute <GridPaintSortingAttribute>())
            {
                if (sortingType.IsAbstract)
                {
                    continue;
                }
                m_SortingTypes.Add(sortingType);
            }
        }
        void GetMenuItemExtraInfoIfNeeded()
        {
            if (m_DebugInfoFetched)
            {
                return;
            }

            m_DebugInfoFetched = true;
            var managedMenuItemMethods = EditorAssemblies.GetAllMethodsWithAttribute <MenuItem>();

            foreach (var managedMenuItemMethod in managedMenuItemMethods)
            {
                var attributes = managedMenuItemMethod.GetCustomAttributes(typeof(MenuItem), false);
                foreach (var attribute in attributes)
                {
                    var menuAttribute = (MenuItem)attribute;
                    if (menuAttribute.menuItem == m_MenuItemPath)
                    {
                        var sourceInfo = MethodSourceFinderUtility.GetSourceInfo(managedMenuItemMethod);
                        m_FilePath       = sourceInfo.filePath;
                        m_LineNumber     = sourceInfo.lineNumber;
                        m_FullMemberName = managedMenuItemMethod.DeclaringType.FullName + "." + managedMenuItemMethod.Name;
                        return;
                    }
                }
            }
        }
Example #3
0
        /// <summary>
        /// Initialized and collect methods with SpriteDataProviderFactoryAttribute and SpriteDataProviderAssetPathProviderAttribute.
        /// </summary>
        public void Init()
        {
            var factories   = EditorAssemblies.loadedTypes.Where(x => x.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(ISpriteDataProviderFactory <>))).ToArray();
            var factoryList = new List <SpriteDataProviderFactory>();

            foreach (var factory in factories)
            {
                try
                {
                    var ins = Activator.CreateInstance(factory);
                    foreach (var i in factory.GetInterfaces())
                    {
                        var genericArguments = i.GetGenericArguments();
                        if (genericArguments.Length == 1)
                        {
                            var s = new SpriteDataProviderFactory();
                            s.instance = ins;
                            var method = i.GetMethod("CreateDataProvider");
                            s.method     = method;
                            s.methodType = genericArguments[0];
                            factoryList.Add(s);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Debug.LogAssertion(ex);
                }
            }
            m_Factories            = factoryList.ToArray();
            m_AssetPathProvider    = EditorAssemblies.GetAllMethodsWithAttribute <SpriteEditorAssetPathProviderAttribute>(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).ToArray();
            m_SpriteObjectProvider = EditorAssemblies.GetAllMethodsWithAttribute <SpriteObjectProviderAttribute>(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).ToArray();
        }
 public void ApplyActiveProfile()
 {
     m_ActiveProfile = new ShortcutProfile(k_UserProfileId);
     ApplyProfile(m_ActiveProfile);
     MigrateUserSpecifiedPrefKeys(
         EditorAssemblies.GetAllMethodsWithAttribute <FormerlyPrefKeyAsAttribute>(), m_Entries
         );
 }
 private static void GetCreateTileFromPaletteAttributeMethods()
 {
     m_CreateTileFromPaletteMethods = new List <MethodInfo>();
     foreach (var sortingMethod in EditorAssemblies.GetAllMethodsWithAttribute <CreateTileFromPaletteAttribute>())
     {
         m_CreateTileFromPaletteMethods.Add(sortingMethod);
     }
 }
        public IEnumerable <IShortcutEntryDiscoveryInfo> GetDefinedShortcuts()
        {
            const BindingFlags staticMethodsBindings = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
            var methods = EditorAssemblies.GetAllMethodsWithAttribute <ShortcutBaseAttribute>(staticMethodsBindings);

            var results = new List <IShortcutEntryDiscoveryInfo>(methods.Count());

            foreach (var methodInfo in methods)
            {
                var attributes = (ShortcutBaseAttribute[])methodInfo.GetCustomAttributes(typeof(ShortcutBaseAttribute), true);
                foreach (var attribute in attributes)
                {
                    var discoveredAttributeEntry = new ShortcutAttributeEntryInfo(methodInfo, attribute);
                    results.Add(discoveredAttributeEntry);
                }
            }

            return(results);
        }
        public IEnumerable <ShortcutEntry> GetAllShortcuts()
        {
            var staticMethodsBindings = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
            var methods = EditorAssemblies.GetAllMethodsWithAttribute <ShortcutAttribute>(staticMethodsBindings);

            var results = new List <ShortcutEntry>(methods.Count());

            foreach (var methodInfo in methods)
            {
                var attributes = (ShortcutAttribute[])methodInfo.GetCustomAttributes(typeof(ShortcutAttribute), true);
                foreach (var attribute in attributes)
                {
                    var shortcutEntry = ShortcutEntry.CreateFromAttribute(methodInfo, attribute);
                    results.Add(shortcutEntry);
                }
            }

            return(results);
        }
        internal static void InitializeBuildCallbacks(BuildCallbacks findFlags)
        {
            if (findFlags == previousFlags)
            {
                return;
            }

            CleanupBuildCallbacks();
            previousFlags = findFlags;

            bool findBuildProcessors  = (findFlags & BuildCallbacks.BuildProcessors) == BuildCallbacks.BuildProcessors;
            bool findSceneProcessors  = (findFlags & BuildCallbacks.SceneProcessors) == BuildCallbacks.SceneProcessors;
            bool findTargetProcessors = (findFlags & BuildCallbacks.BuildTargetProcessors) == BuildCallbacks.BuildTargetProcessors;
            bool findFilterProcessors = (findFlags & BuildCallbacks.FilterAssembliesProcessors) == BuildCallbacks.FilterAssembliesProcessors;
            bool findShaderProcessors = (findFlags & BuildCallbacks.ShaderProcessors) == BuildCallbacks.ShaderProcessors;

            var postProcessBuildAttributeParams = new Type[] { typeof(BuildTarget), typeof(string) };

            foreach (var t in EditorAssemblies.GetAllTypesWithInterface <IOrderedCallback>())
            {
                if (t.IsAbstract || t.IsInterface)
                {
                    continue;
                }

                // Defer creating the instance until we actually add it to one of the lists
                object instance = null;

                if (findBuildProcessors)
                {
                    AddToListIfTypeImplementsInterface(t, ref instance, ref processors.buildPreprocessors);
                    AddToListIfTypeImplementsInterface(t, ref instance, ref processors.buildPreprocessorsWithReport);
                    AddToListIfTypeImplementsInterface(t, ref instance, ref processors.buildPostprocessors);
                    AddToListIfTypeImplementsInterface(t, ref instance, ref processors.buildPostprocessorsWithReport);
                }

                if (findSceneProcessors)
                {
                    AddToListIfTypeImplementsInterface(t, ref instance, ref processors.sceneProcessors);
                    AddToListIfTypeImplementsInterface(t, ref instance, ref processors.sceneProcessorsWithReport);
                }

                if (findTargetProcessors)
                {
                    AddToListIfTypeImplementsInterface(t, ref instance, ref processors.buildTargetProcessors);
                }

                if (findFilterProcessors)
                {
                    AddToListIfTypeImplementsInterface(t, ref instance, ref processors.filterBuildAssembliesProcessor);
                }

                if (findShaderProcessors)
                {
                    AddToListIfTypeImplementsInterface(t, ref instance, ref processors.shaderProcessors);
                }
            }

            if (findBuildProcessors)
            {
                foreach (var m in EditorAssemblies.GetAllMethodsWithAttribute <Callbacks.PostProcessBuildAttribute>())
                {
                    if (ValidateMethod <Callbacks.PostProcessBuildAttribute>(m, postProcessBuildAttributeParams))
                    {
                        AddToList(new AttributeCallbackWrapper(m), ref processors.buildPostprocessorsWithReport);
                    }
                }
            }

            if (findSceneProcessors)
            {
                foreach (var m in EditorAssemblies.GetAllMethodsWithAttribute <Callbacks.PostProcessSceneAttribute>())
                {
                    if (ValidateMethod <Callbacks.PostProcessSceneAttribute>(m, Type.EmptyTypes))
                    {
                        AddToList(new AttributeCallbackWrapper(m), ref processors.sceneProcessorsWithReport);
                    }
                }
            }

            if (processors.buildPreprocessors != null)
            {
                processors.buildPreprocessors.Sort(CompareICallbackOrder);
            }
            if (processors.buildPreprocessorsWithReport != null)
            {
                processors.buildPreprocessorsWithReport.Sort(CompareICallbackOrder);
            }
            if (processors.buildPostprocessors != null)
            {
                processors.buildPostprocessors.Sort(CompareICallbackOrder);
            }
            if (processors.buildPostprocessorsWithReport != null)
            {
                processors.buildPostprocessorsWithReport.Sort(CompareICallbackOrder);
            }
            if (processors.buildTargetProcessors != null)
            {
                processors.buildTargetProcessors.Sort(CompareICallbackOrder);
            }
            if (processors.sceneProcessors != null)
            {
                processors.sceneProcessors.Sort(CompareICallbackOrder);
            }
            if (processors.sceneProcessorsWithReport != null)
            {
                processors.sceneProcessorsWithReport.Sort(CompareICallbackOrder);
            }
            if (processors.filterBuildAssembliesProcessor != null)
            {
                processors.filterBuildAssembliesProcessor.Sort(CompareICallbackOrder);
            }
            if (processors.shaderProcessors != null)
            {
                processors.shaderProcessors.Sort(CompareICallbackOrder);
            }
        }
        internal static void InitializeBuildCallbacks(BuildCallbacks findFlags)
        {
            if (findFlags == previousFlags)
            {
                return;
            }

            CleanupBuildCallbacks();
            previousFlags = findFlags;

            bool findBuildProcessors             = (findFlags & BuildCallbacks.BuildProcessors) == BuildCallbacks.BuildProcessors;
            bool findSceneProcessors             = (findFlags & BuildCallbacks.SceneProcessors) == BuildCallbacks.SceneProcessors;
            bool findTargetProcessors            = (findFlags & BuildCallbacks.BuildTargetProcessors) == BuildCallbacks.BuildTargetProcessors;
            var  postProcessBuildAttributeParams = new Type[] { typeof(BuildTarget), typeof(string) };

            foreach (var t in EditorAssemblies.GetAllTypesWithInterface <IOrderedCallback>())
            {
                if (t.IsAbstract || t.IsInterface)
                {
                    continue;
                }
                object instance = null;
                if (findBuildProcessors)
                {
                    if (ValidateType <IPreprocessBuild>(t))
                    {
                        AddToList(instance = Activator.CreateInstance(t), ref buildPreprocessors);
                    }

                    if (ValidateType <IPostprocessBuild>(t))
                    {
                        AddToList(instance = instance == null ? Activator.CreateInstance(t) : instance, ref buildPostprocessors);
                    }
                }

                if (findSceneProcessors && ValidateType <IProcessScene>(t))
                {
                    AddToList(instance = instance == null ? Activator.CreateInstance(t) : instance, ref sceneProcessors);
                }

                if (findTargetProcessors && ValidateType <IActiveBuildTargetChanged>(t))
                {
                    AddToList(instance = instance == null ? Activator.CreateInstance(t) : instance, ref buildTargetProcessors);
                }
            }

            if (findBuildProcessors)
            {
                foreach (var m in EditorAssemblies.GetAllMethodsWithAttribute <Callbacks.PostProcessBuildAttribute>())
                {
                    if (ValidateMethod <Callbacks.PostProcessBuildAttribute>(m, postProcessBuildAttributeParams))
                    {
                        AddToList(new AttributeCallbackWrapper(m), ref buildPostprocessors);
                    }
                }
            }

            if (findSceneProcessors)
            {
                foreach (var m in EditorAssemblies.GetAllMethodsWithAttribute <Callbacks.PostProcessSceneAttribute>())
                {
                    if (ValidateMethod <Callbacks.PostProcessSceneAttribute>(m, Type.EmptyTypes))
                    {
                        AddToList(new AttributeCallbackWrapper(m), ref sceneProcessors);
                    }
                }
            }

            if (buildPreprocessors != null)
            {
                buildPreprocessors.Sort(CompareICallbackOrder);
            }
            if (buildPostprocessors != null)
            {
                buildPostprocessors.Sort(CompareICallbackOrder);
            }
            if (buildTargetProcessors != null)
            {
                buildTargetProcessors.Sort(CompareICallbackOrder);
            }
            if (sceneProcessors != null)
            {
                sceneProcessors.Sort(CompareICallbackOrder);
            }
        }
        void MigrateUserSpecifiedPrefKeys()
        {
            // If migration already happened then don't do anything
            if (EditorPrefs.GetBool(k_ProfileMigratedEditorPrefKey, false))
            {
                return;
            }

            EditorPrefs.SetBool(k_ProfileMigratedEditorPrefKey, true);

            // Find shortcut entries that might need to be migrated
            var allShortcuts = new List <ShortcutEntry>();

            directory.GetAllShortcuts(allShortcuts);

            // Find existing or create migrated profile and make it active so we can amend it
            var originalActiveProfile         = profileManager.activeProfile;
            var migratedProfile               = profileManager.GetProfileById(k_MigratedProfileId);
            var migratedProfileAlreadyExisted = migratedProfile != null;

            if (!migratedProfileAlreadyExisted)
            {
                migratedProfile = profileManager.CreateProfile(k_MigratedProfileId);
            }
            profileManager.activeProfile = migratedProfile;

            var migratedProfileModified = false;

            var tempKeyCombinations          = new KeyCombination[1];
            var methodsWithFormerlyPrefKeyAs = EditorAssemblies.GetAllMethodsWithAttribute <FormerlyPrefKeyAsAttribute>();

            foreach (var method in methodsWithFormerlyPrefKeyAs)
            {
                var shortcutAttr = Attribute.GetCustomAttribute(method, typeof(ShortcutAttribute), true) as ShortcutAttribute;
                if (shortcutAttr == null)
                {
                    continue;
                }

                var entry = allShortcuts.Find(e => string.Equals(e.identifier.path, shortcutAttr.identifier));
                if (entry == null)
                {
                    continue;
                }

                // Ignore former PrefKey if it is overriden in existing migrated profile
                if (entry.overridden)
                {
                    continue;
                }

                // Parse default pref key value from FormerlyPrefKeyAs attribute
                var    prefKeyAttr            = (FormerlyPrefKeyAsAttribute)Attribute.GetCustomAttribute(method, typeof(FormerlyPrefKeyAsAttribute));
                var    editorPrefDefaultValue = $"{prefKeyAttr.name};{prefKeyAttr.defaultValue}";
                string name;
                Event  keyboardEvent;
                string shortcut;
                if (!TryParseUniquePrefKeyString(editorPrefDefaultValue, out name, out keyboardEvent, out shortcut))
                {
                    continue;
                }
                var prefKeyDefaultKeyCombination = KeyCombination.FromPrefKeyKeyboardEvent(keyboardEvent);

                // Parse current pref key value (falling back on default pref key value)
                if (!TryParseUniquePrefKeyString(EditorPrefs.GetString(prefKeyAttr.name, editorPrefDefaultValue), out name, out keyboardEvent, out shortcut))
                {
                    continue;
                }
                var prefKeyCurrentKeyCombination = KeyCombination.FromPrefKeyKeyboardEvent(keyboardEvent);

                // Only migrate pref keys that the user actually overwrote
                if (prefKeyCurrentKeyCombination.Equals(prefKeyDefaultKeyCombination))
                {
                    continue;
                }

                string invalidBindingMessage;
                tempKeyCombinations[0] = prefKeyCurrentKeyCombination;
                if (!bindingValidator.IsBindingValid(tempKeyCombinations, out invalidBindingMessage))
                {
                    Debug.LogWarning($"Could not migrate existing binding for shortcut \"{entry.identifier.path}\" with invalid binding.\n{invalidBindingMessage}.");
                    continue;
                }

                profileManager.ModifyShortcutEntry(entry.identifier, new List <KeyCombination> {
                    prefKeyCurrentKeyCombination
                });

                migratedProfileModified = true;
            }

            // Delete migrated profile if it was created and not modified
            if (!migratedProfileAlreadyExisted && !migratedProfileModified)
            {
                profileManager.DeleteProfile(migratedProfile);
            }

            // Restore original active profile unless last loaded profile was null and the migrated profile was created
            if (originalActiveProfile != null || migratedProfileAlreadyExisted)
            {
                profileManager.activeProfile = originalActiveProfile;
            }
        }
 internal static void InitializeBuildCallbacks(BuildPipelineInterfaces.BuildCallbacks findFlags)
 {
     if (findFlags != BuildPipelineInterfaces.previousFlags)
     {
         BuildPipelineInterfaces.previousFlags = findFlags;
         BuildPipelineInterfaces.CleanupBuildCallbacks();
         bool   flag              = (findFlags & BuildPipelineInterfaces.BuildCallbacks.BuildProcessors) == BuildPipelineInterfaces.BuildCallbacks.BuildProcessors;
         bool   flag2             = (findFlags & BuildPipelineInterfaces.BuildCallbacks.SceneProcessors) == BuildPipelineInterfaces.BuildCallbacks.SceneProcessors;
         bool   flag3             = (findFlags & BuildPipelineInterfaces.BuildCallbacks.BuildTargetProcessors) == BuildPipelineInterfaces.BuildCallbacks.BuildTargetProcessors;
         Type[] expectedArguments = new Type[]
         {
             typeof(BuildTarget),
             typeof(string)
         };
         foreach (Type current in EditorAssemblies.GetAllTypesWithInterface <IOrderedCallback>())
         {
             if (!current.IsAbstract && !current.IsInterface)
             {
                 object obj = null;
                 if (flag)
                 {
                     if (BuildPipelineInterfaces.ValidateType <IPreprocessBuild>(current))
                     {
                         BuildPipelineInterfaces.AddToList <IPreprocessBuild>(obj = Activator.CreateInstance(current), ref BuildPipelineInterfaces.buildPreprocessors);
                     }
                     if (BuildPipelineInterfaces.ValidateType <IPostprocessBuild>(current))
                     {
                         BuildPipelineInterfaces.AddToList <IPostprocessBuild>(obj = ((obj != null) ? obj : Activator.CreateInstance(current)), ref BuildPipelineInterfaces.buildPostprocessors);
                     }
                 }
                 if (flag2 && BuildPipelineInterfaces.ValidateType <IProcessScene>(current))
                 {
                     BuildPipelineInterfaces.AddToList <IProcessScene>(obj = ((obj != null) ? obj : Activator.CreateInstance(current)), ref BuildPipelineInterfaces.sceneProcessors);
                 }
                 if (flag3 && BuildPipelineInterfaces.ValidateType <IActiveBuildTargetChanged>(current))
                 {
                     BuildPipelineInterfaces.AddToList <IActiveBuildTargetChanged>((obj != null) ? obj : Activator.CreateInstance(current), ref BuildPipelineInterfaces.buildTargetProcessors);
                 }
             }
         }
         if (flag)
         {
             foreach (MethodInfo current2 in EditorAssemblies.GetAllMethodsWithAttribute <PostProcessBuildAttribute>(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic))
             {
                 if (BuildPipelineInterfaces.ValidateMethod <PostProcessBuildAttribute>(current2, expectedArguments))
                 {
                     BuildPipelineInterfaces.AddToList <IPostprocessBuild>(new BuildPipelineInterfaces.AttributeCallbackWrapper(current2), ref BuildPipelineInterfaces.buildPostprocessors);
                 }
             }
         }
         if (flag2)
         {
             foreach (MethodInfo current3 in EditorAssemblies.GetAllMethodsWithAttribute <PostProcessSceneAttribute>(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic))
             {
                 if (BuildPipelineInterfaces.ValidateMethod <PostProcessSceneAttribute>(current3, Type.EmptyTypes))
                 {
                     BuildPipelineInterfaces.AddToList <IProcessScene>(new BuildPipelineInterfaces.AttributeCallbackWrapper(current3), ref BuildPipelineInterfaces.sceneProcessors);
                 }
             }
         }
         if (BuildPipelineInterfaces.buildPreprocessors != null)
         {
             List <IPreprocessBuild> arg_263_0 = BuildPipelineInterfaces.buildPreprocessors;
             if (BuildPipelineInterfaces.< > f__mg$cache0 == null)
             {
                 BuildPipelineInterfaces.< > f__mg$cache0 = new Comparison <IPreprocessBuild>(BuildPipelineInterfaces.CompareICallbackOrder);
             }
             arg_263_0.Sort(BuildPipelineInterfaces.< > f__mg$cache0);
         }
         if (BuildPipelineInterfaces.buildPostprocessors != null)
         {
             List <IPostprocessBuild> arg_294_0 = BuildPipelineInterfaces.buildPostprocessors;
             if (BuildPipelineInterfaces.< > f__mg$cache1 == null)
             {
                 BuildPipelineInterfaces.< > f__mg$cache1 = new Comparison <IPostprocessBuild>(BuildPipelineInterfaces.CompareICallbackOrder);
             }
             arg_294_0.Sort(BuildPipelineInterfaces.< > f__mg$cache1);
         }
         if (BuildPipelineInterfaces.buildTargetProcessors != null)
         {
             List <IActiveBuildTargetChanged> arg_2C5_0 = BuildPipelineInterfaces.buildTargetProcessors;
             if (BuildPipelineInterfaces.< > f__mg$cache2 == null)
             {
                 BuildPipelineInterfaces.< > f__mg$cache2 = new Comparison <IActiveBuildTargetChanged>(BuildPipelineInterfaces.CompareICallbackOrder);
             }
             arg_2C5_0.Sort(BuildPipelineInterfaces.< > f__mg$cache2);
         }
         if (BuildPipelineInterfaces.sceneProcessors != null)
         {
             List <IProcessScene> arg_2F6_0 = BuildPipelineInterfaces.sceneProcessors;
             if (BuildPipelineInterfaces.< > f__mg$cache3 == null)
             {
                 BuildPipelineInterfaces.< > f__mg$cache3 = new Comparison <IProcessScene>(BuildPipelineInterfaces.CompareICallbackOrder);
             }
             arg_2F6_0.Sort(BuildPipelineInterfaces.< > f__mg$cache3);
         }
     }
 }