151 lines
5.1 KiB
C#
151 lines
5.1 KiB
C#
|
using System;
|
||
|
using System.IO;
|
||
|
using System.Linq;
|
||
|
using System.Reflection;
|
||
|
using System.Runtime.CompilerServices;
|
||
|
using Debug = UnityEngine.Debug;
|
||
|
|
||
|
namespace Packages.Rider.Editor
|
||
|
{
|
||
|
internal static class EditorPluginInterop
|
||
|
{
|
||
|
private static string EditorPluginAssemblyNamePrefix = "JetBrains.Rider.Unity.Editor.Plugin.";
|
||
|
public static readonly string EditorPluginAssemblyName = $"{EditorPluginAssemblyNamePrefix}Net46.Repacked";
|
||
|
public static readonly string EditorPluginAssemblyNameFallback = $"{EditorPluginAssemblyNamePrefix}Full.Repacked";
|
||
|
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 =>
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
return a.GetName().Name.StartsWith(EditorPluginAssemblyNamePrefix); // some user assemblies may fail here
|
||
|
}
|
||
|
catch (Exception)
|
||
|
{
|
||
|
// ignored
|
||
|
}
|
||
|
|
||
|
return default;
|
||
|
});
|
||
|
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
|
||
|
{
|
||
|
var version = RiderScriptEditorData.instance.editorBuildNumber;
|
||
|
if (version != null)
|
||
|
{
|
||
|
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);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|