Beispiel #1
0
 /// <summary>
 /// 可能ならコールバックを呼びます。
 /// </summary>
 /// <param name="cagt">仮引数スタック</param>
 /// <param name="func">コールバック変数</param>
 protected void TryCallCallBack(DummyArgumentsStack cagt, ICbValue func)
 {
     if (CanCallBack(func))
     {
         CallCallBack(cagt, func);
     }
 }
Beispiel #2
0
        public override void Set(ICbValue n)
        {
            try
            {
                if (n.IsError)
                {
                    throw new Exception(n.ErrorMessage);
                }

                // 値を文字列にしてコピーする

                if (n.IsNull)
                {
                    Value = null;
                }
                else
                {
                    ValueString = n.ValueString;
                }
                IsLiteral = n.IsLiteral;
                if (IsError)
                {
                    // エラーからの復帰

                    IsError      = false;
                    ErrorMessage = "";
                }
            }
            catch (Exception ex)
            {
                IsError      = true;
                ErrorMessage = ex.Message;
                throw;
            }
        }
Beispiel #3
0
        /// <summary>
        /// コールバックを呼び出します。
        /// </summary>
        /// <param name="variable">変数</param>
        /// <param name="dummyArgumentstack">仮引数スタック</param>
        /// <returns>コールバックの返し値</returns>
        protected ICbValue CallEvent(ICbValue variable, DummyArgumentsStack dummyArgumentstack)
        {
            ICbEvent cbEvent = variable as ICbEvent;

            cbEvent.InvokeCallback(dummyArgumentstack);
            return(cbEvent.Value);
        }
Beispiel #4
0
        /// <summary>
        /// 引数からリストを参照します。
        /// </summary>
        /// <param name="arguments">引数リスト</param>
        /// <param name="index">引数のインデックス</param>
        /// <returns>配列</returns>
        protected List <ICbValue> GetArgumentList(List <ICbValue> arguments, int index)
        {
            ICbValue valueData = arguments[index];

            CheckArgument(valueData);
            return(valueData.GetListValue.Value);
        }
Beispiel #5
0
 /// <summary>
 /// 引数付きでコールバックを呼んで返り値を得ます。
 /// </summary>
 /// <typeparam name="R">返り値の型</typeparam>
 /// <param name="dummyArgumentsControl">仮引数コントロール</param>
 /// <param name="cagt">仮引数スタック</param>
 /// <param name="func">コールバック変数</param>
 /// <param name="arg">コールバック引数</param>
 /// <param name="def">コールバックの返り値を得られなかったときの返り値</param>
 /// <returns>コールバックの返り値</returns>
 protected R GetCallBackResult <R>(DummyArgumentsControl dummyArgumentsControl, DummyArgumentsStack cagt, ICbValue func, object arg, R def)
 {
     if (!CanCallBack(func))
     {
         return(def);
     }
     if (arg is ICbValue cbValue)
     {
         dummyArgumentsControl.EnableCbValue(cagt, cbValue);    // 仮引数に引数を登録
     }
     else
     {
         dummyArgumentsControl.Enable(cagt, (dynamic)arg);    // 仮引数に引数を登録
     }
     if (typeof(R) == typeof(ICbValue))
     {
         ICbValue result = CallEvent(func, cagt);
         dummyArgumentsControl.Invalidated(cagt);    // 仮引数後処理
         return((R)result);
     }
     else
     {
         R result = (R)CallEvent(func, cagt).Data;
         dummyArgumentsControl.Invalidated(cagt);    // 仮引数後処理
         return(result);
     }
 }
Beispiel #6
0
        public virtual bool IsAssignment(ICbValue obj, bool isCast)
        {
            if (obj is ParamNameOnly)
            {
                return(false);
            }

            if (IsList)
            {
                ICbList cbList = GetListValue;

                if (isCast && cbList.IsArrayType && obj.IsList)
                {
                    return(true);    // ToArrya() を行う特殊なキャスト
                }
                if (isCast && obj.IsList)
                {
                    ICbList ListObj = obj.GetListValue;
                    if (ListObj.IsArrayType)
                    {
                        return(true);    // List<>(array) を行う特殊なキャスト
                    }
                }

                if (OriginalType.IsAssignableFrom(obj.OriginalType))
                {
                    return(true);
                }
            }
            return(CbSTUtils.IsAssignment(OriginalType, obj.OriginalType, isCast));
        }
