Commit af571a61 authored by BlackAngle233's avatar BlackAngle233
Browse files

212

parent 1d9b5391
fileFormatVersion: 2 fileFormatVersion: 2
guid: 5e83f8baac96eaa47bdd9ca781cd2002 guid: 5e83f8baac96eaa47bdd9ca781cd2002
TextScriptImporter: TextScriptImporter:
externalObjects: {} externalObjects: {}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
# Code Editor Package for Rider # Code Editor Package for Rider
This package is not intended to be modified by users. This package is not intended to be modified by users.
Nor does it provide any api intended to be included in user projects. Nor does it provide any api intended to be included in user projects.
\ No newline at end of file
MIT License MIT License
Copyright (c) 2019 Unity Technologies Copyright (c) 2019 Unity Technologies
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions: furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software. copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
fileFormatVersion: 2 fileFormatVersion: 2
guid: 5598b14661b5f4c43bed757f34b6d172 guid: 5598b14661b5f4c43bed757f34b6d172
TextScriptImporter: TextScriptImporter:
externalObjects: {} externalObjects: {}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
fileFormatVersion: 2 fileFormatVersion: 2
guid: 9129183a42052cd43b9c284d6dbd541e guid: 9129183a42052cd43b9c284d6dbd541e
folderAsset: yes folderAsset: yes
DefaultImporter: DefaultImporter:
externalObjects: {} externalObjects: {}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
fileFormatVersion: 2 fileFormatVersion: 2
guid: 1b393f6b29a9ee84c803af1ab4944b71 guid: 1b393f6b29a9ee84c803af1ab4944b71
folderAsset: yes folderAsset: yes
DefaultImporter: DefaultImporter:
externalObjects: {} externalObjects: {}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using JetBrains.Annotations; using JetBrains.Annotations;
using Microsoft.Win32; using Microsoft.Win32;
using Unity.CodeEditor; using Unity.CodeEditor;
using UnityEngine; using UnityEngine;
namespace Packages.Rider.Editor namespace Packages.Rider.Editor
{ {
public interface IDiscovery public interface IDiscovery
{ {
CodeEditor.Installation[] PathCallback(); CodeEditor.Installation[] PathCallback();
} }
public class Discovery : IDiscovery public class Discovery : IDiscovery
{ {
public CodeEditor.Installation[] PathCallback() public CodeEditor.Installation[] PathCallback()
{ {
return RiderPathLocator.GetAllRiderPaths() return RiderPathLocator.GetAllRiderPaths()
.Select(riderInfo => new CodeEditor.Installation .Select(riderInfo => new CodeEditor.Installation
{ {
Path = riderInfo.Path, Path = riderInfo.Path,
Name = riderInfo.Presentation Name = riderInfo.Presentation
}) })
.OrderBy(a=>a.Name) .OrderBy(a=>a.Name)
.ToArray(); .ToArray();
} }
} }
/// <summary> /// <summary>
/// This code is a modified version of the JetBrains resharper-unity plugin listed here: /// This code is a modified version of the JetBrains resharper-unity plugin listed here:
/// https://github.com/JetBrains/resharper-unity/blob/master/unity/JetBrains.Rider.Unity.Editor/EditorPlugin/RiderPathLocator.cs /// https://github.com/JetBrains/resharper-unity/blob/master/unity/JetBrains.Rider.Unity.Editor/EditorPlugin/RiderPathLocator.cs
/// </summary> /// </summary>
public static class RiderPathLocator public static class RiderPathLocator
{ {
#if !(UNITY_4_7 || UNITY_5_5) #if !(UNITY_4_7 || UNITY_5_5)
[UsedImplicitly] // Used in com.unity.ide.rider [UsedImplicitly] // Used in com.unity.ide.rider
public static RiderInfo[] GetAllRiderPaths() public static RiderInfo[] GetAllRiderPaths()
{ {
try try
{ {
switch (SystemInfo.operatingSystemFamily) switch (SystemInfo.operatingSystemFamily)
{ {
case OperatingSystemFamily.Windows: case OperatingSystemFamily.Windows:
{ {
return CollectRiderInfosWindows(); return CollectRiderInfosWindows();
} }
case OperatingSystemFamily.MacOSX: case OperatingSystemFamily.MacOSX:
{ {
return CollectRiderInfosMac(); return CollectRiderInfosMac();
} }
case OperatingSystemFamily.Linux: case OperatingSystemFamily.Linux:
{ {
return CollectAllRiderPathsLinux(); return CollectAllRiderPathsLinux();
} }
} }
} }
catch (Exception e) catch (Exception e)
{ {
Debug.LogException(e); Debug.LogException(e);
} }
return new RiderInfo[0]; return new RiderInfo[0];
} }
#endif #endif
#if RIDER_EDITOR_PLUGIN // can't be used in com.unity.ide.rider #if RIDER_EDITOR_PLUGIN // can't be used in com.unity.ide.rider
internal static RiderInfo[] GetAllFoundInfos(OperatingSystemFamilyRider operatingSystemFamily) internal static RiderInfo[] GetAllFoundInfos(OperatingSystemFamilyRider operatingSystemFamily)
{ {
try try
{ {
switch (operatingSystemFamily) switch (operatingSystemFamily)
{ {
case OperatingSystemFamilyRider.Windows: case OperatingSystemFamilyRider.Windows:
{ {
return CollectRiderInfosWindows(); return CollectRiderInfosWindows();
} }
case OperatingSystemFamilyRider.MacOSX: case OperatingSystemFamilyRider.MacOSX:
{ {
return CollectRiderInfosMac(); return CollectRiderInfosMac();
} }
case OperatingSystemFamilyRider.Linux: case OperatingSystemFamilyRider.Linux:
{ {
return CollectAllRiderPathsLinux(); return CollectAllRiderPathsLinux();
} }
} }
} }
catch (Exception e) catch (Exception e)
{ {
Debug.LogException(e); Debug.LogException(e);
} }
return new RiderInfo[0]; return new RiderInfo[0];
} }
internal static string[] GetAllFoundPaths(OperatingSystemFamilyRider operatingSystemFamily) internal static string[] GetAllFoundPaths(OperatingSystemFamilyRider operatingSystemFamily)
{ {
return GetAllFoundInfos(operatingSystemFamily).Select(a=>a.Path).ToArray(); return GetAllFoundInfos(operatingSystemFamily).Select(a=>a.Path).ToArray();
} }
#endif #endif
private static RiderInfo[] CollectAllRiderPathsLinux() private static RiderInfo[] CollectAllRiderPathsLinux()
{ {
var installInfos = new List<RiderInfo>(); var installInfos = new List<RiderInfo>();
var home = Environment.GetEnvironmentVariable("HOME"); var home = Environment.GetEnvironmentVariable("HOME");
if (!string.IsNullOrEmpty(home)) if (!string.IsNullOrEmpty(home))
{ {
var toolboxRiderRootPath = GetToolboxBaseDir(); var toolboxRiderRootPath = GetToolboxBaseDir();
installInfos.AddRange(CollectPathsFromToolbox(toolboxRiderRootPath, "bin", "rider.sh", false) installInfos.AddRange(CollectPathsFromToolbox(toolboxRiderRootPath, "bin", "rider.sh", false)
.Select(a => new RiderInfo(a, true)).ToList()); .Select(a => new RiderInfo(a, true)).ToList());
//$Home/.local/share/applications/jetbrains-rider.desktop //$Home/.local/share/applications/jetbrains-rider.desktop
var shortcut = new FileInfo(Path.Combine(home, @".local/share/applications/jetbrains-rider.desktop")); var shortcut = new FileInfo(Path.Combine(home, @".local/share/applications/jetbrains-rider.desktop"));
if (shortcut.Exists) if (shortcut.Exists)
{ {
var lines = File.ReadAllLines(shortcut.FullName); var lines = File.ReadAllLines(shortcut.FullName);
foreach (var line in lines) foreach (var line in lines)
{ {
if (!line.StartsWith("Exec=\"")) if (!line.StartsWith("Exec=\""))
continue; continue;
var path = line.Split('"').Where((item, index) => index == 1).SingleOrDefault(); var path = line.Split('"').Where((item, index) => index == 1).SingleOrDefault();
if (string.IsNullOrEmpty(path)) if (string.IsNullOrEmpty(path))
continue; continue;
if (installInfos.Any(a => a.Path == path)) // avoid adding similar build as from toolbox if (installInfos.Any(a => a.Path == path)) // avoid adding similar build as from toolbox
continue; continue;
installInfos.Add(new RiderInfo(path, false)); installInfos.Add(new RiderInfo(path, false));
} }
} }
} }
// snap install // snap install
var snapInstallPath = "/snap/rider/current/bin/rider.sh"; var snapInstallPath = "/snap/rider/current/bin/rider.sh";
if (new FileInfo(snapInstallPath).Exists) if (new FileInfo(snapInstallPath).Exists)
installInfos.Add(new RiderInfo(snapInstallPath, false)); installInfos.Add(new RiderInfo(snapInstallPath, false));
return installInfos.ToArray(); return installInfos.ToArray();
} }
private static RiderInfo[] CollectRiderInfosMac() private static RiderInfo[] CollectRiderInfosMac()
{ {
var installInfos = new List<RiderInfo>(); var installInfos = new List<RiderInfo>();
// "/Applications/*Rider*.app" // "/Applications/*Rider*.app"
var folder = new DirectoryInfo("/Applications"); var folder = new DirectoryInfo("/Applications");
if (folder.Exists) if (folder.Exists)
{ {
installInfos.AddRange(folder.GetDirectories("*Rider*.app") installInfos.AddRange(folder.GetDirectories("*Rider*.app")
.Select(a => new RiderInfo(a.FullName, false)) .Select(a => new RiderInfo(a.FullName, false))
.ToList()); .ToList());
} }
// /Users/user/Library/Application Support/JetBrains/Toolbox/apps/Rider/ch-1/181.3870.267/Rider EAP.app // /Users/user/Library/Application Support/JetBrains/Toolbox/apps/Rider/ch-1/181.3870.267/Rider EAP.app
var toolboxRiderRootPath = GetToolboxBaseDir(); var toolboxRiderRootPath = GetToolboxBaseDir();
var paths = CollectPathsFromToolbox(toolboxRiderRootPath, "", "Rider*.app", true) var paths = CollectPathsFromToolbox(toolboxRiderRootPath, "", "Rider*.app", true)
.Select(a => new RiderInfo(a, true)); .Select(a => new RiderInfo(a, true));
installInfos.AddRange(paths); installInfos.AddRange(paths);
return installInfos.ToArray(); return installInfos.ToArray();
} }
private static RiderInfo[] CollectRiderInfosWindows() private static RiderInfo[] CollectRiderInfosWindows()
{ {
var installInfos = new List<RiderInfo>(); var installInfos = new List<RiderInfo>();
var toolboxRiderRootPath = GetToolboxBaseDir(); var toolboxRiderRootPath = GetToolboxBaseDir();
var installPathsToolbox = CollectPathsFromToolbox(toolboxRiderRootPath, "bin", "rider64.exe", false).ToList(); var installPathsToolbox = CollectPathsFromToolbox(toolboxRiderRootPath, "bin", "rider64.exe", false).ToList();
installInfos.AddRange(installPathsToolbox.Select(a => new RiderInfo(a, true)).ToList()); installInfos.AddRange(installPathsToolbox.Select(a => new RiderInfo(a, true)).ToList());
var installPaths = new List<string>(); var installPaths = new List<string>();
const string registryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; const string registryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
CollectPathsFromRegistry(registryKey, installPaths); CollectPathsFromRegistry(registryKey, installPaths);
const string wowRegistryKey = @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"; const string wowRegistryKey = @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall";
CollectPathsFromRegistry(wowRegistryKey, installPaths); CollectPathsFromRegistry(wowRegistryKey, installPaths);
installInfos.AddRange(installPaths.Select(a => new RiderInfo(a, false)).ToList()); installInfos.AddRange(installPaths.Select(a => new RiderInfo(a, false)).ToList());
return installInfos.ToArray(); return installInfos.ToArray();
} }
private static string GetToolboxBaseDir() private static string GetToolboxBaseDir()
{ {
switch (SystemInfo.operatingSystemFamily) switch (SystemInfo.operatingSystemFamily)
{ {
case OperatingSystemFamily.Windows: case OperatingSystemFamily.Windows:
{ {
var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
return Path.Combine(localAppData, @"JetBrains\Toolbox\apps\Rider"); return Path.Combine(localAppData, @"JetBrains\Toolbox\apps\Rider");
} }
case OperatingSystemFamily.MacOSX: case OperatingSystemFamily.MacOSX:
{ {
var home = Environment.GetEnvironmentVariable("HOME"); var home = Environment.GetEnvironmentVariable("HOME");
if (!string.IsNullOrEmpty(home)) if (!string.IsNullOrEmpty(home))
{ {
return Path.Combine(home, @"Library/Application Support/JetBrains/Toolbox/apps/Rider"); return Path.Combine(home, @"Library/Application Support/JetBrains/Toolbox/apps/Rider");
} }
break; break;
} }
case OperatingSystemFamily.Linux: case OperatingSystemFamily.Linux:
{ {
var home = Environment.GetEnvironmentVariable("HOME"); var home = Environment.GetEnvironmentVariable("HOME");
if (!string.IsNullOrEmpty(home)) if (!string.IsNullOrEmpty(home))
{ {
return Path.Combine(home, @".local/share/JetBrains/Toolbox/apps/Rider"); return Path.Combine(home, @".local/share/JetBrains/Toolbox/apps/Rider");
} }
break; break;
} }
} }
return string.Empty; return string.Empty;
} }
internal static string GetBuildNumber(string path) internal static string GetBuildNumber(string path)
{ {
var file = new FileInfo(Path.Combine(path, GetRelativePathToBuildTxt())); var file = new FileInfo(Path.Combine(path, GetRelativePathToBuildTxt()));
if (!file.Exists) if (!file.Exists)
return string.Empty; return string.Empty;
var text = File.ReadAllText(file.FullName); var text = File.ReadAllText(file.FullName);
if (text.Length > 3) if (text.Length > 3)
return text.Substring(3); return text.Substring(3);
return string.Empty; return string.Empty;
} }
internal static bool IsToolbox(string path) internal static bool IsToolbox(string path)
{ {
return path.StartsWith(GetToolboxBaseDir()); return path.StartsWith(GetToolboxBaseDir());
} }
private static string GetRelativePathToBuildTxt() private static string GetRelativePathToBuildTxt()
{ {
switch (SystemInfo.operatingSystemFamily) switch (SystemInfo.operatingSystemFamily)
{ {
case OperatingSystemFamily.Windows: case OperatingSystemFamily.Windows:
case OperatingSystemFamily.Linux: case OperatingSystemFamily.Linux:
return "../../build.txt"; return "../../build.txt";
case OperatingSystemFamily.MacOSX: case OperatingSystemFamily.MacOSX:
return "Contents/Resources/build.txt"; return "Contents/Resources/build.txt";
} }
throw new Exception("Unknown OS"); throw new Exception("Unknown OS");
} }
private static void CollectPathsFromRegistry(string registryKey, List<string> installPaths) private static void CollectPathsFromRegistry(string registryKey, List<string> installPaths)
{ {
using (var key = Registry.LocalMachine.OpenSubKey(registryKey)) using (var key = Registry.LocalMachine.OpenSubKey(registryKey))
{ {
if (key == null) return; if (key == null) return;
foreach (var subkeyName in key.GetSubKeyNames().Where(a => a.Contains("Rider"))) foreach (var subkeyName in key.GetSubKeyNames().Where(a => a.Contains("Rider")))
{ {
using (var subkey = key.OpenSubKey(subkeyName)) using (var subkey = key.OpenSubKey(subkeyName))
{ {
var folderObject = subkey?.GetValue("InstallLocation"); var folderObject = subkey?.GetValue("InstallLocation");
if (folderObject == null) continue; if (folderObject == null) continue;
var folder = folderObject.ToString(); var folder = folderObject.ToString();
var possiblePath = Path.Combine(folder, @"bin\rider64.exe"); var possiblePath = Path.Combine(folder, @"bin\rider64.exe");
if (File.Exists(possiblePath)) if (File.Exists(possiblePath))
installPaths.Add(possiblePath); installPaths.Add(possiblePath);
} }
} }
} }
} }
private static string[] CollectPathsFromToolbox(string toolboxRiderRootPath, string dirName, string searchPattern, private static string[] CollectPathsFromToolbox(string toolboxRiderRootPath, string dirName, string searchPattern,
bool isMac) bool isMac)
{ {
if (!Directory.Exists(toolboxRiderRootPath)) if (!Directory.Exists(toolboxRiderRootPath))
return new string[0]; return new string[0];
var channelDirs = Directory.GetDirectories(toolboxRiderRootPath); var channelDirs = Directory.GetDirectories(toolboxRiderRootPath);
var paths = channelDirs.SelectMany(channelDir => var paths = channelDirs.SelectMany(channelDir =>
{ {
try try
{ {
// use history.json - last entry stands for the active build https://jetbrains.slack.com/archives/C07KNP99D/p1547807024066500?thread_ts=1547731708.057700&cid=C07KNP99D // use history.json - last entry stands for the active build https://jetbrains.slack.com/archives/C07KNP99D/p1547807024066500?thread_ts=1547731708.057700&cid=C07KNP99D
var historyFile = Path.Combine(channelDir, ".history.json"); var historyFile = Path.Combine(channelDir, ".history.json");
if (File.Exists(historyFile)) if (File.Exists(historyFile))
{ {
var json = File.ReadAllText(historyFile); var json = File.ReadAllText(historyFile);
var build = ToolboxHistory.GetLatestBuildFromJson(json); var build = ToolboxHistory.GetLatestBuildFromJson(json);
if (build != null) if (build != null)
{ {
var buildDir = Path.Combine(channelDir, build); var buildDir = Path.Combine(channelDir, build);
var executablePaths = GetExecutablePaths(dirName, searchPattern, isMac, buildDir); var executablePaths = GetExecutablePaths(dirName, searchPattern, isMac, buildDir);
if (executablePaths.Any()) if (executablePaths.Any())
return executablePaths; return executablePaths;
} }
} }
var channelFile = Path.Combine(channelDir, ".channel.settings.json"); var channelFile = Path.Combine(channelDir, ".channel.settings.json");
if (File.Exists(channelFile)) if (File.Exists(channelFile))
{ {
var json = File.ReadAllText(channelFile).Replace("active-application", "active_application"); var json = File.ReadAllText(channelFile).Replace("active-application", "active_application");
var build = ToolboxInstallData.GetLatestBuildFromJson(json); var build = ToolboxInstallData.GetLatestBuildFromJson(json);
if (build != null) if (build != null)
{ {
var buildDir = Path.Combine(channelDir, build); var buildDir = Path.Combine(channelDir, build);
var executablePaths = GetExecutablePaths(dirName, searchPattern, isMac, buildDir); var executablePaths = GetExecutablePaths(dirName, searchPattern, isMac, buildDir);
if (executablePaths.Any()) if (executablePaths.Any())
return executablePaths; return executablePaths;
} }
} }
// changes in toolbox json files format may brake the logic above, so return all found Rider installations // changes in toolbox json files format may brake the logic above, so return all found Rider installations
return Directory.GetDirectories(channelDir) return Directory.GetDirectories(channelDir)
.SelectMany(buildDir => GetExecutablePaths(dirName, searchPattern, isMac, buildDir)); .SelectMany(buildDir => GetExecutablePaths(dirName, searchPattern, isMac, buildDir));
} }
catch (Exception e) catch (Exception e)
{ {
// do not write to Debug.Log, just log it. // do not write to Debug.Log, just log it.
Logger.Warn($"Failed to get RiderPath from {channelDir}", e); Logger.Warn($"Failed to get RiderPath from {channelDir}", e);
} }
return new string[0]; return new string[0];
}) })
.Where(c => !string.IsNullOrEmpty(c)) .Where(c => !string.IsNullOrEmpty(c))
.ToArray(); .ToArray();
return paths; return paths;
} }
private static string[] GetExecutablePaths(string dirName, string searchPattern, bool isMac, string buildDir) private static string[] GetExecutablePaths(string dirName, string searchPattern, bool isMac, string buildDir)
{ {
var folder = new DirectoryInfo(Path.Combine(buildDir, dirName)); var folder = new DirectoryInfo(Path.Combine(buildDir, dirName));
if (!folder.Exists) if (!folder.Exists)
return new string[0]; return new string[0];
if (!isMac) if (!isMac)
return new[] {Path.Combine(folder.FullName, searchPattern)}.Where(File.Exists).ToArray(); return new[] {Path.Combine(folder.FullName, searchPattern)}.Where(File.Exists).ToArray();
return folder.GetDirectories(searchPattern).Select(f => f.FullName) return folder.GetDirectories(searchPattern).Select(f => f.FullName)
.Where(Directory.Exists).ToArray(); .Where(Directory.Exists).ToArray();
} }
// Disable the "field is never assigned" compiler warning. We never assign it, but Unity does. // Disable the "field is never assigned" compiler warning. We never assign it, but Unity does.
// Note that Unity disable this warning in the generated C# projects // Note that Unity disable this warning in the generated C# projects
#pragma warning disable 0649 #pragma warning disable 0649
[Serializable] [Serializable]
class ToolboxHistory class ToolboxHistory
{ {
public List<ItemNode> history; public List<ItemNode> history;
[CanBeNull] [CanBeNull]
public static string GetLatestBuildFromJson(string json) public static string GetLatestBuildFromJson(string json)
{ {
try try
{ {
#if UNITY_4_7 || UNITY_5_5 #if UNITY_4_7 || UNITY_5_5
return JsonConvert.DeserializeObject<ToolboxHistory>(json).history.LastOrDefault()?.item.build; return JsonConvert.DeserializeObject<ToolboxHistory>(json).history.LastOrDefault()?.item.build;
#else #else
return JsonUtility.FromJson<ToolboxHistory>(json).history.LastOrDefault()?.item.build; return JsonUtility.FromJson<ToolboxHistory>(json).history.LastOrDefault()?.item.build;
#endif #endif
} }
catch (Exception) catch (Exception)
{ {
Logger.Warn($"Failed to get latest build from json {json}"); Logger.Warn($"Failed to get latest build from json {json}");
} }
return null; return null;
} }
} }
[Serializable] [Serializable]
class ItemNode class ItemNode
{ {
public BuildNode item; public BuildNode item;
} }
[Serializable] [Serializable]
class BuildNode class BuildNode
{ {
public string build; public string build;
} }
// ReSharper disable once ClassNeverInstantiated.Global // ReSharper disable once ClassNeverInstantiated.Global
[Serializable] [Serializable]
class ToolboxInstallData class ToolboxInstallData
{ {
// ReSharper disable once InconsistentNaming // ReSharper disable once InconsistentNaming
public ActiveApplication active_application; public ActiveApplication active_application;
[CanBeNull] [CanBeNull]
public static string GetLatestBuildFromJson(string json) public static string GetLatestBuildFromJson(string json)
{ {
try try
{ {
#if UNITY_4_7 || UNITY_5_5 #if UNITY_4_7 || UNITY_5_5
var toolbox = JsonConvert.DeserializeObject<ToolboxInstallData>(json); var toolbox = JsonConvert.DeserializeObject<ToolboxInstallData>(json);
#else #else
var toolbox = JsonUtility.FromJson<ToolboxInstallData>(json); var toolbox = JsonUtility.FromJson<ToolboxInstallData>(json);
#endif #endif
var builds = toolbox.active_application.builds; var builds = toolbox.active_application.builds;
if (builds != null && builds.Any()) if (builds != null && builds.Any())
return builds.First(); return builds.First();
} }
catch (Exception) catch (Exception)
{ {
Logger.Warn($"Failed to get latest build from json {json}"); Logger.Warn($"Failed to get latest build from json {json}");
} }
return null; return null;
} }
} }
[Serializable] [Serializable]
class ActiveApplication class ActiveApplication
{ {
// ReSharper disable once InconsistentNaming // ReSharper disable once InconsistentNaming
public List<string> builds; public List<string> builds;
} }
#pragma warning restore 0649 #pragma warning restore 0649
public struct RiderInfo public struct RiderInfo
{ {
public bool IsToolbox; public bool IsToolbox;
public string Presentation; public string Presentation;
public string BuildVersion; public string BuildVersion;
public string Path; public string Path;
public RiderInfo(string path, bool isToolbox) public RiderInfo(string path, bool isToolbox)
{ {
if (path == RiderScriptEditor.CurrentEditor) if (path == RiderScriptEditor.CurrentEditor)
{ {
RiderScriptEditorData.instance.Init(); RiderScriptEditorData.instance.Init();
BuildVersion = RiderScriptEditorData.instance.currentEditorVersion; BuildVersion = RiderScriptEditorData.instance.currentEditorVersion;
} }
else else
BuildVersion = GetBuildNumber(path); BuildVersion = GetBuildNumber(path);
Path = new FileInfo(path).FullName; // normalize separators Path = new FileInfo(path).FullName; // normalize separators
var presentation = "Rider " + BuildVersion; var presentation = "Rider " + BuildVersion;
if (isToolbox) if (isToolbox)
presentation += " (JetBrains Toolbox)"; presentation += " (JetBrains Toolbox)";
Presentation = presentation; Presentation = presentation;
IsToolbox = isToolbox; IsToolbox = isToolbox;
} }
} }
private static class Logger private static class Logger
{ {
internal static void Warn(string message, Exception e = null) internal static void Warn(string message, Exception e = null)
{ {
#if RIDER_EDITOR_PLUGIN // can't be used in com.unity.ide.rider #if RIDER_EDITOR_PLUGIN // can't be used in com.unity.ide.rider
Log.GetLog(typeof(RiderPathLocator).Name).Warn(message); Log.GetLog(typeof(RiderPathLocator).Name).Warn(message);
if (e != null) if (e != null)
Log.GetLog(typeof(RiderPathLocator).Name).Warn(e); Log.GetLog(typeof(RiderPathLocator).Name).Warn(e);
#else #else
Debug.LogError(message); Debug.LogError(message);
if (e != null) if (e != null)
Debug.LogException(e); Debug.LogException(e);
#endif #endif
} }
} }
} }
} }
\ No newline at end of file
fileFormatVersion: 2 fileFormatVersion: 2
guid: dab656c79e1985c40b31faebcda44442 guid: dab656c79e1985c40b31faebcda44442
MonoImporter: MonoImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2
defaultReferences: [] defaultReferences: []
executionOrder: 0 executionOrder: 0
icon: {instanceID: 0} icon: {instanceID: 0}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
using System; using System;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using Debug = UnityEngine.Debug; using Debug = UnityEngine.Debug;
namespace Packages.Rider.Editor namespace Packages.Rider.Editor
{ {
public static class EditorPluginInterop public static class EditorPluginInterop
{ {
private static string ourEntryPointTypeName = "JetBrains.Rider.Unity.Editor.PluginEntryPoint"; private static string ourEntryPointTypeName = "JetBrains.Rider.Unity.Editor.PluginEntryPoint";
private static Assembly ourEditorPluginAssembly; private static Assembly ourEditorPluginAssembly;
public static Assembly EditorPluginAssembly public static Assembly EditorPluginAssembly
{ {
get get
{ {
if (ourEditorPluginAssembly != null) if (ourEditorPluginAssembly != null)
return ourEditorPluginAssembly; return ourEditorPluginAssembly;
var assemblies = AppDomain.CurrentDomain.GetAssemblies(); var assemblies = AppDomain.CurrentDomain.GetAssemblies();
ourEditorPluginAssembly = assemblies.FirstOrDefault(a => a.GetName().Name.Equals("JetBrains.Rider.Unity.Editor.Plugin.Full.Repacked")); ourEditorPluginAssembly = assemblies.FirstOrDefault(a => a.GetName().Name.Equals("JetBrains.Rider.Unity.Editor.Plugin.Full.Repacked"));
return ourEditorPluginAssembly; return ourEditorPluginAssembly;
} }
} }
private static void DisableSyncSolutionOnceCallBack() private static void DisableSyncSolutionOnceCallBack()
{ {
// RiderScriptableSingleton.Instance.CsprojProcessedOnce = true; // RiderScriptableSingleton.Instance.CsprojProcessedOnce = true;
// Otherwise EditorPlugin regenerates all on every AppDomain reload // Otherwise EditorPlugin regenerates all on every AppDomain reload
var assembly = EditorPluginAssembly; var assembly = EditorPluginAssembly;
if (assembly == null) return; if (assembly == null) return;
var type = assembly.GetType("JetBrains.Rider.Unity.Editor.Utils.RiderScriptableSingleton"); var type = assembly.GetType("JetBrains.Rider.Unity.Editor.Utils.RiderScriptableSingleton");
if (type == null) return; if (type == null) return;
var baseType = type.BaseType; var baseType = type.BaseType;
if (baseType == null) return; if (baseType == null) return;
var instance = baseType.GetProperty("Instance"); var instance = baseType.GetProperty("Instance");
if (instance == null) return; if (instance == null) return;
var instanceVal = instance.GetValue(null); var instanceVal = instance.GetValue(null);
var member = type.GetProperty("CsprojProcessedOnce"); var member = type.GetProperty("CsprojProcessedOnce");
if (member==null) return; if (member==null) return;
member.SetValue(instanceVal, true); member.SetValue(instanceVal, true);
} }
public static string LogPath public static string LogPath
{ {
get get
{ {
try try
{ {
var assembly = EditorPluginAssembly; var assembly = EditorPluginAssembly;
if (assembly == null) return null; if (assembly == null) return null;
var type = assembly.GetType(ourEntryPointTypeName); var type = assembly.GetType(ourEntryPointTypeName);
if (type == null) return null; if (type == null) return null;
var field = type.GetField("LogPath", BindingFlags.NonPublic | BindingFlags.Static); var field = type.GetField("LogPath", BindingFlags.NonPublic | BindingFlags.Static);
if (field == null) return null; if (field == null) return null;
return field.GetValue(null) as string; return field.GetValue(null) as string;
} }
catch (Exception) catch (Exception)
{ {
Debug.Log("Unable to do OpenFile to Rider from dll, fallback to com.unity.ide.rider implementation."); Debug.Log("Unable to do OpenFile to Rider from dll, fallback to com.unity.ide.rider implementation.");
} }
return null; return null;
} }
} }
public static bool OpenFileDllImplementation(string path, int line, int column) public static bool OpenFileDllImplementation(string path, int line, int column)
{ {
var openResult = false; var openResult = false;
// reflection for fast OpenFileLineCol, when Rider is started and protocol connection is established // reflection for fast OpenFileLineCol, when Rider is started and protocol connection is established
try try
{ {
var assembly = EditorPluginAssembly; var assembly = EditorPluginAssembly;
if (assembly == null) return false; if (assembly == null) return false;
var type = assembly.GetType(ourEntryPointTypeName); var type = assembly.GetType(ourEntryPointTypeName);
if (type == null) return false; if (type == null) return false;
var field = type.GetField("OpenAssetHandler", BindingFlags.NonPublic | BindingFlags.Static); var field = type.GetField("OpenAssetHandler", BindingFlags.NonPublic | BindingFlags.Static);
if (field == null) return false; if (field == null) return false;
var handlerInstance = field.GetValue(null); var handlerInstance = field.GetValue(null);
var method = handlerInstance.GetType() var method = handlerInstance.GetType()
.GetMethod("OnOpenedAsset", new[] {typeof(string), typeof(int), typeof(int)}); .GetMethod("OnOpenedAsset", new[] {typeof(string), typeof(int), typeof(int)});
if (method == null) return false; if (method == null) return false;
var assetFilePath = path; var assetFilePath = path;
if (!string.IsNullOrEmpty(path)) if (!string.IsNullOrEmpty(path))
assetFilePath = Path.GetFullPath(path); assetFilePath = Path.GetFullPath(path);
openResult = (bool) method.Invoke(handlerInstance, new object[] {assetFilePath, line, column}); openResult = (bool) method.Invoke(handlerInstance, new object[] {assetFilePath, line, column});
} }
catch (Exception e) catch (Exception e)
{ {
Debug.Log("Unable to do OpenFile to Rider from dll, fallback to com.unity.ide.rider implementation."); Debug.Log("Unable to do OpenFile to Rider from dll, fallback to com.unity.ide.rider implementation.");
Debug.LogException(e); Debug.LogException(e);
} }
return openResult; return openResult;
} }
public static bool EditorPluginIsLoadedFromAssets(Assembly assembly) public static bool EditorPluginIsLoadedFromAssets(Assembly assembly)
{ {
if (assembly == null) if (assembly == null)
return false; return false;
var location = assembly.Location; var location = assembly.Location;
var currentDir = Directory.GetCurrentDirectory(); var currentDir = Directory.GetCurrentDirectory();
return location.StartsWith(currentDir, StringComparison.InvariantCultureIgnoreCase); return location.StartsWith(currentDir, StringComparison.InvariantCultureIgnoreCase);
} }
internal static void InitEntryPoint(Assembly assembly) internal static void InitEntryPoint(Assembly assembly)
{ {
try try
{ {
if (Version.TryParse(RiderScriptEditorData.instance.currentEditorVersion, out var version)) if (Version.TryParse(RiderScriptEditorData.instance.currentEditorVersion, out var version))
{ {
if (version.Major < 192) if (version.Major < 192)
DisableSyncSolutionOnceCallBack(); // is require for Rider prior to 2019.2 DisableSyncSolutionOnceCallBack(); // is require for Rider prior to 2019.2
} }
else else
DisableSyncSolutionOnceCallBack(); DisableSyncSolutionOnceCallBack();
var type = assembly.GetType("JetBrains.Rider.Unity.Editor.AfterUnity56.EntryPoint"); var type = assembly.GetType("JetBrains.Rider.Unity.Editor.AfterUnity56.EntryPoint");
if (type == null) if (type == null)
type = assembly.GetType("JetBrains.Rider.Unity.Editor.UnitTesting.EntryPoint"); // oldRider type = assembly.GetType("JetBrains.Rider.Unity.Editor.UnitTesting.EntryPoint"); // oldRider
RuntimeHelpers.RunClassConstructor(type.TypeHandle); RuntimeHelpers.RunClassConstructor(type.TypeHandle);
} }
catch (TypeInitializationException ex) catch (TypeInitializationException ex)
{ {
Debug.LogException(ex); Debug.LogException(ex);
if (ex.InnerException != null) if (ex.InnerException != null)
Debug.LogException(ex.InnerException); Debug.LogException(ex.InnerException);
} }
} }
} }
} }
\ No newline at end of file
fileFormatVersion: 2 fileFormatVersion: 2
guid: f9bd02a3a916be64c9b47b1305149423 guid: f9bd02a3a916be64c9b47b1305149423
MonoImporter: MonoImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2
defaultReferences: [] defaultReferences: []
executionOrder: 0 executionOrder: 0
icon: {instanceID: 0} icon: {instanceID: 0}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
namespace Packages.Rider.Editor namespace Packages.Rider.Editor
{ {
public enum LoggingLevel public enum LoggingLevel
{ {
/// <summary> /// <summary>
/// Do not use it in logging. Only in config to disable logging. /// Do not use it in logging. Only in config to disable logging.
/// </summary> /// </summary>
OFF, OFF,
/// <summary>For errors that lead to application failure</summary> /// <summary>For errors that lead to application failure</summary>
FATAL, FATAL,
/// <summary>For errors that must be shown in Exception Browser</summary> /// <summary>For errors that must be shown in Exception Browser</summary>
ERROR, ERROR,
/// <summary>Suspicious situations but not errors</summary> /// <summary>Suspicious situations but not errors</summary>
WARN, WARN,
/// <summary>Regular level for important events</summary> /// <summary>Regular level for important events</summary>
INFO, INFO,
/// <summary>Additional info for debbuging</summary> /// <summary>Additional info for debbuging</summary>
VERBOSE, VERBOSE,
/// <summary>Methods &amp; callstacks tracing, more than verbose</summary> /// <summary>Methods &amp; callstacks tracing, more than verbose</summary>
TRACE, TRACE,
} }
} }
\ No newline at end of file
fileFormatVersion: 2 fileFormatVersion: 2
guid: 71bb46b59a9a7a346bbab1e185c723df guid: 71bb46b59a9a7a346bbab1e185c723df
MonoImporter: MonoImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2
defaultReferences: [] defaultReferences: []
executionOrder: 0 executionOrder: 0
icon: {instanceID: 0} icon: {instanceID: 0}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
using Unity.CodeEditor; using Unity.CodeEditor;
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
namespace Packages.Rider.Editor namespace Packages.Rider.Editor
{ {
public class PluginSettings public class PluginSettings
{ {
public static LoggingLevel SelectedLoggingLevel public static LoggingLevel SelectedLoggingLevel
{ {
get => (LoggingLevel) EditorPrefs.GetInt("Rider_SelectedLoggingLevel", 0); get => (LoggingLevel) EditorPrefs.GetInt("Rider_SelectedLoggingLevel", 0);
set set
{ {
EditorPrefs.SetInt("Rider_SelectedLoggingLevel", (int) value); EditorPrefs.SetInt("Rider_SelectedLoggingLevel", (int) value);
} }
} }
public static bool LogEventsCollectorEnabled public static bool LogEventsCollectorEnabled
{ {
get { return EditorPrefs.GetBool("Rider_LogEventsCollectorEnabled", true); } get { return EditorPrefs.GetBool("Rider_LogEventsCollectorEnabled", true); }
private set { EditorPrefs.SetBool("Rider_LogEventsCollectorEnabled", value); } private set { EditorPrefs.SetBool("Rider_LogEventsCollectorEnabled", value); }
} }
private static GUIStyle ourVersionInfoStyle = new GUIStyle() private static GUIStyle ourVersionInfoStyle = new GUIStyle()
{ {
normal = new GUIStyleState() normal = new GUIStyleState()
{ {
textColor = new Color(0, 0, 0, .6f), textColor = new Color(0, 0, 0, .6f),
}, },
margin = new RectOffset(4, 4, 4, 4), margin = new RectOffset(4, 4, 4, 4),
}; };
/// <summary> /// <summary>
/// Preferences menu layout /// Preferences menu layout
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Contains all 3 toggles: Enable/Disable; Debug On/Off; Writing Launch File On/Off /// Contains all 3 toggles: Enable/Disable; Debug On/Off; Writing Launch File On/Off
/// </remarks> /// </remarks>
[SettingsProvider] [SettingsProvider]
private static SettingsProvider RiderPreferencesItem() private static SettingsProvider RiderPreferencesItem()
{ {
if (!RiderScriptEditor.IsRiderInstallation(RiderScriptEditor.CurrentEditor)) if (!RiderScriptEditor.IsRiderInstallation(RiderScriptEditor.CurrentEditor))
return null; return null;
if (!RiderScriptEditorData.instance.shouldLoadEditorPlugin) if (!RiderScriptEditorData.instance.shouldLoadEditorPlugin)
return null; return null;
var provider = new SettingsProvider("Preferences/Rider", SettingsScope.User) var provider = new SettingsProvider("Preferences/Rider", SettingsScope.User)
{ {
label = "Rider", label = "Rider",
keywords = new[] { "Rider" }, keywords = new[] { "Rider" },
guiHandler = (searchContext) => guiHandler = (searchContext) =>
{ {
EditorGUIUtility.labelWidth = 200f; EditorGUIUtility.labelWidth = 200f;
EditorGUILayout.BeginVertical(); EditorGUILayout.BeginVertical();
GUILayout.BeginVertical(); GUILayout.BeginVertical();
LogEventsCollectorEnabled = LogEventsCollectorEnabled =
EditorGUILayout.Toggle(new GUIContent("Pass Console to Rider:"), LogEventsCollectorEnabled); EditorGUILayout.Toggle(new GUIContent("Pass Console to Rider:"), LogEventsCollectorEnabled);
GUILayout.EndVertical(); GUILayout.EndVertical();
GUILayout.Label(""); GUILayout.Label("");
if (!string.IsNullOrEmpty(EditorPluginInterop.LogPath)) if (!string.IsNullOrEmpty(EditorPluginInterop.LogPath))
{ {
EditorGUILayout.BeginHorizontal(); EditorGUILayout.BeginHorizontal();
EditorGUILayout.PrefixLabel("Log file:"); EditorGUILayout.PrefixLabel("Log file:");
var previous = GUI.enabled; var previous = GUI.enabled;
GUI.enabled = previous && SelectedLoggingLevel != LoggingLevel.OFF; GUI.enabled = previous && SelectedLoggingLevel != LoggingLevel.OFF;
var button = GUILayout.Button(new GUIContent("Open log")); var button = GUILayout.Button(new GUIContent("Open log"));
if (button) if (button)
{ {
//UnityEditorInternal.InternalEditorUtility.OpenFileAtLineExternal(PluginEntryPoint.LogPath, 0); //UnityEditorInternal.InternalEditorUtility.OpenFileAtLineExternal(PluginEntryPoint.LogPath, 0);
// works much faster than the commented code, when Rider is already started // works much faster than the commented code, when Rider is already started
CodeEditor.CurrentEditor.OpenProject(EditorPluginInterop.LogPath, 0, 0); CodeEditor.CurrentEditor.OpenProject(EditorPluginInterop.LogPath, 0, 0);
} }
GUI.enabled = previous; GUI.enabled = previous;
GUILayout.EndHorizontal(); GUILayout.EndHorizontal();
} }
var loggingMsg = var loggingMsg =
@"Sets the amount of Rider Debug output. If you are about to report an issue, please select Verbose logging level and attach Unity console output to the issue."; @"Sets the amount of Rider Debug output. If you are about to report an issue, please select Verbose logging level and attach Unity console output to the issue.";
SelectedLoggingLevel = SelectedLoggingLevel =
(LoggingLevel) EditorGUILayout.EnumPopup(new GUIContent("Logging Level:", loggingMsg), (LoggingLevel) EditorGUILayout.EnumPopup(new GUIContent("Logging Level:", loggingMsg),
SelectedLoggingLevel); SelectedLoggingLevel);
EditorGUILayout.HelpBox(loggingMsg, MessageType.None); EditorGUILayout.HelpBox(loggingMsg, MessageType.None);
var githubRepo = "https://github.com/JetBrains/resharper-unity"; var githubRepo = "https://github.com/JetBrains/resharper-unity";
var caption = $"<color=#0000FF>{githubRepo}</color>"; var caption = $"<color=#0000FF>{githubRepo}</color>";
LinkButton(caption: caption, url: githubRepo); LinkButton(caption: caption, url: githubRepo);
GUILayout.FlexibleSpace(); GUILayout.FlexibleSpace();
GUILayout.BeginHorizontal(); GUILayout.BeginHorizontal();
GUILayout.FlexibleSpace(); GUILayout.FlexibleSpace();
var assembly = EditorPluginInterop.EditorPluginAssembly; var assembly = EditorPluginInterop.EditorPluginAssembly;
if (assembly != null) if (assembly != null)
{ {
var version = assembly.GetName().Version; var version = assembly.GetName().Version;
GUILayout.Label("Plugin version: " + version, ourVersionInfoStyle); GUILayout.Label("Plugin version: " + version, ourVersionInfoStyle);
} }
GUILayout.EndHorizontal(); GUILayout.EndHorizontal();
EditorGUILayout.EndVertical(); EditorGUILayout.EndVertical();
} }
}; };
return provider; return provider;
} }
private static void LinkButton(string caption, string url) private static void LinkButton(string caption, string url)
{ {
var style = GUI.skin.label; var style = GUI.skin.label;
style.richText = true; style.richText = true;
var bClicked = GUILayout.Button(caption, style); var bClicked = GUILayout.Button(caption, style);
var rect = GUILayoutUtility.GetLastRect(); var rect = GUILayoutUtility.GetLastRect();
rect.width = style.CalcSize(new GUIContent(caption)).x; rect.width = style.CalcSize(new GUIContent(caption)).x;
EditorGUIUtility.AddCursorRect(rect, MouseCursor.Link); EditorGUIUtility.AddCursorRect(rect, MouseCursor.Link);
if (bClicked) if (bClicked)
Application.OpenURL(url); Application.OpenURL(url);
} }
} }
} }
\ No newline at end of file
fileFormatVersion: 2 fileFormatVersion: 2
guid: 1bfe12aa306c0c74db4f4f1a1a0ae5ce guid: 1bfe12aa306c0c74db4f4f1a1a0ae5ce
MonoImporter: MonoImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2
defaultReferences: [] defaultReferences: []
executionOrder: 0 executionOrder: 0
icon: {instanceID: 0} icon: {instanceID: 0}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
fileFormatVersion: 2 fileFormatVersion: 2
guid: aa290bd9a165a0543a4bf85ac73914bc guid: aa290bd9a165a0543a4bf85ac73914bc
folderAsset: yes folderAsset: yes
DefaultImporter: DefaultImporter:
externalObjects: {} externalObjects: {}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
using Unity.CodeEditor; using Unity.CodeEditor;
using UnityEditor; using UnityEditor;
namespace Packages.Rider.Editor.PostProcessors namespace Packages.Rider.Editor.PostProcessors
{ {
public class RiderAssetPostprocessor: AssetPostprocessor public class RiderAssetPostprocessor: AssetPostprocessor
{ {
public static bool OnPreGeneratingCSProjectFiles() public static bool OnPreGeneratingCSProjectFiles()
{ {
var path = RiderScriptEditor.GetEditorRealPath(CodeEditor.CurrentEditorInstallation); var path = RiderScriptEditor.GetEditorRealPath(CodeEditor.CurrentEditorInstallation);
if (RiderScriptEditor.IsRiderInstallation(path)) if (RiderScriptEditor.IsRiderInstallation(path))
return !ProjectGeneration.isRiderProjectGeneration; return !ProjectGeneration.isRiderProjectGeneration;
return false; return false;
} }
} }
} }
\ No newline at end of file
fileFormatVersion: 2 fileFormatVersion: 2
guid: 45471ad7b8c1f964da5e3c07d57fbf4f guid: 45471ad7b8c1f964da5e3c07d57fbf4f
MonoImporter: MonoImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2
defaultReferences: [] defaultReferences: []
executionOrder: 0 executionOrder: 0
icon: {instanceID: 0} icon: {instanceID: 0}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
fileFormatVersion: 2 fileFormatVersion: 2
guid: 313cbe17019f1934397f91069831062c guid: 313cbe17019f1934397f91069831062c
folderAsset: yes folderAsset: yes
DefaultImporter: DefaultImporter:
externalObjects: {} externalObjects: {}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
using System; using System;
using System.IO; using System.IO;
using System.Text; using System.Text;
namespace Packages.Rider.Editor { namespace Packages.Rider.Editor {
class FileIOProvider : IFileIO class FileIOProvider : IFileIO
{ {
public bool Exists(string fileName) public bool Exists(string fileName)
{ {
return File.Exists(fileName); return File.Exists(fileName);
} }
public string ReadAllText(string fileName) public string ReadAllText(string fileName)
{ {
return File.ReadAllText(fileName); return File.ReadAllText(fileName);
} }
public void WriteAllText(string fileName, string content) public void WriteAllText(string fileName, string content)
{ {
File.WriteAllText(fileName, content, Encoding.UTF8); File.WriteAllText(fileName, content, Encoding.UTF8);
} }
} }
} }
fileFormatVersion: 2 fileFormatVersion: 2
guid: a6ba838b1348d5e46a7eaacd1646c1d3 guid: a6ba838b1348d5e46a7eaacd1646c1d3
MonoImporter: MonoImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2
defaultReferences: [] defaultReferences: []
executionOrder: 0 executionOrder: 0
icon: {instanceID: 0} icon: {instanceID: 0}
userData: userData:
assetBundleName: assetBundleName:
assetBundleVariant: assetBundleVariant:
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment