예제 #1
0
        static bool TryInvoke(string methodName, object instance, IEnumerable <MethodInfo> methodInfos, Type [] genericTypes, object [] args, out Expose result)
        {
            bool isGeneric = genericTypes != null && 0 < genericTypes.Length;

            foreach (MethodInfo methodInfo in methodInfos)
            {
                MethodInfo mi = methodInfo;
                if (mi.Name != methodName || isGeneric && !mi.IsGenericMethod)
                {
                    continue;
                }

                try
                {
                    if (isGeneric)
                    {
                        mi = mi.GetGenericMethodDefinition().MakeGenericMethod(genericTypes);
                    }

                    if (IsInvokable(mi, args))
                    {
                        result = Expose.FromObject(mi.Invoke(instance, args));
                        return(true);
                    }
                }
                catch
                {
                }
            }
            result = null;
            return(false);
        }
예제 #2
0
        void UpdatePackageInfoVersions(Expose exPackage, IEnumerable <string> versions)
        {
            Expose vers = Expose.FromObject(versions
                                            .Where(x => Settings.showAllVersions || regVersionValid.IsMatch(x) || x.Contains("upm"))
                                            .Select(x => regVersionValid.IsMatch(x) ? x : "0.0.0-" + x)
                                            .Distinct()
                                            .OrderBy(x => x)
                                            .ToArray());

            var exInfo     = exPackage["VersionToDisplay"]["Info"];
            var exVersions = exInfo["m_Versions"];

            exVersions["m_All"]        = vers;
            exVersions["m_Compatible"] = vers;

            try
            {
                Expose exPackageInfoList = Expose.FromType(tUpmBaseOperation).Call("FromUpmPackageInfo", exInfo, true);                 // Convert to PackageInfos
                foreach (Expose x in exPackageInfoList)
                {
                    x["Origin"] = Expose.FromObject(99);
#if UNITY_2019_2_OR_NEWER
                    x["IsDiscoverable"] = Expose.FromObject(true);
#endif
                }
                exPackage["source"] = exPackageInfoList;
            }
            catch (Exception e)
            {
                Debug.LogException(e);
            }
        }
예제 #3
0
        static Expose Addition(Expose left, object right)
        {
            try
            {
                if (IsNumber(left) && IsNumber(right))
                {
                    var d = ToDecimal(left) + ToDecimal(right);
                    return(Expose.FromObject(ToDecimal(left) + ToDecimal(right)));
                }
                return(Expose.FromType(left.Type).Call("op_Addition", left.Value, right));
            }
            catch
            {
            }

            object lv = ReferenceEquals(left, null) ? null : left.Value;

            if (lv is string || right is string)
            {
                string ls = ReferenceEquals(lv, null) ? "" : lv.ToString();
                string rs = ReferenceEquals(right, null) ? "" : right.ToString();
                return(Expose.FromObject(ls + rs));
            }

            try
            {
                return(Expose.FromObject(ToDecimal(left) + ToDecimal(right)));
            }
            catch
            {
            }
            return(null);
        }
예제 #4
0
        public Expose Get(string memberName)
        {
            var pi = Type.GetProperty(memberName, Flag | BindingFlags.GetProperty);

            if (pi != null)
            {
                return(Expose.FromObject(pi.GetValue(Value)));
            }
            var fi = Type.GetField(memberName, Flag | BindingFlags.GetField);

            if (fi != null)
            {
                return(Expose.FromObject(fi.GetValue(Value)));
            }

            // Get with indexer
            try
            {
                return(Get(new [] { memberName }));
            }
            catch
            {
                throw new MissingMemberException(Type.Name, memberName);
            }
        }
예제 #5
0
 static Expose GetExposedPackageWindow()
 {
     if (!_packageWindow)
     {
         _packageWindow = Resources.FindObjectsOfTypeAll(tPackageWindow).FirstOrDefault() as EditorWindow;
     }
     return(Expose.FromObject(_packageWindow));
 }
예제 #6
0
 public IEnumerator GetEnumerator()
 {
     if (Value is IEnumerable)
     {
         foreach (object o in Value as IEnumerable)
         {
             yield return(Expose.FromObject(o));
         }
     }
     yield break;
 }
예제 #7
0
        public Expose Get(object [] index)
        {
            var pi = Type.GetProperty(Type.GetCustomAttribute <DefaultMemberAttribute> ().MemberName, index.Select(x => x.GetType()).ToArray());

            if (pi != null)
            {
                return(Expose.FromObject(pi.GetValue(Value, index)));
            }

            throw new MissingMemberException(Type.Name, "Indexer");
        }
예제 #8
0
        static bool TryInvoke(string methodName, object instance, IEnumerable <MethodInfo> methodInfos, object [] args, out Expose result)
        {
            var methodInfo = methodInfos.FirstOrDefault(x => x.Name == methodName && IsInvokable(x, args));

            if (methodInfo != null)
            {
                result = Expose.FromObject(methodInfo.Invoke(instance, args));
                return(true);
            }
            result = null;
            return(false);
        }
예제 #9
0
        public Expose Call(string methodName, params object [] args)
        {
            args = args.Select(x => x is Expose ? ((Expose)x).Value : x).ToArray();

            // Find method
            if (TryInvoke(methodName, Value, Type.GetMethods(Flag | BindingFlags.InvokeMethod), args, out Expose result))
            {
                return(result);
            }

            // Find event
            var fi = Type.GetField(methodName, Flag | BindingFlags.SetField);

            if (fi != null)
            {
                var del = fi.GetValue(Value) as MulticastDelegate;
                if (del != null && IsInvokable(del.Method, args))
                {
                    object lastResult = null;
                    foreach (var h in del.GetInvocationList())
                    {
                        lastResult = h.Method.Invoke(h.Target, args);
                    }
                    return(Expose.FromObject(lastResult));
                }
            }

            // Find operator method
            args = new [] { Value }.Concat(args).ToArray();
            if (TryInvoke(methodName, null, Type.GetMethods(Flag | BindingFlags.InvokeMethod), args, out result))
            {
                return(result);
            }

            // Find extension method
            if (Value != null &&
                TryInvoke(methodName, null, s_extensionMethods.Where(x => Is(Type, x.Key)).SelectMany(x => x.Value), null, args, out result))
            {
                if (
                    TryInvoke(methodName, null, s_extensionMethods.Where(x => Is(Type, x.Key)).SelectMany(x => x.Value), null, args, out result) ||
                    TryInvoke(methodName, null, s_extensionMethods.Where(x => Is(Type, x.Key)).SelectMany(x => x.Value), new [] { Type }, args, out result)
                    )
                {
                    return(result);
                }
            }

            throw new MissingMemberException(Type.Name, methodName);
        }
예제 #10
0
        void PlaySpinner(bool playing)
        {
            var statusBar = root.Q("packageStatusBar");

            if (statusBar == null)
            {
                return;
            }

            var spinner = statusBar.Q("packageSpinner");

            if (spinner == null)
            {
                return;
            }

            Expose.FromObject(spinner).Call(playing ? "Start" : "Stop");
        }
예제 #11
0
        static Expose Subtraction(Expose left, object right)
        {
            try
            {
                return(Expose.FromType(left.Type).Call("op_Subtraction", left.Value, right));
            }
            catch
            { }

            try
            {
                return(Expose.FromObject(ToDecimal(left) - ToDecimal(right)));
            }
            catch
            { }

            return(null);
        }
예제 #12
0
        /// <summary>
        /// Initializes UI.
        /// </summary>
        void InitializeUI()
        {
            if (phase != Phase.Initialize)
            {
                return;
            }

            if (!DocumentActions.IsResourceReady() || !InstallPackageWindow.IsResourceReady() || !GitButton.IsResourceReady())
            {
                return;
            }

            root = UIUtils.GetRoot(this).Q("container");

            // Document actions.
            documentActions = new DocumentActions(root.Q("detailActions"));

            // Install package window.
            var installPackageWindow = new InstallPackageWindow();

            root.Add(installPackageWindow);

            // Add button to open InstallPackageWindow
            var addButton = root.Q("toolbarAddButton") ?? root.Q("moreAddOptionsButton");
            var gitButton = new GitButton(installPackageWindow.Open);

            addButton.parent.Insert(addButton.parent.IndexOf(addButton) + 1, gitButton);

#if UNITY_2018
            var space = new VisualElement();
            space.style.flexGrow = 1;
            addButton.parent.Insert(addButton.parent.IndexOf(addButton), space);
#endif

            // Update git packages on load packages
            var    packageList = Expose.FromObject(root.Q("packageList"));
            Action onLoad      = packageList["OnLoaded"].As <Action>();
            onLoad += OnPackageListLoaded;
            packageList["OnLoaded"] = Expose.FromObject(onLoad);

#if UNITY_2019_1_OR_NEWER
            var updateButton = root.Q("packageToolBar").Q <Button>("update");
#else
            OnPackageListLoaded();
            var updateButton = root.Q("updateCombo").Q <Button>("update");
#endif

            var detailView = Expose.FromObject(root.Q("detailsGroup"));

            // Override click action.
            Action actionUpdate = () =>
            {
#if UNITY_2019_1_OR_NEWER
                var exTargetPackage = detailView["TargetVersion"];
#else
                var exTargetPackage = detailView["SelectedPackage"];
#endif
                if (exTargetPackage["Origin"].As <int>() == 99)
                {
                    var    packageId       = exTargetPackage["Info"]["m_PackageId"].As <string>();
                    string packageIdPrefix = regInstallVersion.Replace(packageId, "");
                    string refName         = exTargetPackage["Version"].ToString().Replace("0.0.0-", "");
                    packageId = packageIdPrefix + "#" + refName;

                    var m = Regex.Match(packageId, "([^@]+)@(.*)");
                    if (m.Success)
                    {
                        var l = string.Format("\"{0}\": \"{1}\",", m.Groups [1].Value, m.Groups [2].Value);
                        Debug.Log(l);
                        var manifest     = MiniJSON.Json.Deserialize(System.IO.File.ReadAllText("Packages/manifest.json")) as Dictionary <string, object>;
                        var dependencies = manifest ["dependencies"] as Dictionary <string, object>;

                        dependencies.Remove(m.Groups [1].Value);
                        dependencies.Add(m.Groups [1].Value, m.Groups [2].Value);

                        System.IO.File.WriteAllText("Packages/manifest.json", MiniJSON.Json.Serialize(manifest));
                        UnityEditor.AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
                    }
                }
                else
                {
                    detailView.Call("UpdateClick");
                }
            };
            Expose.FromObject(updateButton.clickable)["clicked"] = Expose.FromObject(actionUpdate);

            Settings.onChangedShowAllVersions = ReloadPackageCollection;

            phase = Phase.Idle;
        }
예제 #13
0
 public static Expose operator -(object left, Expose right)
 {
     return(Subtraction(Expose.FromObject(left), right.Value));
 }
예제 #14
0
 public static Expose operator +(object left, Expose right)
 {
     return(Addition(Expose.FromObject(left), right.Value));
 }