Beispiel #7
0
 /// <summary>
 /// CbStruct<T> 型なら同様の型の変数を返します。
 /// </summary>
 /// <param name="value">参考変数</param>
 /// <param name="name">変数名</param>
 /// <returns>CbStruct<T>型の変数</returns>
 public static ICbValue StructValue(ICbValue value, string name)
 {
     if (value is ICbStruct cbStruct)
     {
         return(StructValue(cbStruct.OriginalReturnType, name));
     }
     return(null);
 }
Beispiel #8
0
 /// <summary>
 /// CbEnum<T> 型なら同様の型の変数を返します。
 /// </summary>
 /// <param name="value">参考変数</param>
 /// <param name="name">変数名</param>
 /// <returns>CbEnum<T>型の変数</returns>
 public static ICbValue EnumValue(ICbValue value, string name)
 {
     if (value is ICbEnum cbEnum)
     {
         return(EnumValue(CbST.GetTypeEx(cbEnum.ItemName), name));
     }
     return(null);
 }
Beispiel #9
0
 /// <summary>
 /// CbClass<T> 型なら同様の型の変数を返します。
 /// </summary>
 /// <param name="value">参考変数</param>
 /// <param name="name">変数名</param>
 /// <returns>CbClass<T>型の変数</returns>
 public static ICbValue ClassValue(ICbValue value, string name)
 {
     if (value is ICbClass cbClass)
     {
         return(ClassValue(cbClass.OriginalReturnType, name));
     }
     return(null);
 }
Beispiel #10
0
        /// <summary>
        /// コールバックかを判断します。
        /// </summary>
        /// <param name="variable">変数</param>
        /// <returns>true = コールバック</returns>
        protected bool CanCallBack(ICbValue variable)
        {
            ICbEvent cbEvent = variable as ICbEvent;

            if (cbEvent is null)
            {
                return(false);
            }
            return(cbEvent.IsCallback);
        }
Beispiel #11
0
        private static ICbValue CallGetCbFunc(ICbValue ret, string name, Type originalType)
        {
            object result = GetFuncType(originalType, ret.OriginalReturnType)
                            .InvokeMember(
                nameof(CbFunc <int, CbInt> .GetCbFunc),
                BindingFlags.InvokeMethod,
                null, null, new object[] { name }) as ICbValue;

            return(result as ICbValue);
        }
Beispiel #12
0
 /// <summary>
 /// 変数が異常かをチェックします。
 /// </summary>
 /// <param name="variable">変数</param>
 protected void CheckArgument(ICbValue variable)
 {
     if (variable is null)
     {
         throw new Exception("Argument is null.");
     }
     if (variable.IsError)
     {
         throw new Exception(variable.ErrorMessage);
     }
 }
Beispiel #13
0
 /// <summary>
 /// コールバックを呼んで返り値を得ます。
 /// </summary>
 /// <typeparam name="R">返り値の型</typeparam>
 /// <param name="dummyArgumentsControl">仮引数コントロール</param>
 /// <param name="cagt">仮引数スタック</param>
 /// <param name="func">コールバック変数</param>
 /// <param name="def">コールバックの返り値を得られなかったときの返り値</param>
 /// <returns>コールバックの返り値</returns>
 protected R GetCallBackResult <R>(DummyArgumentsStack cagt, ICbValue func, R def)
 {
     if (!CanCallBack(func))
     {
         return(def);
     }
     if (typeof(R) == typeof(ICbValue))
     {
         ICbValue result = CallEvent(func, cagt);
         return((R)result);
     }
     else
     {
         R result = (R)CallEvent(func, cagt).Data;
         return(result);
     }
 }
