diff --git a/Packages/com.coffee.upm-git-extension/Editor/Scripts/AvailableVersions.cs b/Packages/com.coffee.upm-git-extension/Editor/Scripts/AvailableVersions.cs index 65a8ac9..08f5175 100644 --- a/Packages/com.coffee.upm-git-extension/Editor/Scripts/AvailableVersions.cs +++ b/Packages/com.coffee.upm-git-extension/Editor/Scripts/AvailableVersions.cs @@ -22,6 +22,7 @@ public class AvailableVersion : IEquatable public string repoUrl = ""; public string refNameText { get { return version == refName ? version : version + " - " + refName; } } + public string refNameVersion { get { return version == refName ? version : version + "-" + refName; } } bool IEquatable.Equals(AvailableVersion other) { diff --git a/Packages/com.coffee.upm-git-extension/Editor/Scripts/InternalBridge.cs b/Packages/com.coffee.upm-git-extension/Editor/Scripts/InternalBridge.cs index 115c385..281697a 100644 --- a/Packages/com.coffee.upm-git-extension/Editor/Scripts/InternalBridge.cs +++ b/Packages/com.coffee.upm-git-extension/Editor/Scripts/InternalBridge.cs @@ -233,8 +233,7 @@ internal static SemVersion GetVersion(this PackageInfo self) internal static void UpdateVersions(this Package self, IEnumerable versions) { versions.OrderBy(v => v.GetVersion()).Last().IsLatest = true; - self.source = versions; - self.UpdateSource(versions); + self.Set("source", versions); } internal static void UpdatePackageCollection() @@ -245,7 +244,7 @@ internal static void UpdatePackageCollection() internal static PackageInfo ToPackageVersion(this AvailableVersion self, PackageInfo baseInfo) { var newPInfo = JsonUtility.FromJson(JsonUtility.ToJson(baseInfo)); - newPInfo.Version = SemVersion.Parse(self.refNameText); + newPInfo.Version = SemVersion.Parse(self.refNameVersion); #if UNITY_2019_2_OR_NEWER newPInfo.IsInstalled = false; #else diff --git a/Packages/com.coffee.upm-git-extension/Editor/Scripts/Utils.cs b/Packages/com.coffee.upm-git-extension/Editor/Scripts/Utils.cs index 2f0de79..400b19b 100644 --- a/Packages/com.coffee.upm-git-extension/Editor/Scripts/Utils.cs +++ b/Packages/com.coffee.upm-git-extension/Editor/Scripts/Utils.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Diagnostics; +using System.Reflection; #if UNITY_2019_1_OR_NEWER using UnityEngine.UIElements; #else @@ -68,6 +69,58 @@ public static void Exception(string header, Exception e) } } + internal static class ReflectionExtensions + { + const BindingFlags FLAGS = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; + static object Inst(this object self) + { + return (self is Type) ? null : self; + } + + static Type Type(this object self) + { + return (self as Type) ?? self.GetType(); + } + + public static object New(this Type self, params object[] args) + { + var types = args.Select(x => x.GetType()).ToArray(); + return self.Type().GetConstructor(types) + .Invoke(args); + } + + public static object Call(this object self, string methodName, params object[] args) + { + var types = args.Select(x => x.GetType()).ToArray(); + return self.Type().GetMethod(methodName, types) + .Invoke(self.Inst(), args); + } + + public static object Call(this object self, Type[] genericTypes, string methodName, params object[] args) + { + return self.Type().GetMethod(methodName, FLAGS) + .MakeGenericMethod(genericTypes) + .Invoke(self.Inst(), args); + } + + public static object Get(this object self, string memberName, MemberInfo mi = null) + { + mi = mi ?? self.Type().GetMember(memberName, FLAGS)[0]; + return mi is PropertyInfo + ? (mi as PropertyInfo).GetValue(self.Inst(), new object[0]) + : (mi as FieldInfo).GetValue(self.Inst()); + } + + public static void Set(this object self, string memberName, object value, MemberInfo mi = null) + { + mi = mi ?? self.Type().GetMember(memberName, FLAGS)[0]; + if (mi is PropertyInfo) + (mi as PropertyInfo).SetValue(self.Inst(), value, new object[0]); + else + (mi as FieldInfo).SetValue(self.Inst(), value); + } + } + public static class PackageUtils { const string kHeader = "[PackageUtils] ";