예제 #15
0
        static Expose DoOperation(Expose left, object right, Operation op)
        {
            try
            {
                return(Expose.FromType(left.Type).Call(op.ToString(), left.Value, right));
            }
            catch
            { }

            try
            {
                switch (op)
                {
                case Operation.op_Addition:
                    return(Expose.FromObject(ToDecimal(left) + ToDecimal(right)));

                case Operation.op_Subtraction:
                    return(Expose.FromObject(ToDecimal(left) - ToDecimal(right)));

                case Operation.op_Equality:
                    return(Expose.FromObject(ToDecimal(left) == ToDecimal(right)));

                case Operation.op_Inequality:
                    return(Expose.FromObject(ToDecimal(left) != ToDecimal(right)));

                case Operation.op_GreaterThan:
                    return(Expose.FromObject(ToDecimal(left) > ToDecimal(right)));

                case Operation.op_LessThan:
                    return(Expose.FromObject(ToDecimal(left) < ToDecimal(right)));

                case Operation.op_GreaterThanOrEqual:
                    return(Expose.FromObject(ToDecimal(left) <= ToDecimal(right)));

                case Operation.op_LessThanOrEqual:
                    return(Expose.FromObject(ToDecimal(left) >= ToDecimal(right)));

                case Operation.op_BitwiseAnd:
                    return(Expose.FromObject(ToInt(left) & ToInt(right)));

                case Operation.op_BitwiseOr:
                    return(Expose.FromObject(ToInt(left) | ToInt(right)));

                case Operation.op_Division:
                    return(Expose.FromObject(ToDecimal(left) / ToDecimal(right)));

                case Operation.op_Modulus:
                    return(Expose.FromObject(ToDecimal(left) % ToDecimal(right)));

                case Operation.op_Multiply:
                    return(Expose.FromObject(ToDecimal(left) * ToDecimal(right)));

                case Operation.op_LeftShift:
                    return(Expose.FromObject(ToInt(left) << ToInt(right)));

                case Operation.op_RightShift:
                    return(Expose.FromObject(ToInt(left) >> ToInt(right)));

                case Operation.op_ExclusiveOr:
                    return(Expose.FromObject(ToInt(left) ^ ToInt(right)));

                case Operation.op_UnaryNegation:
                    break;

                case Operation.op_UnaryPlus:
                    break;

                case Operation.op_LogicalNot:
                    break;

                case Operation.op_OnesComplement:
                    break;

                case Operation.op_False:
                    break;

                case Operation.op_True:
                    break;

                case Operation.op_Increment:
                    break;

                case Operation.op_Decrement:
                    break;
                }
            }
            catch
            { }

            return(null);
        }
예제 #16
0
        /// <summary>
        /// Initializes UI.
        /// </summary>
        void InitializeUI()
        {
            if (phase != Phase.Initialize)
            {
                return;
            }

            if (!DocumentActions.IsResourceReady() || !InstallPackageWindow.IsResourceReady() || !GitButton.IsResourceReady())
            {
                return;
            }

            root = UIUtils.GetRoot(this).Q("container");

            // Document actions.
            documentActions = new DocumentActions(root.Q("detailActions"));

            // Install package window.
            var installPackageWindow = new InstallPackageWindow();

            root.Add(installPackageWindow);

            // Add button to open InstallPackageWindow
            var addButton = root.Q("toolbarAddButton") ?? root.Q("moreAddOptionsButton");
            var gitButton = new GitButton(installPackageWindow.Open);

            addButton.parent.Insert(addButton.parent.IndexOf(addButton) + 1, gitButton);

#if UNITY_2018
            var space = new VisualElement();
            space.style.flexGrow = 1;
            addButton.parent.Insert(addButton.parent.IndexOf(addButton), space);
#endif

            // Update git packages on load packages
            var    packageList = Expose.FromObject(root.Q("packageList"));
            Action onLoad      = packageList["OnLoaded"].As <Action>();
            onLoad += OnPackageListLoaded;
            packageList["OnLoaded"] = Expose.FromObject(onLoad);

#if UNITY_2019_1_OR_NEWER
            var updateButton = root.Q("packageToolBar").Q <Button>("update");
#else
            OnPackageListLoaded();
            var updateButton = root.Q("updateCombo").Q <Button>("update");
#endif

            var detailView = Expose.FromObject(root.Q("detailsGroup"));

            // Override click action.
            Action actionUpdate = () =>
            {
#if UNITY_2019_1_OR_NEWER
                var exTargetPackage = detailView["TargetVersion"];
#else
                var exTargetPackage = detailView["SelectedPackage"];
#endif
                if (exTargetPackage["Origin"].As <int>() == 99)
                {
                    var    packageId       = exTargetPackage["Info"]["m_PackageId"].As <string>();
                    string packageIdPrefix = regInstallVersion.Replace(packageId, "");
                    string refName         = exTargetPackage["Version"].ToString().Replace("0.0.0-", "");
                    exTargetPackage["_PackageId"] = Expose.FromObject(packageIdPrefix + "#" + refName);
                }

                detailView.Call("UpdateClick");
            };
            Expose.FromObject(updateButton.clickable)["clicked"] = Expose.FromObject(actionUpdate);

            phase = Phase.Idle;
        }