Beispiel #14
0
        public override void Set(ICbValue n)
        {
            try
            {
                if (n.IsError)
                {
                    throw new Exception(n.ErrorMessage);
                }

                // 型情報を残す
                copyOriginal = n;
                if (n is ICbEvent || n is ICbClass)
                {
                    Value = n;
                }
                else
                {
                    if (n.IsNullable && n.IsNull)
                    {
                        // null許容型は、null のときに参照してはならない

                        Value = null;
                    }
                    else
                    {
                        Value = n.Data;
                    }
                }
                IsLiteral = n.IsLiteral;
                if (IsError)
                {
                    // エラーからの復帰

                    IsError      = false;
                    ErrorMessage = "";
                }
            }
            catch (Exception ex)
            {
                IsError      = true;
                ErrorMessage = ex.Message;
                throw;
            }
        }
Beispiel #15
0
        protected void TryArgListProc(ICbValue variable, Action <ICbValue> func)
        {
            if (func is null)
            {
                return;
            }

            var argList = variable.GetListValue.Value;

            foreach (var node in argList)
            {
                if (node.IsError)
                {
                    throw new Exception(node.ErrorMessage);
                }

                func?.Invoke(node);
            }
        }
        /// <summary>
        /// オリジナル型の値に変換します。
        /// </summary>
        /// <param name="value"></param>
        /// <param name="col"></param>
        /// <param name="dummyArgumentsControl"></param>
        /// <param name="dummyArgumentsStack"></param>
        /// <returns></returns>
        private object getBindObject(
            ICbValue value,
            MultiRootConnector col,
            DummyArgumentsControl dummyArgumentsControl,
            DummyArgumentsStack dummyArgumentsStack
            )
        {
            if (value.IsList)
            {
                ICbList cbList = value.GetListValue;

                // リストは、オリジナルの型のインスタンスを用意する

                if (dummyArgumentsControl is null)
                {
                    return(cbList.ConvertOriginalTypeList(col, dummyArgumentsStack));
                }
                else
                {
                    return(cbList.ConvertOriginalTypeList(dummyArgumentsControl, dummyArgumentsStack));
                }
            }
            else if (dummyArgumentsControl != null && value is ICbEvent cbEvent)
            {
                // Func<> 及び Action<> は、オリジナルの型のインスタンスを用意する

                if (cbEvent.Callback is null)
                {
                    return(null);
                }
                else
                {
                    Debug.Assert(dummyArgumentsControl != null);
                    return(cbEvent.GetCallbackOriginalType(dummyArgumentsControl, dummyArgumentsStack));
                }
            }
            if (value.IsNull)
            {
                return(null);
            }
            return(value.Data);
        }
Beispiel #17
0
        protected void TryArgListCancelableProc(ICbValue variable, Func <ICbValue, bool> func)
        {
            if (func is null)
            {
                return;
            }

            var argList = variable.GetListValue.Value;

            foreach (var node in argList)
            {
                if (node.IsError)
                {
                    throw new Exception(node.ErrorMessage);
                }

                if (func.Invoke(node))
                {
                    break;
                }
            }
        }
Beispiel #18
0
 /// <summary>
 /// コールバックを呼びます。
 /// </summary>
 /// <param name="cagt">仮引数スタック</param>
 /// <param name="func">コールバック変数</param>
 protected void CallCallBack(DummyArgumentsStack cagt, ICbValue func)
 {
     CallEvent(func, cagt);
 }
Beispiel #19
0
 /// <summary>
 /// 引数が異常かをチェックし内容を参照します。
 /// </summary>
 /// <typeparam name="T">引数の型</typeparam>
 /// <param name="variable">引数</param>
 /// <returns>値</returns>
 protected T GetArgument <T>(ICbValue variable)
 {
     CheckArgument(variable);
     return((T)variable.Data);
 }
Beispiel #20
0
 /// <summary>
 /// 可能なら引数付きでコールバックを呼びます。
 /// </summary>
 /// <param name="dummyArgumentsControl">仮引数コントロール</param>
 /// <param name="cagt">仮引数スタック</param>
 /// <param name="func">コールバック変数</param>
 /// <param name="arg">コールバック引数</param>
 protected void TryCallCallBack(DummyArgumentsControl dummyArgumentsControl, DummyArgumentsStack cagt, ICbValue func, object arg)
 {
     if (CanCallBack(func))
     {
         CallCallBack(dummyArgumentsControl, cagt, func, arg);
     }
 }
        /// <summary>
        /// メソッド呼び出しの実装です。
        /// </summary>
        /// <param name="col">スクリプトのルートノード</param>
        /// <param name="dummyArgumentsControl">仮引数管理オブジェクト</param>
        /// <param name="callArguments">引数リスト</param>
        /// <param name="dummyArgumentsStack">仮引数スタック</param>
        /// <param name="returnValue">返り値</param>
        private void ImplCallMethod(
            MultiRootConnector col,
            Type classType,
            DummyArgumentsControl dummyArgumentsControl,
            List <ICbValue> callArguments,
            DummyArgumentsStack dummyArgumentsStack,
            ICbValue returnValue
            )
        {
            try
            {
                bool          isClassInstanceMethod = ArgumentTypeList != null && ArgumentTypeList[0].IsSelf && !IsConstructor;
                List <object> methodArguments       = null;

                methodArguments = SetArguments(
                    col,
                    dummyArgumentsControl,
                    callArguments,
                    dummyArgumentsStack,
                    isClassInstanceMethod,
                    methodArguments
                    );

                object classInstance = null;
                if (isClassInstanceMethod)
                {
                    // クラスメソッドの第一引数は、self(this)を受け取るのでクラスインスタンスとして扱う

                    classInstance = getBindObject(callArguments[0], col, dummyArgumentsControl, dummyArgumentsStack);
                    if (classInstance is null)
                    {
                        throw new Exception($"self(this) is invalid.");
                    }
                    // 返却方法が入っていないならセットしておく
                    var cbVSValue = callArguments[0];
                    if (!cbVSValue.IsDelegate && !cbVSValue.IsLiteral && cbVSValue.ReturnAction is null)
                    {
                        if (cbVSValue.IsList)
                        {
                            ICbList cbList = cbVSValue.GetListValue;
                            cbVSValue.ReturnAction = (value) =>
                            {
                                cbList.CopyFrom(value);
                            };
                        }
                        else if (!(cbVSValue is ICbClass))
                        {
                            cbVSValue.ReturnAction = (value) =>
                            {
                                cbVSValue.Data = value;
                            };
                        }
                    }
                }

                object result = CallMethod(
                    classInstance,
                    col,
                    classType,
                    callArguments,
                    isClassInstanceMethod,
                    methodArguments);

                ProcReturnValue(col, returnValue, result);
            }
            catch (Exception ex)
            {
                col.ExceptionFunc(returnValue, ex);
            }
        }
Beispiel #22
0
 /// <summary>
 /// 仮引数に引数を登録し、有効化します。
 /// ※Invokeメソッド用です。
 /// </summary>
 /// <typeparam name="T">登録する型</typeparam>
 /// <param name="dummyArgumentstack">仮引数スタック</param>
 /// <param name="argument">引数</param>
 public void EnableCbValue(DummyArgumentsStack dummyArgumentstack, ICbValue argument)
 {
     argumentInvalid = false;
     argumentRef[CbFuncArguments.INDEX.ARG_1] = argument;
     dummyArgumentstack.Push(owner.PreFunction());
 }
        /// <summary>
        /// 返り値を処理します。
        /// </summary>
        /// <param name="col">スクリプトのルートノード</param>
        /// <param name="returnValue">返り値を格納する変数</param>
        /// <param name="result">メソッド呼び出しの返り値</param>
        private static void ProcReturnValue(MultiRootConnector col, ICbValue returnValue, object result)
        {
            if (returnValue.IsList)
            {
                ICbList retCbList = returnValue.GetListValue;
                retCbList.CopyFrom(result);
                col.LinkConnectorControl.UpdateValueData();
            }
            else if (result != null && returnValue is ICbEvent cbEvent)
            {
                // デリゲート型の返し値

                Type resultType = CbSTUtils.GetDelegateReturnType(result.GetType());

                if (!CbSTUtils.IsVoid(resultType))
                {
                    // 返し値のあるデリゲート型

                    cbEvent.Callback = (cagt) =>
                    {
                        ICbValue retTypeValue = null;
                        try
                        {
                            // イベントからの返り値を取得
                            object tempReturnValue = ((dynamic)result).Invoke(cagt.GetValue().Data);

                            // 直接メソッドを呼ぶため帰ってくるのは通常の値なので Cb タイプに変換する
                            retTypeValue      = CbST.CbCreate(tempReturnValue.GetType());
                            retTypeValue.Data = tempReturnValue;
                        }
                        catch (Exception ex)
                        {
                            col.ExceptionFunc(null, ex);
                        }
                        return(retTypeValue);
                    };
                }
                else
                {
                    // 返し値の無いデリゲート型

                    cbEvent.Callback = (cagt) =>
                    {
                        try
                        {
                            var argType = cagt.GetValue();
                            if (argType is null)
                            {
                                ((dynamic)result).Invoke(null);
                            }
                            else
                            {
                                ((dynamic)result).Invoke(argType.Data);
                            }
                        }
                        catch (Exception ex)
                        {
                            col.ExceptionFunc(null, ex);
                        }
                        return(new CbVoid());
                    };
                }
            }
            else
            {
                returnValue.Data = result;
            }
        }
