summaryrefslogtreecommitdiff
path: root/Library/PackageCache/com.unity.ide.rider@1.1.4
diff options
context:
space:
mode:
authorAndrew Lee <alee14498@protonmail.com>2020-04-19 17:19:32 -0400
committerAndrew Lee <alee14498@protonmail.com>2020-04-19 17:19:32 -0400
commitc55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78 (patch)
treeee4d51c7c1d633e11f46453ef1edd3c77c4ef9f7 /Library/PackageCache/com.unity.ide.rider@1.1.4
downloadProject-Sandbox-c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78.tar.gz
Project-Sandbox-c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78.tar.bz2
Project-Sandbox-c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78.zip
Inital commit
Diffstat (limited to 'Library/PackageCache/com.unity.ide.rider@1.1.4')
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/.editorconfig6
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md74
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md.meta7
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md6
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md.meta7
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Documentation~/README.md4
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md21
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md.meta7
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider.meta8
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor.meta8
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs457
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs136
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs22
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs128
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors.meta8
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs16
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration.meta8
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs23
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs16
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs1090
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs38
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs404
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs29
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting.meta8
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs27
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs18
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs47
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs31
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs83
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util.meta8
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs36
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs66
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs12
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs25
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs20
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs.meta11
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef22
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef.meta7
-rwxr-xr-xLibrary/PackageCache/com.unity.ide.rider@1.1.4/package.json19
-rw-r--r--Library/PackageCache/com.unity.ide.rider@1.1.4/package.json.meta7
60 files changed, 3190 insertions, 0 deletions
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/.editorconfig b/Library/PackageCache/com.unity.ide.rider@1.1.4/.editorconfig
new file mode 100644
index 0000000..ca12169
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/.editorconfig
@@ -0,0 +1,6 @@
+root = true
+
+[*]
+indent_style = space
+indent_size = 2
+end_of_line = lf \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md b/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md
new file mode 100644
index 0000000..bd5aad6
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md
@@ -0,0 +1,74 @@
+# Code Editor Package for Rider
+
+## [1.1.4] - 2019-11-21
+
+fix warning - unreachable code
+
+
+## [1.1.3] - 2019-10-17
+
+ - Update External Editor, when new toolbox build was installed
+ - Add xaml to default list of extensions to include in csproj
+ - Avoid initializing Rider package in secondary Unity process, which does Asset processing
+ - Reflect multiple csc.rsp arguments to generated csproj files: https://github.com/JetBrains/resharper-unity/issues/1337
+ - Setting, which allowed to override LangVersion removed in favor of langversion in csc.rsp
+ - Environment.NewLine is used in generated project files instead of Windows line separator.
+
+## [1.1.2] - 2019-09-18
+
+performance optimizations:
+ - avoid multiple evaluations
+ - avoid reflection in DisableSyncSolutionOnceCallBack
+ - project generation optimization
+fixes:
+ - avoid compilation error with incompatible `Test Framework` package
+
+## [1.1.1] - 2019-08-26
+
+parse nowarn in csc.rsp
+warning, when Unity was started from Rider, but external editor was different
+improved unit test support
+workaround to avoid Unity internal project-generation (fix #28)
+
+
+## [1.1.0] - 2019-07-02
+
+new setting to manage list of extensions to be opened with Rider
+avoid breaking everything on any unhandled exception in RiderScriptEditor cctor
+hide Rider settings, when different Editor is selected
+dynamically load only newer rider plugins
+path detection (work on unix symlinks)
+speed up for project generation
+lots of bug fixing
+
+## [1.0.8] - 2019-05-20
+
+Fix NullReferenceException when External editor was pointing to non-existing Rider everything was broken by null-ref.
+
+## [1.0.7] - 2019-05-16
+
+Initial migration steps from rider plugin to package.
+Fix OSX check and opening of files.
+
+## [1.0.6] - 2019-04-30
+
+Ensure asset database is refreshed when generating csproj and solution files.
+
+## [1.0.5] - 2019-04-27
+
+Add support for generating all csproj files.
+
+## [1.0.4] - 2019-04-18
+
+Fix relative package paths.
+Fix opening editor on mac.
+
+## [1.0.3] - 2019-04-12
+
+Fixing null reference issue for callbacks to Asset pipeline.
+
+## [1.0.2] - 2019-01-01
+
+### This is the first release of *Unity Package rider_editor*.
+
+Using the newly created api to integrate Rider with Unity.
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md.meta
new file mode 100644
index 0000000..d8f7ef8
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 8645aa9c3c74fb34ba9499e14fb332b5
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md b/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md
new file mode 100644
index 0000000..f0005f6
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md
@@ -0,0 +1,6 @@
+# Contributing
+
+## All contributions are subject to the [Unity Contribution Agreement(UCA)](https://unity3d.com/legal/licenses/Unity_Contribution_Agreement)
+By making a pull request, you are confirming agreement to the terms and conditions of the UCA, including that your Contributions are your original creation and that you have complete right and authority to make your Contributions.
+
+## Once you have a change ready following these ground rules. Simply make a pull request \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md.meta
new file mode 100644
index 0000000..147d8ae
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 5e83f8baac96eaa47bdd9ca781cd2002
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Documentation~/README.md b/Library/PackageCache/com.unity.ide.rider@1.1.4/Documentation~/README.md
new file mode 100644
index 0000000..d9e6b90
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Documentation~/README.md
@@ -0,0 +1,4 @@
+# Code Editor Package for Rider
+
+This package is not intended to be modified by users.
+Nor does it provide any api intended to be included in user projects. \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md b/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md
new file mode 100644
index 0000000..8098f2d
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 Unity Technologies
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+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
+SOFTWARE.
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md.meta
new file mode 100644
index 0000000..30b6ed7
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 5598b14661b5f4c43bed757f34b6d172
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider.meta
new file mode 100644
index 0000000..1bafafc
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9129183a42052cd43b9c284d6dbd541e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor.meta
new file mode 100644
index 0000000..61363f1
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1b393f6b29a9ee84c803af1ab4944b71
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs
new file mode 100644
index 0000000..150d70c
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs
@@ -0,0 +1,457 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using JetBrains.Annotations;
+using Microsoft.Win32;
+using Unity.CodeEditor;
+using UnityEngine;
+
+namespace Packages.Rider.Editor
+{
+ public interface IDiscovery
+ {
+ CodeEditor.Installation[] PathCallback();
+ }
+
+ public class Discovery : IDiscovery
+ {
+ public CodeEditor.Installation[] PathCallback()
+ {
+ return RiderPathLocator.GetAllRiderPaths()
+ .Select(riderInfo => new CodeEditor.Installation
+ {
+ Path = riderInfo.Path,
+ Name = riderInfo.Presentation
+ })
+ .OrderBy(a=>a.Name)
+ .ToArray();
+ }
+ }
+
+ /// <summary>
+ /// 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
+ /// </summary>
+ public static class RiderPathLocator
+ {
+#if !(UNITY_4_7 || UNITY_5_5)
+ [UsedImplicitly] // Used in com.unity.ide.rider
+ public static RiderInfo[] GetAllRiderPaths()
+ {
+ try
+ {
+ switch (SystemInfo.operatingSystemFamily)
+ {
+ case OperatingSystemFamily.Windows:
+ {
+ return CollectRiderInfosWindows();
+ }
+
+ case OperatingSystemFamily.MacOSX:
+ {
+ return CollectRiderInfosMac();
+ }
+
+ case OperatingSystemFamily.Linux:
+ {
+ return CollectAllRiderPathsLinux();
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ Debug.LogException(e);
+ }
+
+ return new RiderInfo[0];
+ }
+#endif
+
+#if RIDER_EDITOR_PLUGIN // can't be used in com.unity.ide.rider
+ internal static RiderInfo[] GetAllFoundInfos(OperatingSystemFamilyRider operatingSystemFamily)
+ {
+ try
+ {
+ switch (operatingSystemFamily)
+ {
+ case OperatingSystemFamilyRider.Windows:
+ {
+ return CollectRiderInfosWindows();
+ }
+ case OperatingSystemFamilyRider.MacOSX:
+ {
+ return CollectRiderInfosMac();
+ }
+ case OperatingSystemFamilyRider.Linux:
+ {
+ return CollectAllRiderPathsLinux();
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ Debug.LogException(e);
+ }
+
+ return new RiderInfo[0];
+ }
+
+ internal static string[] GetAllFoundPaths(OperatingSystemFamilyRider operatingSystemFamily)
+ {
+ return GetAllFoundInfos(operatingSystemFamily).Select(a=>a.Path).ToArray();
+ }
+#endif
+
+ private static RiderInfo[] CollectAllRiderPathsLinux()
+ {
+ var installInfos = new List<RiderInfo>();
+ var home = Environment.GetEnvironmentVariable("HOME");
+ if (!string.IsNullOrEmpty(home))
+ {
+ var toolboxRiderRootPath = GetToolboxBaseDir();
+ installInfos.AddRange(CollectPathsFromToolbox(toolboxRiderRootPath, "bin", "rider.sh", false)
+ .Select(a => new RiderInfo(a, true)).ToList());
+
+ //$Home/.local/share/applications/jetbrains-rider.desktop
+ var shortcut = new FileInfo(Path.Combine(home, @".local/share/applications/jetbrains-rider.desktop"));
+
+ if (shortcut.Exists)
+ {
+ var lines = File.ReadAllLines(shortcut.FullName);
+ foreach (var line in lines)
+ {
+ if (!line.StartsWith("Exec=\""))
+ continue;
+ var path = line.Split('"').Where((item, index) => index == 1).SingleOrDefault();
+ if (string.IsNullOrEmpty(path))
+ continue;
+
+ if (installInfos.Any(a => a.Path == path)) // avoid adding similar build as from toolbox
+ continue;
+ installInfos.Add(new RiderInfo(path, false));
+ }
+ }
+ }
+
+ // snap install
+ var snapInstallPath = "/snap/rider/current/bin/rider.sh";
+ if (new FileInfo(snapInstallPath).Exists)
+ installInfos.Add(new RiderInfo(snapInstallPath, false));
+
+ return installInfos.ToArray();
+ }
+
+ private static RiderInfo[] CollectRiderInfosMac()
+ {
+ var installInfos = new List<RiderInfo>();
+ // "/Applications/*Rider*.app"
+ var folder = new DirectoryInfo("/Applications");
+ if (folder.Exists)
+ {
+ installInfos.AddRange(folder.GetDirectories("*Rider*.app")
+ .Select(a => new RiderInfo(a.FullName, false))
+ .ToList());
+ }
+
+ // /Users/user/Library/Application Support/JetBrains/Toolbox/apps/Rider/ch-1/181.3870.267/Rider EAP.app
+ var toolboxRiderRootPath = GetToolboxBaseDir();
+ var paths = CollectPathsFromToolbox(toolboxRiderRootPath, "", "Rider*.app", true)
+ .Select(a => new RiderInfo(a, true));
+ installInfos.AddRange(paths);
+
+ return installInfos.ToArray();
+ }
+
+ private static RiderInfo[] CollectRiderInfosWindows()
+ {
+ var installInfos = new List<RiderInfo>();
+ var toolboxRiderRootPath = GetToolboxBaseDir();
+ var installPathsToolbox = CollectPathsFromToolbox(toolboxRiderRootPath, "bin", "rider64.exe", false).ToList();
+ installInfos.AddRange(installPathsToolbox.Select(a => new RiderInfo(a, true)).ToList());
+
+ var installPaths = new List<string>();
+ const string registryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
+ CollectPathsFromRegistry(registryKey, installPaths);
+ const string wowRegistryKey = @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall";
+ CollectPathsFromRegistry(wowRegistryKey, installPaths);
+
+ installInfos.AddRange(installPaths.Select(a => new RiderInfo(a, false)).ToList());
+
+ return installInfos.ToArray();
+ }
+
+ private static string GetToolboxBaseDir()
+ {
+ switch (SystemInfo.operatingSystemFamily)
+ {
+ case OperatingSystemFamily.Windows:
+ {
+ var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
+ return Path.Combine(localAppData, @"JetBrains\Toolbox\apps\Rider");
+ }
+
+ case OperatingSystemFamily.MacOSX:
+ {
+ var home = Environment.GetEnvironmentVariable("HOME");
+ if (!string.IsNullOrEmpty(home))
+ {
+ return Path.Combine(home, @"Library/Application Support/JetBrains/Toolbox/apps/Rider");
+ }
+ break;
+ }
+
+ case OperatingSystemFamily.Linux:
+ {
+ var home = Environment.GetEnvironmentVariable("HOME");
+ if (!string.IsNullOrEmpty(home))
+ {
+ return Path.Combine(home, @".local/share/JetBrains/Toolbox/apps/Rider");
+ }
+ break;
+ }
+ }
+ return string.Empty;
+ }
+
+ internal static string GetBuildNumber(string path)
+ {
+ var file = new FileInfo(Path.Combine(path, GetRelativePathToBuildTxt()));
+ if (!file.Exists)
+ return string.Empty;
+ var text = File.ReadAllText(file.FullName);
+ if (text.Length > 3)
+ return text.Substring(3);
+ return string.Empty;
+ }
+
+ internal static bool IsToolbox(string path)
+ {
+ return path.StartsWith(GetToolboxBaseDir());
+ }
+
+ private static string GetRelativePathToBuildTxt()
+ {
+ switch (SystemInfo.operatingSystemFamily)
+ {
+ case OperatingSystemFamily.Windows:
+ case OperatingSystemFamily.Linux:
+ return "../../build.txt";
+ case OperatingSystemFamily.MacOSX:
+ return "Contents/Resources/build.txt";
+ }
+ throw new Exception("Unknown OS");
+ }
+
+ private static void CollectPathsFromRegistry(string registryKey, List<string> installPaths)
+ {
+ using (var key = Registry.LocalMachine.OpenSubKey(registryKey))
+ {
+ if (key == null) return;
+ foreach (var subkeyName in key.GetSubKeyNames().Where(a => a.Contains("Rider")))
+ {
+ using (var subkey = key.OpenSubKey(subkeyName))
+ {
+ var folderObject = subkey?.GetValue("InstallLocation");
+ if (folderObject == null) continue;
+ var folder = folderObject.ToString();
+ var possiblePath = Path.Combine(folder, @"bin\rider64.exe");
+ if (File.Exists(possiblePath))
+ installPaths.Add(possiblePath);
+ }
+ }
+ }
+ }
+
+ private static string[] CollectPathsFromToolbox(string toolboxRiderRootPath, string dirName, string searchPattern,
+ bool isMac)
+ {
+ if (!Directory.Exists(toolboxRiderRootPath))
+ return new string[0];
+
+ var channelDirs = Directory.GetDirectories(toolboxRiderRootPath);
+ var paths = channelDirs.SelectMany(channelDir =>
+ {
+ try
+ {
+ // 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");
+ if (File.Exists(historyFile))
+ {
+ var json = File.ReadAllText(historyFile);
+ var build = ToolboxHistory.GetLatestBuildFromJson(json);
+ if (build != null)
+ {
+ var buildDir = Path.Combine(channelDir, build);
+ var executablePaths = GetExecutablePaths(dirName, searchPattern, isMac, buildDir);
+ if (executablePaths.Any())
+ return executablePaths;
+ }
+ }
+
+ var channelFile = Path.Combine(channelDir, ".channel.settings.json");
+ if (File.Exists(channelFile))
+ {
+ var json = File.ReadAllText(channelFile).Replace("active-application", "active_application");
+ var build = ToolboxInstallData.GetLatestBuildFromJson(json);
+ if (build != null)
+ {
+ var buildDir = Path.Combine(channelDir, build);
+ var executablePaths = GetExecutablePaths(dirName, searchPattern, isMac, buildDir);
+ if (executablePaths.Any())
+ return executablePaths;
+ }
+ }
+
+ // changes in toolbox json files format may brake the logic above, so return all found Rider installations
+ return Directory.GetDirectories(channelDir)
+ .SelectMany(buildDir => GetExecutablePaths(dirName, searchPattern, isMac, buildDir));
+ }
+ catch (Exception e)
+ {
+ // do not write to Debug.Log, just log it.
+ Logger.Warn($"Failed to get RiderPath from {channelDir}", e);
+ }
+
+ return new string[0];
+ })
+ .Where(c => !string.IsNullOrEmpty(c))
+ .ToArray();
+ return paths;
+ }
+
+ private static string[] GetExecutablePaths(string dirName, string searchPattern, bool isMac, string buildDir)
+ {
+ var folder = new DirectoryInfo(Path.Combine(buildDir, dirName));
+ if (!folder.Exists)
+ return new string[0];
+
+ if (!isMac)
+ return new[] {Path.Combine(folder.FullName, searchPattern)}.Where(File.Exists).ToArray();
+ return folder.GetDirectories(searchPattern).Select(f => f.FullName)
+ .Where(Directory.Exists).ToArray();
+ }
+
+ // 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
+#pragma warning disable 0649
+
+ [Serializable]
+ class ToolboxHistory
+ {
+ public List<ItemNode> history;
+
+ [CanBeNull]
+ public static string GetLatestBuildFromJson(string json)
+ {
+ try
+ {
+#if UNITY_4_7 || UNITY_5_5
+ return JsonConvert.DeserializeObject<ToolboxHistory>(json).history.LastOrDefault()?.item.build;
+#else
+ return JsonUtility.FromJson<ToolboxHistory>(json).history.LastOrDefault()?.item.build;
+#endif
+ }
+ catch (Exception)
+ {
+ Logger.Warn($"Failed to get latest build from json {json}");
+ }
+
+ return null;
+ }
+ }
+
+ [Serializable]
+ class ItemNode
+ {
+ public BuildNode item;
+ }
+
+ [Serializable]
+ class BuildNode
+ {
+ public string build;
+ }
+
+ // ReSharper disable once ClassNeverInstantiated.Global
+ [Serializable]
+ class ToolboxInstallData
+ {
+ // ReSharper disable once InconsistentNaming
+ public ActiveApplication active_application;
+
+ [CanBeNull]
+ public static string GetLatestBuildFromJson(string json)
+ {
+ try
+ {
+#if UNITY_4_7 || UNITY_5_5
+ var toolbox = JsonConvert.DeserializeObject<ToolboxInstallData>(json);
+#else
+ var toolbox = JsonUtility.FromJson<ToolboxInstallData>(json);
+#endif
+ var builds = toolbox.active_application.builds;
+ if (builds != null && builds.Any())
+ return builds.First();
+ }
+ catch (Exception)
+ {
+ Logger.Warn($"Failed to get latest build from json {json}");
+ }
+
+ return null;
+ }
+ }
+
+ [Serializable]
+ class ActiveApplication
+ {
+ // ReSharper disable once InconsistentNaming
+ public List<string> builds;
+ }
+
+#pragma warning restore 0649
+
+ public struct RiderInfo
+ {
+ public bool IsToolbox;
+ public string Presentation;
+ public string BuildVersion;
+ public string Path;
+
+ public RiderInfo(string path, bool isToolbox)
+ {
+ if (path == RiderScriptEditor.CurrentEditor)
+ {
+ RiderScriptEditorData.instance.Init();
+ BuildVersion = RiderScriptEditorData.instance.currentEditorVersion;
+ }
+ else
+ BuildVersion = GetBuildNumber(path);
+ Path = new FileInfo(path).FullName; // normalize separators
+ var presentation = "Rider " + BuildVersion;
+ if (isToolbox)
+ presentation += " (JetBrains Toolbox)";
+
+ Presentation = presentation;
+ IsToolbox = isToolbox;
+ }
+ }
+
+ private static class Logger
+ {
+ internal static void Warn(string message, Exception e = null)
+ {
+#if RIDER_EDITOR_PLUGIN // can't be used in com.unity.ide.rider
+ Log.GetLog(typeof(RiderPathLocator).Name).Warn(message);
+ if (e != null)
+ Log.GetLog(typeof(RiderPathLocator).Name).Warn(e);
+#else
+ Debug.LogError(message);
+ if (e != null)
+ Debug.LogException(e);
+#endif
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs.meta
new file mode 100644
index 0000000..fc30914
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: dab656c79e1985c40b31faebcda44442
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs
new file mode 100644
index 0000000..749218f
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs
@@ -0,0 +1,136 @@
+using System;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Debug = UnityEngine.Debug;
+
+namespace Packages.Rider.Editor
+{
+ public static class EditorPluginInterop
+ {
+ private static string ourEntryPointTypeName = "JetBrains.Rider.Unity.Editor.PluginEntryPoint";
+
+ private static Assembly ourEditorPluginAssembly;
+
+ public static Assembly EditorPluginAssembly
+ {
+ get
+ {
+ if (ourEditorPluginAssembly != null)
+ return ourEditorPluginAssembly;
+ var assemblies = AppDomain.CurrentDomain.GetAssemblies();
+ ourEditorPluginAssembly = assemblies.FirstOrDefault(a => a.GetName().Name.Equals("JetBrains.Rider.Unity.Editor.Plugin.Full.Repacked"));
+ return ourEditorPluginAssembly;
+ }
+ }
+
+
+ private static void DisableSyncSolutionOnceCallBack()
+ {
+ // RiderScriptableSingleton.Instance.CsprojProcessedOnce = true;
+ // Otherwise EditorPlugin regenerates all on every AppDomain reload
+ var assembly = EditorPluginAssembly;
+ if (assembly == null) return;
+ var type = assembly.GetType("JetBrains.Rider.Unity.Editor.Utils.RiderScriptableSingleton");
+ if (type == null) return;
+ var baseType = type.BaseType;
+ if (baseType == null) return;
+ var instance = baseType.GetProperty("Instance");
+ if (instance == null) return;
+ var instanceVal = instance.GetValue(null);
+ var member = type.GetProperty("CsprojProcessedOnce");
+ if (member==null) return;
+ member.SetValue(instanceVal, true);
+ }
+
+ public static string LogPath
+ {
+ get
+ {
+ try
+ {
+ var assembly = EditorPluginAssembly;
+ if (assembly == null) return null;
+ var type = assembly.GetType(ourEntryPointTypeName);
+ if (type == null) return null;
+ var field = type.GetField("LogPath", BindingFlags.NonPublic | BindingFlags.Static);
+ if (field == null) return null;
+ return field.GetValue(null) as string;
+ }
+ catch (Exception)
+ {
+ Debug.Log("Unable to do OpenFile to Rider from dll, fallback to com.unity.ide.rider implementation.");
+ }
+
+ return null;
+ }
+ }
+
+ public static bool OpenFileDllImplementation(string path, int line, int column)
+ {
+ var openResult = false;
+ // reflection for fast OpenFileLineCol, when Rider is started and protocol connection is established
+ try
+ {
+ var assembly = EditorPluginAssembly;
+ if (assembly == null) return false;
+ var type = assembly.GetType(ourEntryPointTypeName);
+ if (type == null) return false;
+ var field = type.GetField("OpenAssetHandler", BindingFlags.NonPublic | BindingFlags.Static);
+ if (field == null) return false;
+ var handlerInstance = field.GetValue(null);
+ var method = handlerInstance.GetType()
+ .GetMethod("OnOpenedAsset", new[] {typeof(string), typeof(int), typeof(int)});
+ if (method == null) return false;
+ var assetFilePath = path;
+ if (!string.IsNullOrEmpty(path))
+ assetFilePath = Path.GetFullPath(path);
+
+ openResult = (bool) method.Invoke(handlerInstance, new object[] {assetFilePath, line, column});
+ }
+ catch (Exception e)
+ {
+ Debug.Log("Unable to do OpenFile to Rider from dll, fallback to com.unity.ide.rider implementation.");
+ Debug.LogException(e);
+ }
+
+ return openResult;
+ }
+
+ public static bool EditorPluginIsLoadedFromAssets(Assembly assembly)
+ {
+ if (assembly == null)
+ return false;
+ var location = assembly.Location;
+ var currentDir = Directory.GetCurrentDirectory();
+ return location.StartsWith(currentDir, StringComparison.InvariantCultureIgnoreCase);
+ }
+
+
+ internal static void InitEntryPoint(Assembly assembly)
+ {
+ try
+ {
+ if (Version.TryParse(RiderScriptEditorData.instance.currentEditorVersion, out var version))
+ {
+ if (version.Major < 192)
+ DisableSyncSolutionOnceCallBack(); // is require for Rider prior to 2019.2
+ }
+ else
+ DisableSyncSolutionOnceCallBack();
+
+ var type = assembly.GetType("JetBrains.Rider.Unity.Editor.AfterUnity56.EntryPoint");
+ if (type == null)
+ type = assembly.GetType("JetBrains.Rider.Unity.Editor.UnitTesting.EntryPoint"); // oldRider
+ RuntimeHelpers.RunClassConstructor(type.TypeHandle);
+ }
+ catch (TypeInitializationException ex)
+ {
+ Debug.LogException(ex);
+ if (ex.InnerException != null)
+ Debug.LogException(ex.InnerException);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs.meta
new file mode 100644
index 0000000..2c34764
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f9bd02a3a916be64c9b47b1305149423
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs
new file mode 100644
index 0000000..0fb025d
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs
@@ -0,0 +1,22 @@
+namespace Packages.Rider.Editor
+{
+ public enum LoggingLevel
+ {
+ /// <summary>
+ /// Do not use it in logging. Only in config to disable logging.
+ /// </summary>
+ OFF,
+ /// <summary>For errors that lead to application failure</summary>
+ FATAL,
+ /// <summary>For errors that must be shown in Exception Browser</summary>
+ ERROR,
+ /// <summary>Suspicious situations but not errors</summary>
+ WARN,
+ /// <summary>Regular level for important events</summary>
+ INFO,
+ /// <summary>Additional info for debbuging</summary>
+ VERBOSE,
+ /// <summary>Methods &amp; callstacks tracing, more than verbose</summary>
+ TRACE,
+ }
+} \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs.meta
new file mode 100644
index 0000000..45be604
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 71bb46b59a9a7a346bbab1e185c723df
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs
new file mode 100644
index 0000000..d3c139a
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs
@@ -0,0 +1,128 @@
+using Unity.CodeEditor;
+using UnityEditor;
+using UnityEngine;
+
+namespace Packages.Rider.Editor
+{
+ public class PluginSettings
+ {
+ public static LoggingLevel SelectedLoggingLevel
+ {
+ get => (LoggingLevel) EditorPrefs.GetInt("Rider_SelectedLoggingLevel", 0);
+ set
+ {
+ EditorPrefs.SetInt("Rider_SelectedLoggingLevel", (int) value);
+ }
+ }
+
+ public static bool LogEventsCollectorEnabled
+ {
+ get { return EditorPrefs.GetBool("Rider_LogEventsCollectorEnabled", true); }
+ private set { EditorPrefs.SetBool("Rider_LogEventsCollectorEnabled", value); }
+ }
+
+
+ private static GUIStyle ourVersionInfoStyle = new GUIStyle()
+ {
+ normal = new GUIStyleState()
+ {
+ textColor = new Color(0, 0, 0, .6f),
+ },
+ margin = new RectOffset(4, 4, 4, 4),
+ };
+
+ /// <summary>
+ /// Preferences menu layout
+ /// </summary>
+ /// <remarks>
+ /// Contains all 3 toggles: Enable/Disable; Debug On/Off; Writing Launch File On/Off
+ /// </remarks>
+ [SettingsProvider]
+ private static SettingsProvider RiderPreferencesItem()
+ {
+ if (!RiderScriptEditor.IsRiderInstallation(RiderScriptEditor.CurrentEditor))
+ return null;
+ if (!RiderScriptEditorData.instance.shouldLoadEditorPlugin)
+ return null;
+ var provider = new SettingsProvider("Preferences/Rider", SettingsScope.User)
+ {
+ label = "Rider",
+ keywords = new[] { "Rider" },
+ guiHandler = (searchContext) =>
+ {
+ EditorGUIUtility.labelWidth = 200f;
+ EditorGUILayout.BeginVertical();
+
+ GUILayout.BeginVertical();
+ LogEventsCollectorEnabled =
+ EditorGUILayout.Toggle(new GUIContent("Pass Console to Rider:"), LogEventsCollectorEnabled);
+
+ GUILayout.EndVertical();
+ GUILayout.Label("");
+
+ if (!string.IsNullOrEmpty(EditorPluginInterop.LogPath))
+ {
+ EditorGUILayout.BeginHorizontal();
+ EditorGUILayout.PrefixLabel("Log file:");
+ var previous = GUI.enabled;
+ GUI.enabled = previous && SelectedLoggingLevel != LoggingLevel.OFF;
+ var button = GUILayout.Button(new GUIContent("Open log"));
+ if (button)
+ {
+ //UnityEditorInternal.InternalEditorUtility.OpenFileAtLineExternal(PluginEntryPoint.LogPath, 0);
+ // works much faster than the commented code, when Rider is already started
+ CodeEditor.CurrentEditor.OpenProject(EditorPluginInterop.LogPath, 0, 0);
+ }
+
+ GUI.enabled = previous;
+ GUILayout.EndHorizontal();
+ }
+
+ 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.";
+ SelectedLoggingLevel =
+ (LoggingLevel) EditorGUILayout.EnumPopup(new GUIContent("Logging Level:", loggingMsg),
+ SelectedLoggingLevel);
+
+
+ EditorGUILayout.HelpBox(loggingMsg, MessageType.None);
+
+ var githubRepo = "https://github.com/JetBrains/resharper-unity";
+ var caption = $"<color=#0000FF>{githubRepo}</color>";
+ LinkButton(caption: caption, url: githubRepo);
+
+ GUILayout.FlexibleSpace();
+ GUILayout.BeginHorizontal();
+
+ GUILayout.FlexibleSpace();
+ var assembly = EditorPluginInterop.EditorPluginAssembly;
+ if (assembly != null)
+ {
+ var version = assembly.GetName().Version;
+ GUILayout.Label("Plugin version: " + version, ourVersionInfoStyle);
+ }
+
+ GUILayout.EndHorizontal();
+
+ EditorGUILayout.EndVertical();
+ }
+ };
+ return provider;
+ }
+
+ private static void LinkButton(string caption, string url)
+ {
+ var style = GUI.skin.label;
+ style.richText = true;
+
+ var bClicked = GUILayout.Button(caption, style);
+
+ var rect = GUILayoutUtility.GetLastRect();
+ rect.width = style.CalcSize(new GUIContent(caption)).x;
+ EditorGUIUtility.AddCursorRect(rect, MouseCursor.Link);
+
+ if (bClicked)
+ Application.OpenURL(url);
+ }
+ }
+} \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs.meta
new file mode 100644
index 0000000..a2b0299
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1bfe12aa306c0c74db4f4f1a1a0ae5ce
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors.meta
new file mode 100644
index 0000000..6a6a961
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: aa290bd9a165a0543a4bf85ac73914bc
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs
new file mode 100644
index 0000000..c442dd1
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs
@@ -0,0 +1,16 @@
+using Unity.CodeEditor;
+using UnityEditor;
+
+namespace Packages.Rider.Editor.PostProcessors
+{
+ public class RiderAssetPostprocessor: AssetPostprocessor
+ {
+ public static bool OnPreGeneratingCSProjectFiles()
+ {
+ var path = RiderScriptEditor.GetEditorRealPath(CodeEditor.CurrentEditorInstallation);
+ if (RiderScriptEditor.IsRiderInstallation(path))
+ return !ProjectGeneration.isRiderProjectGeneration;
+ return false;
+ }
+ }
+} \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs.meta
new file mode 100644
index 0000000..f3e3377
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 45471ad7b8c1f964da5e3c07d57fbf4f
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration.meta
new file mode 100644
index 0000000..2afe02d
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 313cbe17019f1934397f91069831062c
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs
new file mode 100644
index 0000000..c7896c7
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs
@@ -0,0 +1,23 @@
+using System;
+using System.IO;
+using System.Text;
+
+namespace Packages.Rider.Editor {
+ class FileIOProvider : IFileIO
+ {
+ public bool Exists(string fileName)
+ {
+ return File.Exists(fileName);
+ }
+
+ public string ReadAllText(string fileName)
+ {
+ return File.ReadAllText(fileName);
+ }
+
+ public void WriteAllText(string fileName, string content)
+ {
+ File.WriteAllText(fileName, content, Encoding.UTF8);
+ }
+ }
+}
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs.meta
new file mode 100644
index 0000000..59ead4f
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a6ba838b1348d5e46a7eaacd1646c1d3
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs
new file mode 100644
index 0000000..54851ce
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs
@@ -0,0 +1,16 @@
+using System;
+
+namespace Packages.Rider.Editor {
+ class GUIDProvider : IGUIDGenerator
+ {
+ public string ProjectGuid(string projectName, string assemblyName)
+ {
+ return SolutionGuidGenerator.GuidForProject(projectName + assemblyName);
+ }
+
+ public string SolutionGuid(string projectName, string extension)
+ {
+ return SolutionGuidGenerator.GuidForSolution(projectName, extension); // GetExtensionOfSourceFiles(assembly.sourceFiles)
+ }
+ }
+}
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs.meta
new file mode 100644
index 0000000..e1bc7ef
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 8cfde1a59fb35574189691a9de1df93b
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs
new file mode 100644
index 0000000..7f5ec31
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs
@@ -0,0 +1,1090 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Security;
+using System.Security.Cryptography;
+using System.Text;
+using System.Text.RegularExpressions;
+using Packages.Rider.Editor.Util;
+using UnityEditor;
+using UnityEditor.Compilation;
+using UnityEditor.PackageManager;
+using UnityEditorInternal;
+using UnityEngine;
+
+namespace Packages.Rider.Editor
+{
+ public interface IGenerator
+ {
+ bool SyncIfNeeded(IEnumerable<string> affectedFiles, IEnumerable<string> reimportedFiles);
+ void Sync();
+ bool HasSolutionBeenGenerated();
+ string SolutionFile();
+ string ProjectDirectory { get; }
+ void GenerateAll(bool generateAll);
+ }
+
+ public interface IFileIO
+ {
+ bool Exists(string fileName);
+
+ string ReadAllText(string fileName);
+ void WriteAllText(string fileName, string content);
+ }
+
+ public interface IGUIDGenerator
+ {
+ string ProjectGuid(string projectName, string assemblyName);
+ string SolutionGuid(string projectName, string extension);
+ }
+
+ public interface IAssemblyNameProvider
+ {
+ string GetAssemblyNameFromScriptPath(string path);
+ IEnumerable<Assembly> GetAssemblies(Func<string, bool> shouldFileBePartOfSolution);
+ IEnumerable<string> GetAllAssetPaths();
+ UnityEditor.PackageManager.PackageInfo FindForAssetPath(string assetPath);
+ ResponseFileData ParseResponseFile(string responseFilePath, string projectDirectory, string[] systemReferenceDirectories);
+ }
+
+ class AssemblyNameProvider : IAssemblyNameProvider
+ {
+ public string GetAssemblyNameFromScriptPath(string path)
+ {
+ return CompilationPipeline.GetAssemblyNameFromScriptPath(path);
+ }
+
+ public IEnumerable<Assembly> GetAssemblies(Func<string, bool> shouldFileBePartOfSolution)
+ {
+ return CompilationPipeline.GetAssemblies()
+ .Where(i => 0 < i.sourceFiles.Length && i.sourceFiles.Any(shouldFileBePartOfSolution));
+ }
+
+ public IEnumerable<string> GetAllAssetPaths()
+ {
+ return AssetDatabase.GetAllAssetPaths();
+ }
+
+ public UnityEditor.PackageManager.PackageInfo FindForAssetPath(string assetPath)
+ {
+ return UnityEditor.PackageManager.PackageInfo.FindForAssetPath(assetPath);
+ }
+
+ public ResponseFileData ParseResponseFile(string responseFilePath, string projectDirectory, string[] systemReferenceDirectories)
+ {
+ return CompilationPipeline.ParseResponseFile(
+ responseFilePath,
+ projectDirectory,
+ systemReferenceDirectories
+ );
+ }
+ }
+
+ public class ProjectGeneration : IGenerator
+ {
+ enum ScriptingLanguage
+ {
+ None,
+ CSharp
+ }
+
+ public static readonly string MSBuildNamespaceUri = "http://schemas.microsoft.com/developer/msbuild/2003";
+
+ /// <summary>
+ /// Map source extensions to ScriptingLanguages
+ /// </summary>
+ static readonly Dictionary<string, ScriptingLanguage> k_BuiltinSupportedExtensions =
+ new Dictionary<string, ScriptingLanguage>
+ {
+ {"cs", ScriptingLanguage.CSharp},
+ {"uxml", ScriptingLanguage.None},
+ {"uss", ScriptingLanguage.None},
+ {"shader", ScriptingLanguage.None},
+ {"compute", ScriptingLanguage.None},
+ {"cginc", ScriptingLanguage.None},
+ {"hlsl", ScriptingLanguage.None},
+ {"glslinc", ScriptingLanguage.None},
+ {"template", ScriptingLanguage.None},
+ {"raytrace", ScriptingLanguage.None}
+ };
+
+ string m_SolutionProjectEntryTemplate = string.Join(Environment.NewLine,
+ @"Project(""{{{0}}}"") = ""{1}"", ""{2}"", ""{{{3}}}""",
+ @"EndProject").Replace(" ", "\t");
+
+ string m_SolutionProjectConfigurationTemplate = string.Join(Environment.NewLine,
+ @" {{{0}}}.Debug|Any CPU.ActiveCfg = Debug|Any CPU",
+ @" {{{0}}}.Debug|Any CPU.Build.0 = Debug|Any CPU",
+ @" {{{0}}}.Release|Any CPU.ActiveCfg = Release|Any CPU",
+ @" {{{0}}}.Release|Any CPU.Build.0 = Release|Any CPU").Replace(" ", "\t");
+
+ static readonly string[] k_ReimportSyncExtensions = {".dll", ".asmdef"};
+
+ /// <summary>
+ /// Map ScriptingLanguages to project extensions
+ /// </summary>
+ /*static readonly Dictionary<ScriptingLanguage, string> k_ProjectExtensions = new Dictionary<ScriptingLanguage, string>
+ {
+ { ScriptingLanguage.CSharp, ".csproj" },
+ { ScriptingLanguage.None, ".csproj" },
+ };*/
+ static readonly Regex k_ScriptReferenceExpression = new Regex(
+ @"^Library.ScriptAssemblies.(?<dllname>(?<project>.*)\.dll$)",
+ RegexOptions.Compiled | RegexOptions.IgnoreCase);
+
+ string[] m_ProjectSupportedExtensions = new string[0];
+ bool m_ShouldGenerateAll;
+
+ public string ProjectDirectory { get; }
+
+ public void GenerateAll(bool generateAll)
+ {
+ m_ShouldGenerateAll = generateAll;
+ }
+
+ readonly string m_ProjectName;
+ readonly IAssemblyNameProvider m_AssemblyNameProvider;
+ readonly IFileIO m_FileIOProvider;
+ readonly IGUIDGenerator m_GUIDGenerator;
+ internal static bool isRiderProjectGeneration; // workaround to https://github.cds.internal.unity3d.com/unity/com.unity.ide.rider/issues/28
+
+ const string k_ToolsVersion = "4.0";
+ const string k_ProductVersion = "10.0.20506";
+ const string k_BaseDirectory = ".";
+ const string k_TargetFrameworkVersion = "v4.7.1";
+ const string k_TargetLanguageVersion = "latest";
+
+ static readonly Regex scriptReferenceExpression = new Regex(
+ @"^Library.ScriptAssemblies.(?<dllname>(?<project>.*)\.dll$)",
+ RegexOptions.Compiled | RegexOptions.IgnoreCase);
+
+ public ProjectGeneration() : this(Directory.GetParent(Application.dataPath).FullName)
+ {
+ }
+
+ public ProjectGeneration(string tempDirectory) : this(tempDirectory, new AssemblyNameProvider(), new FileIOProvider(), new GUIDProvider())
+ {
+ }
+
+ public ProjectGeneration(string tempDirectory, IAssemblyNameProvider assemblyNameProvider, IFileIO fileIoProvider, IGUIDGenerator guidGenerator)
+ {
+ ProjectDirectory = tempDirectory.Replace('\\', '/');
+ m_ProjectName = Path.GetFileName(ProjectDirectory);
+ m_AssemblyNameProvider = assemblyNameProvider;
+ m_FileIOProvider = fileIoProvider;
+ m_GUIDGenerator = guidGenerator;
+ }
+
+ /// <summary>
+ /// Syncs the scripting solution if any affected files are relevant.
+ /// </summary>
+ /// <returns>
+ /// Whether the solution was synced.
+ /// </returns>
+ /// <param name='affectedFiles'>
+ /// A set of files whose status has changed
+ /// </param>
+ /// <param name="reimportedFiles">
+ /// A set of files that got reimported
+ /// </param>
+ public bool SyncIfNeeded(IEnumerable<string> affectedFiles, IEnumerable<string> reimportedFiles)
+ {
+ SetupProjectSupportedExtensions();
+
+ if (HasFilesBeenModified(affectedFiles, reimportedFiles))
+ {
+ Sync();
+ return true;
+ }
+
+ return false;
+ }
+
+ bool HasFilesBeenModified(IEnumerable<string> affectedFiles, IEnumerable<string> reimportedFiles)
+ {
+ return affectedFiles.Any(ShouldFileBePartOfSolution) || reimportedFiles.Any(ShouldSyncOnReimportedAsset);
+ }
+
+ static bool ShouldSyncOnReimportedAsset(string asset)
+ {
+ return k_ReimportSyncExtensions.Contains(new FileInfo(asset).Extension);
+ }
+
+ public void Sync()
+ {
+ SetupProjectSupportedExtensions();
+ var types = GetAssetPostprocessorTypes();
+ isRiderProjectGeneration = true;
+ bool externalCodeAlreadyGeneratedProjects = OnPreGeneratingCSProjectFiles(types);
+ isRiderProjectGeneration = false;
+ if (!externalCodeAlreadyGeneratedProjects)
+ {
+ GenerateAndWriteSolutionAndProjects(types);
+ }
+
+ OnGeneratedCSProjectFiles(types);
+ }
+
+ public bool HasSolutionBeenGenerated()
+ {
+ return m_FileIOProvider.Exists(SolutionFile());
+ }
+
+ void SetupProjectSupportedExtensions()
+ {
+ m_ProjectSupportedExtensions = EditorSettings.projectGenerationUserExtensions;
+ }
+
+ bool ShouldFileBePartOfSolution(string file)
+ {
+ string extension = Path.GetExtension(file);
+
+ // Exclude files coming from packages except if they are internalized.
+ if (!m_ShouldGenerateAll && IsInternalizedPackagePath(file))
+ {
+ return false;
+ }
+
+ // Dll's are not scripts but still need to be included..
+ if (extension == ".dll")
+ return true;
+
+ if (file.ToLower().EndsWith(".asmdef"))
+ return true;
+
+ return IsSupportedExtension(extension);
+ }
+
+ bool IsSupportedExtension(string extension)
+ {
+ extension = extension.TrimStart('.');
+ if (k_BuiltinSupportedExtensions.ContainsKey(extension))
+ return true;
+ if (m_ProjectSupportedExtensions.Contains(extension))
+ return true;
+ return false;
+ }
+
+ static ScriptingLanguage ScriptingLanguageFor(Assembly island)
+ {
+ return ScriptingLanguageFor(GetExtensionOfSourceFiles(island.sourceFiles));
+ }
+
+ static string GetExtensionOfSourceFiles(string[] files)
+ {
+ return files.Length > 0 ? GetExtensionOfSourceFile(files[0]) : "NA";
+ }
+
+ static string GetExtensionOfSourceFile(string file)
+ {
+ var ext = Path.GetExtension(file).ToLower();
+ ext = ext.Substring(1); //strip dot
+ return ext;
+ }
+
+ static ScriptingLanguage ScriptingLanguageFor(string extension)
+ {
+ return k_BuiltinSupportedExtensions.TryGetValue(extension.TrimStart('.'), out var result)
+ ? result
+ : ScriptingLanguage.None;
+ }
+
+ public void GenerateAndWriteSolutionAndProjects(Type[] types)
+ {
+ // Only synchronize islands that have associated source files and ones that we actually want in the project.
+ // This also filters out DLLs coming from .asmdef files in packages.
+ var assemblies = m_AssemblyNameProvider.GetAssemblies(ShouldFileBePartOfSolution);
+
+ var allAssetProjectParts = GenerateAllAssetProjectParts();
+
+ var monoIslands = assemblies.ToList();
+
+ SyncSolution(monoIslands, types);
+ var allProjectIslands = RelevantIslandsForMode(monoIslands).ToList();
+ foreach (Assembly assembly in allProjectIslands)
+ {
+ var responseFileData = ParseResponseFileData(assembly);
+ SyncProject(assembly, allAssetProjectParts, responseFileData, allProjectIslands, types);
+ }
+ }
+
+ IEnumerable<ResponseFileData> ParseResponseFileData(Assembly assembly)
+ {
+ var systemReferenceDirectories =
+ CompilationPipeline.GetSystemAssemblyDirectories(assembly.compilerOptions.ApiCompatibilityLevel);
+
+ Dictionary<string, ResponseFileData> responseFilesData = assembly.compilerOptions.ResponseFiles.ToDictionary(
+ x => x, x => m_AssemblyNameProvider.ParseResponseFile(
+ x,
+ ProjectDirectory,
+ systemReferenceDirectories
+ ));
+
+ Dictionary<string, ResponseFileData> responseFilesWithErrors = responseFilesData.Where(x => x.Value.Errors.Any())
+ .ToDictionary(x => x.Key, x => x.Value);
+
+ if (responseFilesWithErrors.Any())
+ {
+ foreach (var error in responseFilesWithErrors)
+ foreach (var valueError in error.Value.Errors)
+ {
+ Debug.LogError($"{error.Key} Parse Error : {valueError}");
+ }
+ }
+
+ return responseFilesData.Select(x => x.Value);
+ }
+
+ Dictionary<string, string> GenerateAllAssetProjectParts()
+ {
+ Dictionary<string, StringBuilder> stringBuilders = new Dictionary<string, StringBuilder>();
+
+ foreach (string asset in m_AssemblyNameProvider.GetAllAssetPaths())
+ {
+ // Exclude files coming from packages except if they are internalized.
+ if (!m_ShouldGenerateAll && IsInternalizedPackagePath(asset))
+ {
+ continue;
+ }
+
+ string extension = Path.GetExtension(asset);
+ if (IsSupportedExtension(extension) && ScriptingLanguage.None == ScriptingLanguageFor(extension))
+ {
+ // Find assembly the asset belongs to by adding script extension and using compilation pipeline.
+ var assemblyName = m_AssemblyNameProvider.GetAssemblyNameFromScriptPath(asset + ".cs");
+
+ if (string.IsNullOrEmpty(assemblyName))
+ {
+ continue;
+ }
+
+ assemblyName = FileSystemUtil.FileNameWithoutExtension(assemblyName);
+
+ if (!stringBuilders.TryGetValue(assemblyName, out var projectBuilder))
+ {
+ projectBuilder = new StringBuilder();
+ stringBuilders[assemblyName] = projectBuilder;
+ }
+
+ projectBuilder.Append(" <None Include=\"").Append(EscapedRelativePathFor(asset)).Append("\" />")
+ .Append(Environment.NewLine);
+ }
+ }
+
+ var result = new Dictionary<string, string>();
+
+ foreach (var entry in stringBuilders)
+ result[entry.Key] = entry.Value.ToString();
+
+ return result;
+ }
+
+ bool IsInternalizedPackagePath(string file)
+ {
+ if (string.IsNullOrWhiteSpace(file))
+ {
+ return false;
+ }
+
+ var packageInfo = m_AssemblyNameProvider.FindForAssetPath(file);
+ if (packageInfo == null)
+ {
+ return false;
+ }
+
+ var packageSource = packageInfo.source;
+ return packageSource != PackageSource.Embedded && packageSource != PackageSource.Local;
+ }
+
+ void SyncProject(
+ Assembly island,
+ Dictionary<string, string> allAssetsProjectParts,
+ IEnumerable<ResponseFileData> responseFilesData,
+ List<Assembly> allProjectIslands,
+ Type[] types)
+ {
+ SyncProjectFileIfNotChanged(ProjectFile(island),
+ ProjectText(island, allAssetsProjectParts, responseFilesData.ToList(), allProjectIslands), types);
+ }
+
+ void SyncProjectFileIfNotChanged(string path, string newContents, Type[] types)
+ {
+ if (Path.GetExtension(path) == ".csproj")
+ {
+ newContents = OnGeneratedCSProject(path, newContents, types);
+ }
+
+ SyncFileIfNotChanged(path, newContents);
+ }
+
+ void SyncSolutionFileIfNotChanged(string path, string newContents, Type[] types)
+ {
+ newContents = OnGeneratedSlnSolution(path, newContents, types);
+
+ SyncFileIfNotChanged(path, newContents);
+ }
+
+ static List<Type> SafeGetTypes(System.Reflection.Assembly a)
+ {
+ List<Type> ret;
+
+ try
+ {
+ ret = a.GetTypes().ToList();
+ }
+ catch (System.Reflection.ReflectionTypeLoadException rtl)
+ {
+ ret = rtl.Types.ToList();
+ }
+ catch (Exception)
+ {
+ return new List<Type>();
+ }
+
+ return ret.Where(r => r != null).ToList();
+ }
+
+ static void OnGeneratedCSProjectFiles(Type[] types)
+ {
+ var args = new object[0];
+ foreach (var type in types)
+ {
+ var method = type.GetMethod("OnGeneratedCSProjectFiles",
+ System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic |
+ System.Reflection.BindingFlags.Static);
+ if (method == null)
+ {
+ continue;
+ }
+
+ method.Invoke(null, args);
+ }
+ }
+
+ public static Type[] GetAssetPostprocessorTypes()
+ {
+ return TypeCache.GetTypesDerivedFrom<AssetPostprocessor>().ToArray(); // doesn't find types from EditorPlugin, which is fine
+ }
+
+ static bool OnPreGeneratingCSProjectFiles(Type[] types)
+ {
+ bool result = false;
+ foreach (var type in types)
+ {
+ var args = new object[0];
+ var method = type.GetMethod("OnPreGeneratingCSProjectFiles",
+ System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic |
+ System.Reflection.BindingFlags.Static);
+ if (method == null)
+ {
+ continue;
+ }
+
+ var returnValue = method.Invoke(null, args);
+ if (method.ReturnType == typeof(bool))
+ {
+ result |= (bool) returnValue;
+ }
+ }
+
+ return result;
+ }
+
+ static string OnGeneratedCSProject(string path, string content, Type[] types)
+ {
+ foreach (var type in types)
+ {
+ var args = new[] {path, content};
+ var method = type.GetMethod("OnGeneratedCSProject",
+ System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic |
+ System.Reflection.BindingFlags.Static);
+ if (method == null)
+ {
+ continue;
+ }
+
+ var returnValue = method.Invoke(null, args);
+ if (method.ReturnType == typeof(string))
+ {
+ content = (string) returnValue;
+ }
+ }
+
+ return content;
+ }
+
+ static string OnGeneratedSlnSolution(string path, string content, Type[] types)
+ {
+ foreach (var type in types)
+ {
+ var args = new[] {path, content};
+ var method = type.GetMethod("OnGeneratedSlnSolution",
+ System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic |
+ System.Reflection.BindingFlags.Static);
+ if (method == null)
+ {
+ continue;
+ }
+
+ var returnValue = method.Invoke(null, args);
+ if (method.ReturnType == typeof(string))
+ {
+ content = (string) returnValue;
+ }
+ }
+
+ return content;
+ }
+
+ void SyncFileIfNotChanged(string filename, string newContents)
+ {
+ try
+ {
+ if (m_FileIOProvider.Exists(filename) && newContents == m_FileIOProvider.ReadAllText(filename))
+ {
+ return;
+ }
+ }
+ catch (Exception exception)
+ {
+ Debug.LogException(exception);
+ }
+
+ m_FileIOProvider.WriteAllText(filename, newContents);
+ }
+
+ string ProjectText(Assembly assembly,
+ Dictionary<string, string> allAssetsProjectParts,
+ List<ResponseFileData> responseFilesData,
+ List<Assembly> allProjectIslands)
+ {
+ var projectBuilder = new StringBuilder(ProjectHeader(assembly, responseFilesData));
+ var references = new List<string>();
+ var projectReferences = new List<Match>();
+
+ foreach (string file in assembly.sourceFiles)
+ {
+ if (!ShouldFileBePartOfSolution(file))
+ continue;
+
+ var extension = Path.GetExtension(file).ToLower();
+ var fullFile = EscapedRelativePathFor(file);
+ if (".dll" != extension)
+ {
+ projectBuilder.Append(" <Compile Include=\"").Append(fullFile).Append("\" />").Append(Environment.NewLine);
+ }
+ else
+ {
+ references.Add(fullFile);
+ }
+ }
+
+ // Append additional non-script files that should be included in project generation.
+ if (allAssetsProjectParts.TryGetValue(assembly.name, out var additionalAssetsForProject))
+ projectBuilder.Append(additionalAssetsForProject);
+
+ var islandRefs = references.Union(assembly.allReferences);
+ foreach (string reference in islandRefs)
+ {
+ if (reference.EndsWith("/UnityEditor.dll", StringComparison.Ordinal)
+ || reference.EndsWith("/UnityEngine.dll", StringComparison.Ordinal)
+ || reference.EndsWith("\\UnityEditor.dll", StringComparison.Ordinal)
+ || reference.EndsWith("\\UnityEngine.dll", StringComparison.Ordinal))
+ continue;
+
+ var match = k_ScriptReferenceExpression.Match(reference);
+ if (match.Success)
+ {
+ // assume csharp language
+ // Add a reference to a project except if it's a reference to a script assembly
+ // that we are not generating a project for. This will be the case for assemblies
+ // coming from .assembly.json files in non-internalized packages.
+ var dllName = match.Groups["dllname"].Value;
+ if (allProjectIslands.Any(i => Path.GetFileName(i.outputPath) == dllName))
+ {
+ projectReferences.Add(match);
+ continue;
+ }
+ }
+
+ string fullReference = Path.IsPathRooted(reference) ? reference : Path.Combine(ProjectDirectory, reference);
+
+ AppendReference(fullReference, projectBuilder);
+ }
+
+ var responseRefs = responseFilesData.SelectMany(x => x.FullPathReferences.Select(r => r));
+ foreach (var reference in responseRefs)
+ {
+ AppendReference(reference, projectBuilder);
+ }
+
+ if (0 < projectReferences.Count)
+ {
+ projectBuilder.AppendLine(" </ItemGroup>");
+ projectBuilder.AppendLine(" <ItemGroup>");
+ foreach (Match reference in projectReferences)
+ {
+ var referencedProject = reference.Groups["project"].Value;
+
+ projectBuilder.Append(" <ProjectReference Include=\"").Append(referencedProject)
+ .Append(GetProjectExtension()).Append("\">").Append(Environment.NewLine);
+ projectBuilder
+ .Append(" <Project>{")
+ .Append(m_GUIDGenerator.ProjectGuid(m_ProjectName, reference.Groups["project"].Value))
+ .Append("}</Project>")
+ .Append(Environment.NewLine);
+ projectBuilder.Append(" <Name>").Append(referencedProject).Append("</Name>").Append(Environment.NewLine);
+ projectBuilder.AppendLine(" </ProjectReference>");
+ }
+ }
+
+ projectBuilder.Append(ProjectFooter());
+ return projectBuilder.ToString();
+ }
+
+ static void AppendReference(string fullReference, StringBuilder projectBuilder)
+ {
+ //replace \ with / and \\ with /
+ var escapedFullPath = SecurityElement.Escape(fullReference);
+ escapedFullPath = escapedFullPath.Replace("\\\\", "/").Replace("\\", "/");
+ projectBuilder.Append(" <Reference Include=\"").Append(FileSystemUtil.FileNameWithoutExtension(escapedFullPath))
+ .Append("\">").Append(Environment.NewLine);
+ projectBuilder.Append(" <HintPath>").Append(escapedFullPath).Append("</HintPath>").Append(Environment.NewLine);
+ projectBuilder.Append(" </Reference>").Append(Environment.NewLine);
+ }
+
+ public string ProjectFile(Assembly assembly)
+ {
+ return Path.Combine(ProjectDirectory, $"{assembly.name}.csproj");
+ }
+
+ public string SolutionFile()
+ {
+ return Path.Combine(ProjectDirectory, $"{m_ProjectName}.sln");
+ }
+
+ string ProjectHeader(
+ Assembly assembly,
+ List<ResponseFileData> responseFilesData
+ )
+ {
+ var otherResponseFilesData = GetOtherArgumentsFromResponseFilesData(responseFilesData);
+ var arguments = new object[]
+ {
+ k_ToolsVersion, k_ProductVersion, m_GUIDGenerator.ProjectGuid(m_ProjectName, assembly.name),
+ InternalEditorUtility.GetEngineAssemblyPath(),
+ InternalEditorUtility.GetEditorAssemblyPath(),
+ string.Join(";",
+ new[] {"DEBUG", "TRACE"}.Concat(EditorUserBuildSettings.activeScriptCompilationDefines).Concat(assembly.defines)
+ .Concat(responseFilesData.SelectMany(x => x.Defines)).Distinct().ToArray()),
+ MSBuildNamespaceUri,
+ assembly.name,
+ EditorSettings.projectGenerationRootNamespace,
+ k_TargetFrameworkVersion,
+ GenerateLangVersion(otherResponseFilesData["langversion"]),
+ k_BaseDirectory,
+ assembly.compilerOptions.AllowUnsafeCode | responseFilesData.Any(x => x.Unsafe),
+ GenerateNoWarn(otherResponseFilesData["nowarn"].Distinct().ToArray()),
+ GenerateAnalyserItemGroup(otherResponseFilesData["analyzer"].Concat(otherResponseFilesData["a"]).SelectMany(x=>x.Split(';')).Distinct().ToArray()),
+ GenerateAnalyserAdditionalFiles(otherResponseFilesData["additionalfile"].SelectMany(x=>x.Split(';')).Distinct().ToArray()),
+ GenerateAnalyserRuleSet(otherResponseFilesData["ruleset"].Distinct().ToArray()),
+ GenerateWarningLevel(otherResponseFilesData["warn"].Concat(otherResponseFilesData["w"]).Distinct()),
+ GenerateWarningAsError(otherResponseFilesData["warnaserror"]),
+ GenerateDocumentationFile(otherResponseFilesData["doc"])
+ };
+
+ try
+ {
+ return string.Format(GetProjectHeaderTemplate(), arguments);
+ }
+ catch (Exception)
+ {
+ throw new NotSupportedException(
+ "Failed creating c# project because the c# project header did not have the correct amount of arguments, which is " +
+ arguments.Length);
+ }
+ }
+
+ private string GenerateDocumentationFile(IEnumerable<string> paths)
+ {
+ if (!paths.Any())
+ return String.Empty;
+
+
+ return $"{Environment.NewLine}{string.Join(Environment.NewLine, paths.Select(a => $" <DocumentationFile>{a}</DocumentationFile>"))}";
+ }
+
+ private string GenerateWarningAsError(IEnumerable<string> enumerable)
+ {
+ string returnValue = String.Empty;
+ bool allWarningsAsErrors = false;
+ List<string> warningIds = new List<string>();
+
+ foreach (string s in enumerable)
+ {
+ if (s == "+") allWarningsAsErrors = true;
+ else if (s == "-") allWarningsAsErrors = false;
+ else
+ {
+ warningIds.Add(s);
+ }
+ }
+
+ returnValue += $@" <TreatWarningsAsErrors>{allWarningsAsErrors}</TreatWarningsAsErrors>";
+ if (warningIds.Any())
+ {
+ returnValue += $"{Environment.NewLine} <WarningsAsErrors>{string.Join(";", warningIds)}</WarningsAsErrors>";
+ }
+
+ return $"{Environment.NewLine}{returnValue}";
+ }
+
+ private string GenerateWarningLevel(IEnumerable<string> warningLevel)
+ {
+ var level = warningLevel.FirstOrDefault();
+ if (!string.IsNullOrWhiteSpace(level))
+ return level;
+
+ return 4.ToString();
+ }
+
+ static string GetSolutionText()
+ {
+ return string.Join(Environment.NewLine,
+ @"",
+ @"Microsoft Visual Studio Solution File, Format Version {0}",
+ @"# Visual Studio {1}",
+ @"{2}",
+ @"Global",
+ @" GlobalSection(SolutionConfigurationPlatforms) = preSolution",
+ @" Debug|Any CPU = Debug|Any CPU",
+ @" Release|Any CPU = Release|Any CPU",
+ @" EndGlobalSection",
+ @" GlobalSection(ProjectConfigurationPlatforms) = postSolution",
+ @"{3}",
+ @" EndGlobalSection",
+ @" GlobalSection(SolutionProperties) = preSolution",
+ @" HideSolutionNode = FALSE",
+ @" EndGlobalSection",
+ @"EndGlobal",
+ @"").Replace(" ", "\t");
+ }
+
+ static string GetProjectFooterTemplate()
+ {
+ return string.Join(Environment.NewLine,
+ @" </ItemGroup>",
+ @" <Import Project=""$(MSBuildToolsPath)\Microsoft.CSharp.targets"" />",
+ @" <!-- To modify your build process, add your task inside one of the targets below and uncomment it. ",
+ @" Other similar extension points exist, see Microsoft.Common.targets.",
+ @" <Target Name=""BeforeBuild"">",
+ @" </Target>",
+ @" <Target Name=""AfterBuild"">",
+ @" </Target>",
+ @" -->",
+ @"</Project>",
+ @"");
+ }
+
+ static string GetProjectHeaderTemplate()
+ {
+ var header = new[]
+ {
+ @"<?xml version=""1.0"" encoding=""utf-8""?>",
+ @"<Project ToolsVersion=""{0}"" DefaultTargets=""Build"" xmlns=""{6}"">",
+ @" <PropertyGroup>",
+ @" <LangVersion>{10}</LangVersion>",
+ @" <_TargetFrameworkDirectories>non_empty_path_generated_by_unity.rider.package</_TargetFrameworkDirectories>",
+ @" <_FullFrameworkReferenceAssemblyPaths>non_empty_path_generated_by_unity.rider.package</_FullFrameworkReferenceAssemblyPaths>",
+ @" <DisableHandlePackageFileConflicts>true</DisableHandlePackageFileConflicts>{16}",
+ @" </PropertyGroup>",
+ @" <PropertyGroup>",
+ @" <Configuration Condition="" '$(Configuration)' == '' "">Debug</Configuration>",
+ @" <Platform Condition="" '$(Platform)' == '' "">AnyCPU</Platform>",
+ @" <ProductVersion>{1}</ProductVersion>",
+ @" <SchemaVersion>2.0</SchemaVersion>",
+ @" <RootNamespace>{8}</RootNamespace>",
+ @" <ProjectGuid>{{{2}}}</ProjectGuid>",
+ @" <OutputType>Library</OutputType>",
+ @" <AppDesignerFolder>Properties</AppDesignerFolder>",
+ @" <AssemblyName>{7}</AssemblyName>",
+ @" <TargetFrameworkVersion>{9}</TargetFrameworkVersion>",
+ @" <FileAlignment>512</FileAlignment>",
+ @" <BaseDirectory>{11}</BaseDirectory>",
+ @" </PropertyGroup>",
+ @" <PropertyGroup Condition="" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "">",
+ @" <DebugSymbols>true</DebugSymbols>",
+ @" <DebugType>full</DebugType>",
+ @" <Optimize>false</Optimize>",
+ @" <OutputPath>Temp\bin\Debug\</OutputPath>",
+ @" <DefineConstants>{5}</DefineConstants>",
+ @" <ErrorReport>prompt</ErrorReport>",
+ @" <WarningLevel>{17}</WarningLevel>",
+ @" <NoWarn>0169{13}</NoWarn>",
+ @" <AllowUnsafeBlocks>{12}</AllowUnsafeBlocks>{18}{19}",
+ @" </PropertyGroup>",
+ @" <PropertyGroup Condition="" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "">",
+ @" <DebugType>pdbonly</DebugType>",
+ @" <Optimize>true</Optimize>",
+ @" <OutputPath>Temp\bin\Release\</OutputPath>",
+ @" <ErrorReport>prompt</ErrorReport>",
+ @" <WarningLevel>{17}</WarningLevel>",
+ @" <NoWarn>0169{13}</NoWarn>",
+ @" <AllowUnsafeBlocks>{12}</AllowUnsafeBlocks>{18}{19}",
+ @" </PropertyGroup>"
+ };
+
+ var forceExplicitReferences = new[]
+ {
+ @" <PropertyGroup>",
+ @" <NoConfig>true</NoConfig>",
+ @" <NoStdLib>true</NoStdLib>",
+ @" <AddAdditionalExplicitAssemblyReferences>false</AddAdditionalExplicitAssemblyReferences>",
+ @" <ImplicitlyExpandNETStandardFacades>false</ImplicitlyExpandNETStandardFacades>",
+ @" <ImplicitlyExpandDesignTimeFacades>false</ImplicitlyExpandDesignTimeFacades>",
+ @" </PropertyGroup>"
+ };
+
+ var itemGroupStart = new[]
+ {
+ @" <ItemGroup>"
+ };
+
+ var footer = new[]
+ {
+ @" <Reference Include=""UnityEngine"">",
+ @" <HintPath>{3}</HintPath>",
+ @" </Reference>",
+ @" <Reference Include=""UnityEditor"">",
+ @" <HintPath>{4}</HintPath>",
+ @" </Reference>",
+ @" </ItemGroup>{14}{15}",
+ @" <ItemGroup>",
+ @""
+ };
+
+ var pieces = header.Concat(forceExplicitReferences).Concat(itemGroupStart).Concat(footer).ToArray();
+ return string.Join(Environment.NewLine, pieces);
+ }
+
+ void SyncSolution(IEnumerable<Assembly> islands, Type[] types)
+ {
+ SyncSolutionFileIfNotChanged(SolutionFile(), SolutionText(islands), types);
+ }
+
+ string SolutionText(IEnumerable<Assembly> islands)
+ {
+ var fileversion = "11.00";
+ var vsversion = "2010";
+
+ var relevantIslands = RelevantIslandsForMode(islands);
+ string projectEntries = GetProjectEntries(relevantIslands);
+ string projectConfigurations = string.Join(Environment.NewLine,
+ relevantIslands.Select(i => GetProjectActiveConfigurations(m_GUIDGenerator.ProjectGuid(m_ProjectName, i.name))).ToArray());
+ return string.Format(GetSolutionText(), fileversion, vsversion, projectEntries, projectConfigurations);
+ }
+
+ private static string GenerateAnalyserItemGroup(string[] paths)
+ {
+ // <ItemGroup>
+ // <Analyzer Include="..\packages\Comments_analyser.1.0.6626.21356\analyzers\dotnet\cs\Comments_analyser.dll" />
+ // <Analyzer Include="..\packages\UnityEngineAnalyzer.1.0.0.0\analyzers\dotnet\cs\UnityEngineAnalyzer.dll" />
+ // </ItemGroup>
+ if (!paths.Any())
+ return string.Empty;
+
+ var analyserBuilder = new StringBuilder();
+ analyserBuilder.AppendLine(" <ItemGroup>");
+ foreach (var path in paths)
+ {
+ analyserBuilder.AppendLine($" <Analyzer Include=\"{path}\" />");
+ }
+ analyserBuilder.AppendLine(" </ItemGroup>");
+ return analyserBuilder.ToString();
+ }
+
+ private static ILookup<string, string> GetOtherArgumentsFromResponseFilesData(List<ResponseFileData> responseFilesData)
+ {
+ var paths = responseFilesData.SelectMany(x =>
+ {
+ return x.OtherArguments
+ .Where(a => a.StartsWith("/") || a.StartsWith("-"))
+ .Select(b =>
+ {
+ var index = b.IndexOf(":", StringComparison.Ordinal);
+ if (index > 0 && b.Length > index)
+ {
+ var key = b.Substring(1, index - 1);
+ return new KeyValuePair<string, string>(key, b.Substring(index + 1));
+ }
+
+ const string warnaserror = "warnaserror";
+ if (b.Substring(1).StartsWith(warnaserror))
+ {
+ return new KeyValuePair<string,string>(warnaserror, b.Substring(warnaserror.Length+ 1) );
+ }
+
+ return default;
+ });
+ })
+ .Distinct()
+ .ToLookup(o => o.Key, pair => pair.Value);
+ return paths;
+ }
+
+ private string GenerateLangVersion(IEnumerable<string> langVersionList)
+ {
+ var langVersion = langVersionList.FirstOrDefault();
+ if (!string.IsNullOrWhiteSpace(langVersion))
+ return langVersion;
+ return k_TargetLanguageVersion;
+ }
+
+ private static string GenerateAnalyserRuleSet(string[] paths)
+ {
+ //<CodeAnalysisRuleSet>..\path\to\myrules.ruleset</CodeAnalysisRuleSet>
+ if (!paths.Any())
+ return string.Empty;
+
+ return $"{Environment.NewLine}{string.Join(Environment.NewLine, paths.Select(a => $" <CodeAnalysisRuleSet>{a}</CodeAnalysisRuleSet>"))}";
+ }
+
+ private static string GenerateAnalyserAdditionalFiles(string[] paths)
+ {
+ if (!paths.Any())
+ return string.Empty;
+
+
+ var analyserBuilder = new StringBuilder();
+ analyserBuilder.AppendLine(" <ItemGroup>");
+ foreach (var path in paths)
+ {
+ analyserBuilder.AppendLine($" <AdditionalFiles Include=\"{path}\" />");
+ }
+ analyserBuilder.AppendLine(" </ItemGroup>");
+ return analyserBuilder.ToString();
+ }
+
+ private static string GenerateNoWarn(string[] codes)
+ {
+ if (!codes.Any())
+ return string.Empty;
+
+ return $",{string.Join(",", codes)}";
+ }
+
+ static IEnumerable<Assembly> RelevantIslandsForMode(IEnumerable<Assembly> islands)
+ {
+ IEnumerable<Assembly> relevantIslands = islands.Where(i => ScriptingLanguage.CSharp == ScriptingLanguageFor(i));
+ return relevantIslands;
+ }
+
+ /// <summary>
+ /// Get a Project("{guid}") = "MyProject", "MyProject.unityproj", "{projectguid}"
+ /// entry for each relevant language
+ /// </summary>
+ string GetProjectEntries(IEnumerable<Assembly> islands)
+ {
+ var projectEntries = islands.Select(i => string.Format(
+ m_SolutionProjectEntryTemplate,
+ m_GUIDGenerator.SolutionGuid(m_ProjectName, GetExtensionOfSourceFiles(i.sourceFiles)),
+ i.name,
+ Path.GetFileName(ProjectFile(i)),
+ m_GUIDGenerator.ProjectGuid(m_ProjectName, i.name)
+ ));
+
+ return string.Join(Environment.NewLine, projectEntries.ToArray());
+ }
+
+ /// <summary>
+ /// Generate the active configuration string for a given project guid
+ /// </summary>
+ string GetProjectActiveConfigurations(string projectGuid)
+ {
+ return string.Format(
+ m_SolutionProjectConfigurationTemplate,
+ projectGuid);
+ }
+
+ string EscapedRelativePathFor(string file)
+ {
+ var projectDir = ProjectDirectory.Replace('/', '\\');
+ file = file.Replace('/', '\\');
+ var path = SkipPathPrefix(file, projectDir);
+
+ var packageInfo = m_AssemblyNameProvider.FindForAssetPath(path.Replace('\\', '/'));
+ if (packageInfo != null)
+ {
+ // We have to normalize the path, because the PackageManagerRemapper assumes
+ // dir seperators will be os specific.
+ var absolutePath = Path.GetFullPath(NormalizePath(path)).Replace('/', '\\');
+ path = SkipPathPrefix(absolutePath, projectDir);
+ }
+
+ return SecurityElement.Escape(path);
+ }
+
+ static string SkipPathPrefix(string path, string prefix)
+ {
+ if (path.Replace("\\", "/").StartsWith($"{prefix}/"))
+ return path.Substring(prefix.Length + 1);
+ return path;
+ }
+
+ static string NormalizePath(string path)
+ {
+ if (Path.DirectorySeparatorChar == '\\')
+ return path.Replace('/', Path.DirectorySeparatorChar);
+ return path.Replace('\\', Path.DirectorySeparatorChar);
+ }
+
+ static string ProjectFooter()
+ {
+ return GetProjectFooterTemplate();
+ }
+
+ static string GetProjectExtension()
+ {
+ return ".csproj";
+ }
+ }
+
+ public static class SolutionGuidGenerator
+ {
+ public static string GuidForProject(string projectName)
+ {
+ return ComputeGuidHashFor(projectName + "salt");
+ }
+
+ public static string GuidForSolution(string projectName, string sourceFileExtension)
+ {
+ if (sourceFileExtension.ToLower() == "cs")
+ // GUID for a C# class library: http://www.codeproject.com/Reference/720512/List-of-Visual-Studio-Project-Type-GUIDs
+ return "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC";
+
+ return ComputeGuidHashFor(projectName);
+ }
+
+ static string ComputeGuidHashFor(string input)
+ {
+ var hash = MD5.Create().ComputeHash(Encoding.Default.GetBytes(input));
+ return HashAsGuid(HashToString(hash));
+ }
+
+ static string HashAsGuid(string hash)
+ {
+ var guid = hash.Substring(0, 8) + "-" + hash.Substring(8, 4) + "-" + hash.Substring(12, 4) + "-" +
+ hash.Substring(16, 4) + "-" + hash.Substring(20, 12);
+ return guid.ToUpper();
+ }
+
+ static string HashToString(byte[] bs)
+ {
+ var sb = new StringBuilder();
+ foreach (byte b in bs)
+ sb.Append(b.ToString("x2"));
+ return sb.ToString();
+ }
+ }
+}
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs.meta
new file mode 100644
index 0000000..182b400
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 7078f19173ceac84fb9e29b9f6175201
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs
new file mode 100644
index 0000000..f64ee8d
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs
@@ -0,0 +1,38 @@
+using System;
+using System.IO;
+using UnityEngine;
+using Debug = UnityEngine.Debug;
+
+namespace Packages.Rider.Editor
+{
+ internal class RiderInitializer
+ {
+ public void Initialize(string editorPath)
+ {
+ var assembly = EditorPluginInterop.EditorPluginAssembly;
+ if (EditorPluginInterop.EditorPluginIsLoadedFromAssets(assembly))
+ {
+ Debug.LogError($"Please delete {assembly.Location}. Unity 2019.2+ loads it directly from Rider installation. To disable this, open Rider's settings, search and uncheck 'Automatically install and update Rider's Unity editor plugin'.");
+ return;
+ }
+
+ var dllName = "JetBrains.Rider.Unity.Editor.Plugin.Full.Repacked.dll";
+ var relPath = "../../plugins/rider-unity/EditorPlugin";
+ if (SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX)
+ relPath = "Contents/plugins/rider-unity/EditorPlugin";
+ var dllFile = new FileInfo(Path.Combine(Path.Combine(editorPath, relPath), dllName));
+
+ if (dllFile.Exists)
+ {
+ var bytes = File.ReadAllBytes(dllFile.FullName);
+ assembly = AppDomain.CurrentDomain.Load(bytes); // doesn't lock assembly on disk
+ // assembly = AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(dllFile.FullName)); // use this for external source debug
+ EditorPluginInterop.InitEntryPoint(assembly);
+ }
+ else
+ {
+ Debug.Log($"Unable to find Rider EditorPlugin {dllFile.FullName} for Unity ");
+ }
+ }
+ }
+}
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs.meta
new file mode 100644
index 0000000..b37687a
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f5a0cc9645f0e2d4fb816156dcf3f4dd
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs
new file mode 100644
index 0000000..c53c6b1
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs
@@ -0,0 +1,404 @@
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using Packages.Rider.Editor.Util;
+using Unity.CodeEditor;
+using UnityEditor;
+using UnityEngine;
+using Debug = UnityEngine.Debug;
+
+namespace Packages.Rider.Editor
+{
+ [InitializeOnLoad]
+ public class RiderScriptEditor : IExternalCodeEditor
+ {
+ IDiscovery m_Discoverability;
+ IGenerator m_ProjectGeneration;
+ RiderInitializer m_Initiliazer = new RiderInitializer();
+
+ static RiderScriptEditor()
+ {
+ try
+ {
+ var projectGeneration = new ProjectGeneration();
+ var editor = new RiderScriptEditor(new Discovery(), projectGeneration);
+ CodeEditor.Register(editor);
+ var path = GetEditorRealPath(CodeEditor.CurrentEditorInstallation);
+
+ if (IsRiderInstallation(path))
+ {
+ if (!RiderScriptEditorData.instance.InitializedOnce)
+ {
+ var installations = editor.Installations;
+ // is toolbox and outdated - update
+ if (installations.Any() && RiderPathLocator.IsToolbox(path) && installations.All(a => a.Path != path))
+ {
+ var toolboxInstallations = installations.Where(a => a.Name.Contains("(JetBrains Toolbox)")).ToArray();
+ if (toolboxInstallations.Any())
+ {
+ var newEditor = toolboxInstallations.Last().Path;
+ CodeEditor.SetExternalScriptEditor(newEditor);
+ path = newEditor;
+ }
+ else
+ {
+ var newEditor = installations.Last().Path;
+ CodeEditor.SetExternalScriptEditor(newEditor);
+ path = newEditor;
+ }
+ }
+
+ // exists, is non toolbox and outdated - notify
+ if (installations.Any() && FileSystemUtil.EditorPathExists(path) && installations.All(a => a.Path != path))
+ {
+ var newEditorName = installations.Last().Name;
+ Debug.LogWarning($"Consider updating External Editor in Unity to Rider {newEditorName}.");
+ }
+
+ ShowWarningOnUnexpectedScriptEditor(path);
+ RiderScriptEditorData.instance.InitializedOnce = true;
+ }
+
+ if (!FileSystemUtil.EditorPathExists(path)) // previously used rider was removed
+ {
+ var installations = editor.Installations;
+ if (installations.Any())
+ {
+ var newEditor = installations.Last().Path;
+ CodeEditor.SetExternalScriptEditor(newEditor);
+ path = newEditor;
+ }
+ }
+ RiderScriptEditorData.instance.Init();
+
+ editor.CreateSolutionIfDoesntExist();
+ if (RiderScriptEditorData.instance.shouldLoadEditorPlugin)
+ {
+ editor.m_Initiliazer.Initialize(path);
+ }
+
+ InitProjectFilesWatcher();
+ }
+ }
+ catch (Exception e)
+ {
+ Debug.LogException(e);
+ }
+ }
+
+ private static void ShowWarningOnUnexpectedScriptEditor(string path)
+ {
+ // Show warning, when Unity was started from Rider, but external editor is different https://github.com/JetBrains/resharper-unity/issues/1127
+ var args = Environment.GetCommandLineArgs();
+ var commandlineParser = new CommandLineParser(args);
+ if (commandlineParser.Options.ContainsKey("-riderPath"))
+ {
+ var originRiderPath = commandlineParser.Options["-riderPath"];
+ var originRealPath = GetEditorRealPath(originRiderPath);
+ var originVersion = RiderPathLocator.GetBuildNumber(originRealPath);
+ var version = RiderPathLocator.GetBuildNumber(path);
+ if (originVersion != string.Empty && originVersion != version)
+ {
+ Debug.LogWarning("Unity was started by a version of Rider that is not the current default external editor. Advanced integration features cannot be enabled.");
+ Debug.Log($"Unity was started by Rider {originVersion}, but external editor is set to: {path}");
+ }
+ }
+ }
+
+ private static void InitProjectFilesWatcher()
+ {
+ var watcher = new FileSystemWatcher();
+ watcher.Path = Directory.GetCurrentDirectory();
+ watcher.NotifyFilter = NotifyFilters.LastWrite; //Watch for changes in LastWrite times
+ watcher.Filter = "*.*";
+
+ // Add event handlers.
+ watcher.Changed += OnChanged;
+ watcher.Created += OnChanged;
+
+ watcher.EnableRaisingEvents = true; // Begin watching.
+
+ AppDomain.CurrentDomain.DomainUnload += (EventHandler) ((_, __) =>
+ {
+ watcher.Dispose();
+ });
+ }
+
+ private static void OnChanged(object sender, FileSystemEventArgs e)
+ {
+ var extension = Path.GetExtension(e.FullPath);
+ if (extension == ".sln" || extension == ".csproj")
+ RiderScriptEditorData.instance.HasChanges = true;
+ }
+
+ internal static string GetEditorRealPath(string path)
+ {
+ if (string.IsNullOrEmpty(path))
+ {
+ return path;
+ }
+
+ if (!FileSystemUtil.EditorPathExists(path))
+ return path;
+
+ if (SystemInfo.operatingSystemFamily != OperatingSystemFamily.Windows)
+ {
+ var realPath = FileSystemUtil.GetFinalPathName(path);
+
+ // case of snap installation
+ if (SystemInfo.operatingSystemFamily == OperatingSystemFamily.Linux)
+ {
+ if (new FileInfo(path).Name.ToLowerInvariant() == "rider" &&
+ new FileInfo(realPath).Name.ToLowerInvariant() == "snap")
+ {
+ var snapInstallPath = "/snap/rider/current/bin/rider.sh";
+ if (new FileInfo(snapInstallPath).Exists)
+ return snapInstallPath;
+ }
+ }
+
+ // in case of symlink
+ return realPath;
+ }
+
+ return path;
+ }
+
+ const string unity_generate_all = "unity_generate_all_csproj";
+
+ public RiderScriptEditor(IDiscovery discovery, IGenerator projectGeneration)
+ {
+ m_Discoverability = discovery;
+ m_ProjectGeneration = projectGeneration;
+ }
+
+ private static string[] defaultExtensions
+ {
+ get
+ {
+ var customExtensions = new[] {"json", "asmdef", "log", "xaml"};
+ return EditorSettings.projectGenerationBuiltinExtensions.Concat(EditorSettings.projectGenerationUserExtensions)
+ .Concat(customExtensions).Distinct().ToArray();
+ }
+ }
+
+ private static string[] HandledExtensions
+ {
+ get
+ {
+ return HandledExtensionsString.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries).Select(s => s.TrimStart('.', '*'))
+ .ToArray();
+ }
+ }
+
+ private static string HandledExtensionsString
+ {
+ get { return EditorPrefs.GetString("Rider_UserExtensions", string.Join(";", defaultExtensions));}
+ set { EditorPrefs.SetString("Rider_UserExtensions", value); }
+ }
+
+ private static bool SupportsExtension(string path)
+ {
+ var extension = Path.GetExtension(path);
+ if (string.IsNullOrEmpty(extension))
+ return false;
+ return HandledExtensions.Contains(extension.TrimStart('.'));
+ }
+
+ public void OnGUI()
+ {
+ var prevGenerate = EditorPrefs.GetBool(unity_generate_all, false);
+ var generateAll = EditorGUILayout.Toggle("Generate all .csproj files.", prevGenerate);
+ if (generateAll != prevGenerate)
+ {
+ EditorPrefs.SetBool(unity_generate_all, generateAll);
+ }
+
+ m_ProjectGeneration.GenerateAll(generateAll);
+
+ if (RiderScriptEditorData.instance.shouldLoadEditorPlugin)
+ {
+ HandledExtensionsString = EditorGUILayout.TextField(new GUIContent("Extensions handled: "), HandledExtensionsString);
+ }
+ }
+
+ public void SyncIfNeeded(string[] addedFiles, string[] deletedFiles, string[] movedFiles, string[] movedFromFiles,
+ string[] importedFiles)
+ {
+ m_ProjectGeneration.SyncIfNeeded(addedFiles.Union(deletedFiles).Union(movedFiles).Union(movedFromFiles),
+ importedFiles);
+ }
+
+ public void SyncAll()
+ {
+ AssetDatabase.Refresh();
+ if (RiderScriptEditorData.instance.HasChanges)
+ {
+ m_ProjectGeneration.Sync();
+ RiderScriptEditorData.instance.HasChanges = false;
+ }
+ }
+
+ public void Initialize(string editorInstallationPath) // is called each time ExternalEditor is changed
+ {
+ RiderScriptEditorData.instance.Invalidate(editorInstallationPath);
+ m_ProjectGeneration.Sync(); // regenerate csproj and sln for new editor
+ }
+
+ public bool OpenProject(string path, int line, int column)
+ {
+ if (path != "" && !SupportsExtension(path)) // Assets - Open C# Project passes empty path here
+ {
+ return false;
+ }
+
+ if (path == "" && SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX)
+ {
+ // there is a bug in DllImplementation - use package implementation here instead https://github.cds.internal.unity3d.com/unity/com.unity.ide.rider/issues/21
+ return OpenOSXApp(path, line, column);
+ }
+
+ if (!IsUnityScript(path))
+ {
+ var fastOpenResult = EditorPluginInterop.OpenFileDllImplementation(path, line, column);
+ if (fastOpenResult)
+ return true;
+ }
+
+ if (SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX)
+ {
+ return OpenOSXApp(path, line, column);
+ }
+
+ var solution = GetSolutionFile(path); // TODO: If solution file doesn't exist resync.
+ solution = solution == "" ? "" : $"\"{solution}\"";
+ var process = new Process
+ {
+ StartInfo = new ProcessStartInfo
+ {
+ FileName = CodeEditor.CurrentEditorInstallation,
+ Arguments = $"{solution} -l {line} \"{path}\"",
+ UseShellExecute = true,
+ }
+ };
+
+ process.Start();
+
+ return true;
+ }
+
+ private bool OpenOSXApp(string path, int line, int column)
+ {
+ var solution = GetSolutionFile(path); // TODO: If solution file doesn't exist resync.
+ solution = solution == "" ? "" : $"\"{solution}\"";
+ var pathArguments = path == "" ? "" : $"-l {line} \"{path}\"";
+ var process = new Process
+ {
+ StartInfo = new ProcessStartInfo
+ {
+ FileName = "open",
+ Arguments = $"-n \"{CodeEditor.CurrentEditorInstallation}\" --args {solution} {pathArguments}",
+ CreateNoWindow = true,
+ UseShellExecute = true,
+ }
+ };
+
+ process.Start();
+
+ return true;
+ }
+
+ private string GetSolutionFile(string path)
+ {
+ if (IsUnityScript(path))
+ {
+ return Path.Combine(GetBaseUnityDeveloperFolder(), "Projects/CSharp/Unity.CSharpProjects.gen.sln");
+ }
+
+ var solutionFile = m_ProjectGeneration.SolutionFile();
+ if (File.Exists(solutionFile))
+ {
+ return solutionFile;
+ }
+
+ return "";
+ }
+
+ static bool IsUnityScript(string path)
+ {
+ if (UnityEditor.Unsupported.IsDeveloperBuild())
+ {
+ var baseFolder = GetBaseUnityDeveloperFolder().Replace("\\", "/");
+ var lowerPath = path.ToLowerInvariant().Replace("\\", "/");
+
+ if (lowerPath.Contains((baseFolder + "/Runtime").ToLowerInvariant())
+ || lowerPath.Contains((baseFolder + "/Editor").ToLowerInvariant()))
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ static string GetBaseUnityDeveloperFolder()
+ {
+ return Directory.GetParent(EditorApplication.applicationPath).Parent.Parent.FullName;
+ }
+
+ public bool TryGetInstallationForPath(string editorPath, out CodeEditor.Installation installation)
+ {
+ if (FileSystemUtil.EditorPathExists(editorPath) && IsRiderInstallation(editorPath))
+ {
+ var info = new RiderPathLocator.RiderInfo(editorPath, false);
+ installation = new CodeEditor.Installation
+ {
+ Name = info.Presentation,
+ Path = info.Path
+ };
+ return true;
+ }
+
+ installation = default;
+ return false;
+ }
+
+ public static bool IsRiderInstallation(string path)
+ {
+ if (IsAssetImportWorkerProcess())
+ return false;
+
+ if (string.IsNullOrEmpty(path))
+ {
+ return false;
+ }
+
+ var fileInfo = new FileInfo(path);
+ var filename = fileInfo.Name.ToLowerInvariant();
+ return filename.StartsWith("rider", StringComparison.Ordinal);
+ }
+
+ private static bool IsAssetImportWorkerProcess()
+ {
+#if UNITY_2019_3_OR_NEWER
+ return UnityEditor.Experimental.AssetDatabaseExperimental.IsAssetImportWorkerProcess();
+#else
+ return false;
+#endif
+ }
+
+ public static string CurrentEditor // works fast, doesn't validate if executable really exists
+ => EditorPrefs.GetString("kScriptsDefaultApp");
+
+ public CodeEditor.Installation[] Installations => m_Discoverability.PathCallback();
+
+ public void CreateSolutionIfDoesntExist()
+ {
+ if (!m_ProjectGeneration.HasSolutionBeenGenerated())
+ {
+ m_ProjectGeneration.Sync();
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs.meta
new file mode 100644
index 0000000..ca34793
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c4095d72f77fbb64ea39b8b3ca246622
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs
new file mode 100644
index 0000000..47c7781
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs
@@ -0,0 +1,29 @@
+using System;
+using UnityEditor;
+using UnityEngine;
+
+namespace Packages.Rider.Editor
+{
+ public class RiderScriptEditorData : ScriptableSingleton<RiderScriptEditorData>
+ {
+ [SerializeField] internal bool HasChanges = true; // sln/csproj files were changed
+ [SerializeField] internal bool shouldLoadEditorPlugin;
+ [SerializeField] internal bool InitializedOnce;
+ [SerializeField] internal string currentEditorVersion;
+
+ public void Init()
+ {
+ if (string.IsNullOrEmpty(currentEditorVersion))
+ Invalidate(RiderScriptEditor.CurrentEditor);
+ }
+
+ public void Invalidate(string editorInstallationPath)
+ {
+ currentEditorVersion = RiderPathLocator.GetBuildNumber(editorInstallationPath);
+ if (!Version.TryParse(currentEditorVersion, out var version))
+ shouldLoadEditorPlugin = false;
+
+ shouldLoadEditorPlugin = version >= new Version("191.7141.156");
+ }
+ }
+} \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs.meta
new file mode 100644
index 0000000..e09363c
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f079e3afd077fb94fa2bda74d6409499
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting.meta
new file mode 100644
index 0000000..4362802
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a52391bc44c477f40a547ed4ef3b9560
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs
new file mode 100644
index 0000000..99232f6
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using JetBrains.Annotations;
+using UnityEditor;
+
+namespace Packages.Rider.Editor.UnitTesting
+{
+ public class CallbackData : ScriptableSingleton<CallbackData>
+ {
+ public bool isRider;
+
+ [UsedImplicitly] public static event EventHandler Changed = (sender, args) => { };
+
+ internal void RaiseChangedEvent()
+ {
+ Changed(null, EventArgs.Empty);
+ }
+
+ public List<TestEvent> events = new List<TestEvent>();
+
+ [UsedImplicitly]
+ public void Clear()
+ {
+ events.Clear();
+ }
+ }
+} \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs.meta
new file mode 100644
index 0000000..c58daeb
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 010246a07de7cb34185a2a7b1c1fad59
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs
new file mode 100644
index 0000000..f9dc5b9
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs
@@ -0,0 +1,18 @@
+#if TEST_FRAMEWORK
+using UnityEditor;
+using UnityEditor.TestTools.TestRunner.Api;
+using UnityEngine;
+
+namespace Packages.Rider.Editor.UnitTesting
+{
+ [InitializeOnLoad]
+ internal static class CallbackInitializer
+ {
+ static CallbackInitializer()
+ {
+ if (CallbackData.instance.isRider)
+ ScriptableObject.CreateInstance<TestRunnerApi>().RegisterCallbacks(ScriptableObject.CreateInstance<TestsCallback>(), 0);
+ }
+ }
+}
+#endif \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs.meta
new file mode 100644
index 0000000..11042d6
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: aa1c6b1a353ab464782fc1e7c051eb02
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs
new file mode 100644
index 0000000..eb3b249
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs
@@ -0,0 +1,47 @@
+using JetBrains.Annotations;
+using UnityEngine;
+#if TEST_FRAMEWORK
+using UnityEditor;
+using UnityEditor.TestTools.TestRunner.Api;
+#endif
+
+namespace Packages.Rider.Editor.UnitTesting
+{
+ public static class RiderTestRunner
+ {
+#if TEST_FRAMEWORK
+ private static readonly TestsCallback Callback = ScriptableObject.CreateInstance<TestsCallback>();
+#endif
+ [UsedImplicitly]
+ public static void RunTests(int testMode, string[] assemblyNames, string[] testNames, string[] categoryNames, string[] groupNames, int? buildTarget)
+ {
+#if !TEST_FRAMEWORK
+ Debug.LogError("Update Test Framework package to v.1.1.1+ to run tests from Rider.");
+#else
+ CallbackData.instance.isRider = true;
+
+ var api = ScriptableObject.CreateInstance<TestRunnerApi>();
+ var settings = new ExecutionSettings();
+ var filter = new Filter
+ {
+ assemblyNames = assemblyNames,
+ testNames = testNames,
+ categoryNames = categoryNames,
+ groupNames = groupNames,
+ targetPlatform = (BuildTarget?) buildTarget
+ };
+
+ if (testMode > 0) // for future use - test-framework would allow running both Edit and Play test at once
+ filter.testMode = (TestMode) testMode;
+
+ settings.filters = new []{
+ filter
+ };
+ api.Execute(settings);
+
+ api.UnregisterCallbacks(Callback); // avoid multiple registrations
+ api.RegisterCallbacks(Callback); // This can be used to receive information about when the test suite and individual tests starts and stops. Provide this with a scriptable object implementing ICallbacks
+#endif
+ }
+ }
+} \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs.meta
new file mode 100644
index 0000000..8ec5502
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 5c3b27069cb3ddf42ba1260eeefcdd1c
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs
new file mode 100644
index 0000000..9e3fff2
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs
@@ -0,0 +1,31 @@
+using System;
+using NUnit.Framework.Interfaces;
+
+namespace Packages.Rider.Editor.UnitTesting
+{
+ [Serializable]
+ public enum EventType { TestStarted, TestFinished, RunFinished }
+
+ [Serializable]
+ public class TestEvent
+ {
+ public EventType type;
+ public string id;
+ public string assemblyName;
+ public string output;
+ public TestStatus testStatus;
+ public double duration;
+ public string parentId;
+
+ public TestEvent(EventType type, string id, string assemblyName, string output, double duration, TestStatus testStatus, string parentID)
+ {
+ this.type = type;
+ this.id = id;
+ this.assemblyName = assemblyName;
+ this.output = output;
+ this.testStatus = testStatus;
+ this.duration = duration;
+ parentId = parentID;
+ }
+ }
+} \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs.meta
new file mode 100644
index 0000000..a6afa14
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f9413c47b3a14a64e8810ce76d1a6032
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs
new file mode 100644
index 0000000..b6a5637
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs
@@ -0,0 +1,83 @@
+#if TEST_FRAMEWORK
+using System;
+using System.Text;
+using UnityEditor.TestTools.TestRunner.Api;
+using UnityEngine;
+
+namespace Packages.Rider.Editor.UnitTesting
+{
+ public class TestsCallback : ScriptableObject, ICallbacks
+ {
+ public void RunFinished(ITestResultAdaptor result)
+ {
+ CallbackData.instance.isRider = false;
+
+ CallbackData.instance.events.Add(
+ new TestEvent(EventType.RunFinished, "", "","", 0, ParseTestStatus(result.TestStatus), ""));
+ CallbackData.instance.RaiseChangedEvent();
+ }
+
+ public void TestStarted(ITestAdaptor result)
+ {
+ if (result.Method == null) return;
+
+ CallbackData.instance.events.Add(
+ new TestEvent(EventType.TestStarted, GetUniqueName(result), result.Method.TypeInfo.Assembly.GetName().Name, "", 0, ParseTestStatus(TestStatus.Passed), result.ParentFullName));
+ CallbackData.instance.RaiseChangedEvent();
+ }
+
+ public void TestFinished(ITestResultAdaptor result)
+ {
+ if (result.Test.Method == null) return;
+
+ CallbackData.instance.events.Add(
+ new TestEvent(EventType.TestFinished, GetUniqueName(result.Test), result.Test.Method.TypeInfo.Assembly.GetName().Name, ExtractOutput(result), result.Duration, ParseTestStatus(result.TestStatus), result.Test.ParentFullName));
+ CallbackData.instance.RaiseChangedEvent();
+ }
+
+ // todo: reimplement JetBrains.Rider.Unity.Editor.AfterUnity56.UnitTesting.TestEventsSender.GetUniqueName
+ private static string GetUniqueName(ITestAdaptor test)
+ {
+ string str = test.FullName;
+ return str;
+ }
+
+ public void RunStarted(ITestAdaptor testsToRun)
+ {
+ }
+
+ private static NUnit.Framework.Interfaces.TestStatus ParseTestStatus(TestStatus testStatus)
+ {
+ return (NUnit.Framework.Interfaces.TestStatus)Enum.Parse(typeof(NUnit.Framework.Interfaces.TestStatus), testStatus.ToString());
+ }
+
+ private static string ExtractOutput(ITestResultAdaptor testResult)
+ {
+ var stringBuilder = new StringBuilder();
+ if (testResult.Message != null)
+ {
+ stringBuilder.AppendLine("Message: ");
+ stringBuilder.AppendLine(testResult.Message);
+ }
+
+ if (!string.IsNullOrEmpty(testResult.Output))
+ {
+ stringBuilder.AppendLine("Output: ");
+ stringBuilder.AppendLine(testResult.Output);
+ }
+
+ if (!string.IsNullOrEmpty(testResult.StackTrace))
+ {
+ stringBuilder.AppendLine("Stacktrace: ");
+ stringBuilder.AppendLine(testResult.StackTrace);
+ }
+
+ var result = stringBuilder.ToString();
+ if (result.Length > 0)
+ return result;
+
+ return testResult.Output ?? string.Empty;
+ }
+ }
+}
+#endif \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs.meta
new file mode 100644
index 0000000..345e1ce
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 58aa570dbe0761f43b25ff6c2265bbe2
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util.meta
new file mode 100644
index 0000000..f801d0b
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5e726086cd652f82087d59d67d2c24cd
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs
new file mode 100644
index 0000000..4d4d3c9
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs
@@ -0,0 +1,36 @@
+using System.Collections.Generic;
+
+namespace Packages.Rider.Editor.Util
+{
+ public class CommandLineParser
+ {
+ public Dictionary<string, string> Options = new Dictionary<string, string>();
+
+ public CommandLineParser(string[] args)
+ {
+ var i = 0;
+ while (i < args.Length)
+ {
+ var arg = args[i];
+ if (!arg.StartsWith("-"))
+ {
+ i++;
+ continue;
+ }
+
+ string value = null;
+ if (i + 1 < args.Length && !args[i + 1].StartsWith("-"))
+ {
+ value = args[i + 1];
+ i++;
+ }
+
+ if (!(Options.ContainsKey(arg)))
+ {
+ Options.Add(arg, value);
+ }
+ i++;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs.meta
new file mode 100644
index 0000000..409ea02
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 154ace4bd16de9f4e84052ac257786d6
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs
new file mode 100644
index 0000000..1ee32cc
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs
@@ -0,0 +1,66 @@
+using System;
+using System.ComponentModel;
+using System.IO;
+using System.Text;
+using JetBrains.Annotations;
+using UnityEngine;
+
+namespace Packages.Rider.Editor.Util
+{
+ public static class FileSystemUtil
+ {
+ [NotNull]
+ public static string GetFinalPathName([NotNull] string path)
+ {
+ if (path == null) throw new ArgumentNullException("path");
+
+ // up to MAX_PATH. MAX_PATH on Linux currently 4096, on Mac OS X 1024
+ // doc: http://man7.org/linux/man-pages/man3/realpath.3.html
+ var sb = new StringBuilder(8192);
+ var result = LibcNativeInterop.realpath(path, sb);
+ if (result == IntPtr.Zero)
+ {
+ throw new Win32Exception($"{path} was not resolved.");
+ }
+
+ return new FileInfo(sb.ToString()).FullName;
+ }
+
+ public static string FileNameWithoutExtension(string path)
+ {
+ if (string.IsNullOrEmpty(path))
+ {
+ return "";
+ }
+
+ var indexOfDot = -1;
+ var indexOfSlash = 0;
+ for (var i = path.Length - 1; i >= 0; i--)
+ {
+ if (indexOfDot == -1 && path[i] == '.')
+ {
+ indexOfDot = i;
+ }
+
+ if (indexOfSlash == 0 && path[i] == '/' || path[i] == '\\')
+ {
+ indexOfSlash = i + 1;
+ break;
+ }
+ }
+
+ if (indexOfDot == -1)
+ {
+ indexOfDot = path.Length;
+ }
+
+ return path.Substring(indexOfSlash, indexOfDot - indexOfSlash);
+ }
+
+ public static bool EditorPathExists(string editorPath)
+ {
+ return SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX && new DirectoryInfo(editorPath).Exists
+ || SystemInfo.operatingSystemFamily != OperatingSystemFamily.MacOSX && new FileInfo(editorPath).Exists;
+ }
+ }
+} \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs.meta
new file mode 100644
index 0000000..caac41a
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: bdbd564a9fdad0b738e76d030cad1204
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs
new file mode 100644
index 0000000..5f023f9
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace Packages.Rider.Editor.Util
+{
+ internal static class LibcNativeInterop
+ {
+ [DllImport("libc", SetLastError = true)]
+ public static extern IntPtr realpath(string path, StringBuilder resolved_path);
+ }
+} \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs.meta
new file mode 100644
index 0000000..21b229d
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 071c17858dc6c47ada7b2a1f1ded5402
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs
new file mode 100644
index 0000000..1909342
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs
@@ -0,0 +1,25 @@
+using JetBrains.Annotations;
+using Packages.Rider.Editor;
+using Unity.CodeEditor;
+
+// Is called via commandline from Rider Notification after checking out from source control.
+
+// ReSharper disable once CheckNamespace
+namespace JetBrains.Rider.Unity.Editor
+{
+ public static class RiderMenu
+ {
+ [UsedImplicitly]
+ public static void MenuOpenProject()
+ {
+ if (RiderScriptEditor.IsRiderInstallation(RiderScriptEditor.CurrentEditor))
+ {
+ // Force the project files to be sync
+ CodeEditor.CurrentEditor.SyncAll();
+
+ // Load Project
+ CodeEditor.CurrentEditor.OpenProject();
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs.meta
new file mode 100644
index 0000000..ab43887
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a8860c53ca4073d4f92c403e709c12ba
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs
new file mode 100644
index 0000000..de03492
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Linq;
+using UnityEngine;
+
+namespace Packages.Rider.Editor.Util
+{
+ public static class UnityUtils
+ {
+ internal static readonly string UnityApplicationVersion = Application.unityVersion;
+
+ public static Version UnityVersion
+ {
+ get
+ {
+ var ver = UnityApplicationVersion.Split(".".ToCharArray()).Take(2).Aggregate((a, b) => a + "." + b);
+ return new Version(ver);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs.meta
new file mode 100644
index 0000000..fe2ac7b
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3ec9edad2de6c4df3a146b543a0fbc4c
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef
new file mode 100644
index 0000000..ad87d48
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef
@@ -0,0 +1,22 @@
+{
+ "name": "Unity.Rider.Editor",
+ "references": [
+ "GUID:0acc523941302664db1f4e527237feb3"
+ ],
+ "includePlatforms": [
+ "Editor"
+ ],
+ "excludePlatforms": [],
+ "allowUnsafeCode": false,
+ "overrideReferences": false,
+ "precompiledReferences": [],
+ "autoReferenced": true,
+ "defineConstraints": [],
+ "versionDefines": [
+ {
+ "name": "com.unity.test-framework",
+ "expression": "1.1.1",
+ "define": "TEST_FRAMEWORK"
+ }
+ ]
+} \ No newline at end of file
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef.meta
new file mode 100644
index 0000000..2e67d0c
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d528c8c98d269ca44a06cd9624a03945
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json b/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json
new file mode 100755
index 0000000..7159e5f
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "com.unity.ide.rider",
+ "displayName": "Rider Editor",
+ "description": "Code editor integration for supporting Rider as code editor for unity. Adds support for generating csproj files for code completion, auto discovery of installations, etc.",
+ "version": "1.1.4",
+ "unity": "2019.2",
+ "unityRelease": "0a12",
+ "dependencies": {
+ "com.unity.test-framework": "1.1.3"
+ },
+ "relatedPackages": {
+ "com.unity.ide.rider.tests": "1.1.4"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git@github.cds.internal.unity3d.com:unity/com.unity.ide.rider.git",
+ "revision": "d2ef95989104a4ce866cdcb7f94cf3c67476fcc9"
+ }
+}
diff --git a/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json.meta b/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json.meta
new file mode 100644
index 0000000..6f72a9c
--- /dev/null
+++ b/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 66c95bb3c74257f41bae2622511dc02d
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant: