unity/EditorPlugin/PlatformModuleInfoProvider.cs (98 lines of code) (raw):

using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; using JetBrains.Diagnostics; using JetBrains.Lifetimes; using JetBrains.Rd.Base; using JetBrains.Rider.Model.Unity.BackendUnity; using JetBrains.Util; using UnityEditor; namespace JetBrains.Rider.Unity.Editor { public static class PlatformModuleInfoProvider { private static readonly ILog ourLogger = Log.GetLog(nameof(PlatformModuleInfoProvider)); public static void Advise(Lifetime modelLifetime, BackendUnityModel model) { model.UnityPlatformInfo.Set(new UnityPlatformInfo(GetActiveBuildTarget(), GetModules(), GetBuildTargetGroupsWithAppIcons())); } private static string GetActiveBuildTarget() { return EditorUserBuildSettings.activeBuildTarget.ToString(); } private static List<string> GetModules() { try { // Get the ModuleManager type using reflection var moduleManager = typeof(UnityEditor.Editor).Assembly.GetType("UnityEditor.Modules.ModuleManager"); if (moduleManager == null) return new List<string>(); var platformSupportModules = moduleManager.GetProperty("platformSupportModules", BindingFlags.Static | BindingFlags.NonPublic); if (platformSupportModules == null) return new List<string>(); var dictionary = platformSupportModules.GetValue(null) as IDictionary; var valueKeys = dictionary.Keys; var modules = new List<string>(valueKeys.Cast<string>()); return modules; } catch (Exception e) { ourLogger.Error(e); return new List<string>(); } } private static List<string> GetBuildTargetGroupsWithAppIcons() { try { var buildTargetGroups = Enum.GetValues(typeof(BuildTargetGroup)).Cast<BuildTargetGroup>().Distinct(); return buildTargetGroups.Where(HasAppIcons).Select(x => x.ToString()).ToList(); } catch (Exception e) { ourLogger.Error(e); return new List<string>(); } } private static bool HasAppIcons(BuildTargetGroup buildTargetGroup) { try { var icons = GetPlatformIcons(buildTargetGroup); if (icons.Length == 0) return false; // Loop through and log details about each icon for (var i = 0; i < icons.Length; i++) { var icon = icons[i]; if (icon != null) return true; } return false; } catch (Exception e) { ourLogger.Error(e); return false; } } private static PlatformIcon[] GetPlatformIcons(BuildTargetGroup buildTargetGroup) { try { var supportedIconKinds = PlayerSettings.GetSupportedIconKindsForPlatform(buildTargetGroup); var icons = supportedIconKinds .SelectMany(s => PlayerSettings.GetPlatformIcons(buildTargetGroup, s)) .ToArray(); return icons; } catch { return EmptyArray<PlatformIcon>.Instance; } } } }