private static MonoMenuItem[] ExtractContextMenu(System.Type type)
        {
            Dictionary <string, MonoMenuItem> dictionary = new Dictionary <string, MonoMenuItem>();

            MethodInfo[] methods = type.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
            for (int i = 0; i < methods.GetLength(0); i++)
            {
                MethodInfo mi = methods[i];
                object[]   customAttributes = mi.GetCustomAttributes(typeof(ContextMenu), false);
                foreach (ContextMenu menu in customAttributes)
                {
                    MonoMenuItem item = !dictionary.ContainsKey(menu.menuItem) ? new MonoMenuItem() : dictionary[menu.menuItem];
                    if (!ValidateMethodForMenuCommand(mi, true))
                    {
                        break;
                    }
                    item.menuItem = menu.menuItem;
                    if (menu.validate)
                    {
                        item.validateType   = type;
                        item.validateMethod = mi;
                        item.validateName   = mi.Name;
                    }
                    else
                    {
                        item.index         = i;
                        item.priority      = menu.priority;
                        item.executeType   = type;
                        item.executeMethod = mi;
                        item.executeName   = mi.Name;
                    }
                    dictionary[menu.menuItem] = item;
                }
            }
            MonoMenuItem[] array = dictionary.Values.ToArray <MonoMenuItem>();
            Array.Sort(array, new CompareMenuIndex());
            return(array);
        }
        private static MonoMenuItem[] ExtractMenuCommands(Assembly assembly, bool modifiedSinceLastReload)
        {
            BindingFlags bindingAttr = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static;

            if (modifiedSinceLastReload)
            {
                bindingAttr |= BindingFlags.Instance;
            }
            bool @bool = EditorPrefs.GetBool("InternalMode", false);
            Dictionary <string, MonoMenuItem> dictionary = new Dictionary <string, MonoMenuItem>();

            System.Type[] typesFromAssembly = AssemblyHelper.GetTypesFromAssembly(assembly);
            foreach (System.Type type in typesFromAssembly)
            {
                MethodInfo[] methods = type.GetMethods(bindingAttr);
                for (int i = 0; i < methods.GetLength(0); i++)
                {
                    MethodInfo mi = methods[i];
                    object[]   customAttributes = mi.GetCustomAttributes(typeof(UnityEditor.MenuItem), false);
                    if ((customAttributes.Length > 0) && type.IsGenericTypeDefinition)
                    {
                        object[] args = new object[] { type.Name, mi.Name };
                        UnityEngine.Debug.LogWarningFormat("Method {0}.{1} cannot be used for menu commands because class {0} is an open generic type.", args);
                    }
                    else
                    {
                        foreach (UnityEditor.MenuItem item in customAttributes)
                        {
                            MonoMenuItem item2 = !dictionary.ContainsKey(item.menuItem) ? new MonoMenuItem() : dictionary[item.menuItem];
                            if (!ValidateMethodForMenuCommand(mi, false))
                            {
                                break;
                            }
                            if (item.menuItem.StartsWith("internal:", StringComparison.Ordinal))
                            {
                                if (!@bool)
                                {
                                    continue;
                                }
                                item2.menuItem = item.menuItem.Substring(9);
                            }
                            else
                            {
                                item2.menuItem = item.menuItem;
                            }
                            if (item.validate)
                            {
                                item2.validateType   = type;
                                item2.validateMethod = mi;
                                item2.validateName   = mi.Name;
                            }
                            else
                            {
                                item2.index         = i;
                                item2.priority      = item.priority;
                                item2.executeType   = type;
                                item2.executeMethod = mi;
                                item2.executeName   = mi.Name;
                            }
                            dictionary[item.menuItem] = item2;
                        }
                    }
                }
            }
            MonoMenuItem[] array = dictionary.Values.ToArray <MonoMenuItem>();
            Array.Sort(array, new CompareMenuIndex());
            return(array);
        }