Beispiel #24
0
 public SingleRootConnector AppendToBox(ICbValue variable, bool openList = false)
 {
     LinkConnectorControl.AppendArgument(variable, openList);
     return(this);
 }
        public static StackNode Create(
            CommandCanvas OwnerCommandCanvas,
            string caption,
            ObservableCollection <StackGroup> stackList,
            bool forcedListTypeSelect,
            Point?pos = null)
        {
            ListSelectWindow selectWindow = new ListSelectWindow();

            selectWindow.Caption = caption;
            selectWindow.Owner   = CommandCanvasList.OwnerWindow;
            ControlTools.SetWindowPos(selectWindow, pos);

            if (DefaultValue != null)
            {
                selectWindow.Add("[ New ]");
            }
            List <string> teble = new List <string>();

            foreach (var node in stackList)
            {
                teble.Add(node.stackNode.ValueData.Name);

                if (DefaultValue != null)
                {
                    if (DefaultValue.TypeName != node.stackNode.ValueData.TypeName)
                    {
                        continue;
                    }
                }

                if (forcedListTypeSelect)
                {
                    if (!node.stackNode.ValueData.IsList)
                    {
                        continue;
                    }
                }

                selectWindow.Add(node.stackNode.ValueData.Name);
            }
            selectWindow.ShowDialog();
            if (selectWindow.SelectedIndex == -1)
            {
                return(null);
            }

            if (selectWindow.SelectedName == "[ New ]")
            {
                if (DefaultValue is null)
                {
                    return(null);
                }

                // 新規作成する
                DefaultValue.Name = "variable" + (OwnerCommandCanvas.ScriptWorkStack.StackData.Count + 1);
                var ret = OwnerCommandCanvas.ScriptWorkStack.Append(DefaultValue).stackNode;
                DefaultValue = null;
                return(ret);
            }
            DefaultValue = null;

            // 選ばれたアイテムの名前からインデックスを求める
            int index = teble.FindIndex((x) => x == selectWindow.SelectedName);

            return(stackList[index].stackNode);
        }
Beispiel #26
0
 /// <summary>
 /// 引数付きでコールバックを呼びます。
 /// </summary>
 /// <param name="dummyArgumentsControl">仮引数コントロール</param>
 /// <param name="cagt">仮引数スタック</param>
 /// <param name="func">コールバック変数</param>
 /// <param name="arg">コールバック引数</param>
 protected void CallCallBack(DummyArgumentsControl dummyArgumentsControl, DummyArgumentsStack cagt, ICbValue func, object arg)
 {
     if (arg is ICbValue cbValue)
     {
         dummyArgumentsControl.EnableCbValue(cagt, cbValue);    // 仮引数に引数を登録
     }
     else
     {
         dummyArgumentsControl.Enable(cagt, (dynamic)arg);    // 仮引数に引数を登録
     }
     CallEvent(func, cagt);
     dummyArgumentsControl.Invalidated(cagt);    // 仮引数後処理
 }