Beispiel #1
0
        /// <summary>
        /// 新しいスクリプト関数情報を生成します。
        /// </summary>
        private static SQObject CreateSQObjectForFunc()
        {
            var tempobj = new SQObject {
                IsFunc  = true,
                NodeID  = GenerateCPPDocument.ObjectType.Function,
                SubType = GenerateCPPDocument.ObjectSubType.SQFunc
            };

            return(tempobj);
        }
Beispiel #2
0
        /// <summary>
        /// 新しいスクリプトオブジェクト情報を生成します。
        /// </summary>
        private static SQObject CreateSQObjectForConst(GenerateCPPDocument.ObjectSubType subType)
        {
            var tempobj = new SQObject {
                IsFunc     = false,
                NodeID     = GenerateCPPDocument.ObjectType.Const,
                SubType    = subType,
                ReturnType = "不明"
            };

            return(tempobj);
        }
Beispiel #3
0
        /// <summary>
        /// コンストラクター:直接入力モード
        /// </summary>
        public dlgInsertCommand(CtrlComponent.Text.ctlCommandTree comTree, string summary, string comment, string footer, string defaultText)
        {
            this.InitializeComponent();
            this.obj = null;

            //与えられたオブジェクトに応じてセットアップする
            this.lblSummary.Text       = summary;
            this.lblComment.Text       = comment;
            this.lblReturnType.Text    = "";
            this.lblReturnComment.Text = footer;

            //単一入力欄を作る
            this.SuspendLayout();
            var newArg = new CtrlComponent.Text.ctlArgment();

            newArg.Setup(this.argTools, -1, "", "", defaultText);
            newArg.Size = new Size(this.pnlArguments.Width * 90 / 100, newArg.Height);
            this.pnlArguments.Controls.Add(newArg);

            this.ResumeLayout(false);
            this.SetCommandTree(comTree);
        }
Beispiel #4
0
        /// <summary>
        /// 与えられたストリームで定数定義のソーススクリプトを読み込みます。
        /// </summary>
        public static void LoadConstants(TextReader r)
        {
            SQConstants = new List <SQObject>();

            SQObject obj;
            SQObject tempEnum = null;
            int      start, end;
            var      line = 0;
            string   buf = "", pbuf = "", temp;

            //スクリプトを行単位で読み込む
            while (r.Peek() > -1)
            {
                line++;
                pbuf = buf;             //前行のバッファ
                buf  = r.ReadLine();

                if (tempEnum != null && buf.IndexOf("}") != -1)
                {
                    //列挙体終端
                    tempEnum = null;
                }
                else if (buf.IndexOf(SQ_ENUM) != -1)
                {
                    //列挙体開始
                    obj = CreateSQObjectForConst(GenerateCPPDocument.ObjectSubType.SQEnum);

                    //識別子を抽出
                    temp = buf.Substring(buf.IndexOf(SQ_ENUM) + SQ_ENUM.Length).Trim().Replace("\t", "").Replace(" ", "");
                    end  = temp.IndexOf("{");
                    if (end == -1)
                    {
                        //列挙体が開始できない構文エラー
                        Debug.WriteLine($"{line}行目: 列挙体が開始できないためスキップします。");
                        continue;
                    }
                    temp     = temp.Substring(0, end);
                    obj.Name = temp;

                    //情報をセットする
                    if (pbuf.IndexOf("//") == 0)
                    {
                        //前行にコメントがあればそれをsummaryとする
                        obj.Summary = pbuf.Substring(2);
                    }
                    SQConstants.Add(obj);
                    tempEnum = obj;
                }
                else if (tempEnum != null)
                {
                    //列挙体メンバー
                    obj           = CreateSQObjectForConst(GenerateCPPDocument.ObjectSubType.SQEnumMember);
                    obj.ClassPath = tempEnum.Name;

                    //識別子を抽出
                    temp = buf;
                    while (temp.Length > 0 && temp.Substring(0, 1) == "\t")
                    {
                        temp = temp.Substring(1);     //先頭のタブをカット
                    }
                    end = temp.IndexOf(",");
                    if (end == -1)
                    {
                        //区切り記号がない場合はコメント部分まで読み込む
                        end = temp.IndexOf("/");
                        if (end == -1)
                        {
                            //コメントもない場合は末尾まで読み込む
                            end = temp.Length;
                        }
                    }
                    temp     = temp.Substring(0, end).Replace("\t", "").Trim();
                    obj.Name = temp;

                    //情報をセットする
                    start = buf.IndexOf("//");
                    if (start != -1)
                    {
                        //同じ行にコメントがあればそれをsummaryとする
                        obj.Summary = buf.Substring(start + 2);
                    }
                    SQConstants.Add(obj);
                }
                else if (buf.IndexOf(SQ_CONST) != -1)
                {
                    //定数定義
                    obj = CreateSQObjectForConst(GenerateCPPDocument.ObjectSubType.SQConst);

                    //識別子を抽出
                    temp = buf.Substring(buf.IndexOf(SQ_CONST) + SQ_CONST.Length).Replace("\t", "").Replace(" ", "");
                    end  = temp.IndexOf("=");
                    if (end == -1)
                    {
                        //定数が定義できない構文エラー
                        Debug.WriteLine($"{line}行目: 定数定義の構文エラーにつきスキップします。");
                        continue;
                    }
                    obj.Name = temp.Substring(0, end);

                    //情報をノードにセットする
                    start = buf.IndexOf("//");
                    if (start != -1)
                    {
                        //同じ行にコメントがあればそれをsummaryとする
                        obj.Summary = buf.Substring(start + 2);
                    }
                    SQConstants.Add(obj);
                }
            }
        }
Beispiel #5
0
        /// <summary>
        /// 与えられたストリームで関数定義のソーススクリプトを読み込みます。
        /// </summary>
        public static void LoadFunctions(TextReader r)
        {
            SQFunctions = new List <SQObject>();

            var line = 0;
            var obj  = CreateSQObjectForFunc();

            while (r.Peek() > -1)
            {
                line++;
                var buf = r.ReadLine().Trim();

                if (buf.IndexOf(SQ_FUNC) != -1)
                {
                    //関数定義

                    //識別子を抽出
                    var temp = buf.Substring(buf.IndexOf(SQ_FUNC) + SQ_FUNC.Length);
                    var end  = temp.IndexOf("(");
                    if (end == -1)
                    {
                        //構文エラー
                        Debug.WriteLine($"関数定義スクリプト {line}行目: 構文エラーにつき関数を追加できません。");
                        obj = new SQObject();
                        continue;
                    }
                    obj.Name = temp.Substring(0, end).Trim();

                    //引数リスト
                    var start = end + 1;
                    end = temp.IndexOf(")");
                    if (end == -1)
                    {
                        //構文エラー
                        Debug.WriteLine($"関数定義スクリプト {line}行目: 構文エラーにつき関数を追加できません。");
                        obj = new SQObject();
                        continue;
                    }
                    temp = temp.Substring(start, end - start);
                    if (!string.IsNullOrEmpty(temp))
                    {
                        obj.ArgumentList.AddRange(temp.Split(new char[] { ',' }).ToList());
                    }

                    //引数リストの空白トリミング
                    for (var i = 0; i < obj.ArgumentList.Count; i++)
                    {
                        obj.ArgumentList[i] = obj.ArgumentList[i].Trim();
                    }

                    SQFunctions.Add(obj);
                    obj = CreateSQObjectForFunc();      //次のオブジェクトを先行して生成する
                }
                else
                {
                    var text = buf;
                    if (text.IndexOf(SQ_TAG) != -1 && text.IndexOf("]") != -1)
                    {
                        //タグ型である場合は値部分を取り出す
                        text = text.Substring(text.IndexOf("]") + 1);
                    }
                    else
                    {
                        //タグではない行は無視する
                        continue;
                    }

                    if (buf.IndexOf(DOC_PATH) != -1)
                    {
                        //ノード階層指定
                        //NOTE: ファイルパスと同様に [\] で区切るとノードを深めることができる。
                        obj.ClassPath = text;
                    }
                    else if (buf.IndexOf(DOC_SUMMARY) != -1)
                    {
                        //概要
                        obj.Summary = text;
                    }
                    else if (buf.IndexOf(DOC_COMMENT) != -1)
                    {
                        //解説
                        obj.Comment = text;
                    }
                    else if (buf.IndexOf(DOC_RETURN) != -1)
                    {
                        //戻り値
                        obj.ReturnComment = text;
                    }
                    else if (buf.IndexOf(DOC_PARAM) != -1)
                    {
                        //引数
                        obj.ArgComments.Add(text);
                    }
                }
            }
        }
Beispiel #6
0
        /// <summary>
        /// コンストラクター:関数入力モード
        /// </summary>
        public dlgInsertCommand(CtrlComponent.Text.ctlCommandTree comTree, SQObject obj, string[] args = null)
        {
            this.InitializeComponent();
            this.obj = obj;

            //与えられたオブジェクトに応じてセットアップする
            //概要
            if (!string.IsNullOrEmpty(obj.Summary))
            {
                this.lblSummary.Text = obj.Summary;
            }
            else
            {
                //概要がない場合はオブジェクトのフルパスをそのまま表示する
                this.lblSummary.Text = (obj.ClassPath ?? "不明な関数: " + obj.Name).Replace("\\", ".");
            }

            //詳細説明
            if (!string.IsNullOrEmpty(obj.Comment))
            {
                this.lblComment.Text = obj.Comment;
            }
            else
            {
                this.lblComment.Text = "説明はありません。";
            }

            //戻り値の型
            if (!string.IsNullOrEmpty(obj.ReturnType))
            {
                this.lblReturnType.Text = $"戻り値 ({obj.ReturnType}):\r\n";
            }
            else
            {
                //戻り値の型が不明な場合
                this.lblReturnType.Text = $"戻り値 (不明):\r\n";
            }

            //戻り値の説明: 句点で改行するやさしさ
            if (!string.IsNullOrEmpty(obj.ReturnComment))
            {
                this.lblReturnComment.Text = obj.ReturnComment.Replace("。", "。\r\n");
            }
            else if (obj.ReturnType == "void")
            {
                this.lblReturnComment.Text = "戻り値はありません。";
            }
            else
            {
                this.lblReturnComment.Text = "説明はありません。";
            }

            //引数欄を作る
            this.SuspendLayout();
            for (var i = 0; i < obj.ArgumentList.Count; i++)
            {
                var newArg = new CtrlComponent.Text.ctlArgment();
                newArg.Setup(this.argTools, i + 1, obj.ArgumentList[i], (i < obj.ArgComments.Count) ? obj.ArgComments[i] : "", (args != null && i < args.Length) ? args[i] : "");
                newArg.Size = new Size(this.pnlArguments.Width * 90 / 100, newArg.Height);
                this.pnlArguments.Controls.Add(newArg);
            }

            this.ResumeLayout(false);
            this.SetCommandTree(comTree);
        }
Beispiel #7
0
        /// <summary>
        /// 既存のリファレンスドキュメントをストリーム経由で読み込みます。
        /// </summary>
        public static void LoadDocumentByStream(TextReader r)
        {
            SQObjects = new List <SQObject>();

            var obj = new SQObject();

            while (r.Peek() > -1)
            {
                var buf  = r.ReadLine();
                var text = buf;
                if (text.IndexOf(">") != -1)
                {
                    //タグ型である場合は値部分を取り出す
                    text = text.Substring(text.IndexOf(">") + 1);
                }

                if (buf.IndexOf("[") == 0)
                {
                    obj.ClassPath = buf.Substring(1, buf.Length - 2);
                    if (obj.ClassPath.IndexOf("::") == -1)
                    {
                        //ルートレベルのオブジェクト
                        obj.Name = obj.ClassPath;
                    }
                    else
                    {
                        //階層のあるオブジェクト
                        obj.Name = obj.ClassPath.Substring(obj.ClassPath.LastIndexOf("::") + 2);
                    }
                }
                else if (buf.IndexOf(DOC_NODETYPE) != -1)
                {
                    //nodeType
                    var spl = text.Split(new char[] { '/' });
                    obj.NodeID  = (ObjectType)Enum.Parse(typeof(ObjectType), spl[0]);
                    obj.SubType = (ObjectSubType)Enum.Parse(typeof(ObjectSubType), spl[1]);

                    if (obj.NodeID == ObjectType.Const && obj.SubType == ObjectSubType.Const)
                    {
                        //NOTE: 定数の識別子は階層が作れない都合で、例外的にClassPathも含める必要がある。
                        obj.Name = obj.ClassPath.Replace("::", "_").Replace(GenerateSQGlueCode.SQ_EXCEPTNAMESPACE, "");
                    }
                }
                else if (buf.IndexOf(DOC_PARENT) != -1)
                {
                    //parent
                    obj.SuperClassName = text;
                }
                else if (buf.IndexOf(DOC_TYPE) != -1)
                {
                    //type
                    obj.ReturnType = text;
                }
                else if (buf.IndexOf(DOC_SUMMARY) != -1)
                {
                    //summary
                    obj.Summary = text;
                }
                else if (buf.IndexOf(DOC_RETURN.Substring(0, DOC_RETURN.IndexOf("$"))) != -1)
                {
                    //return
                    var tag = buf.Substring(buf.IndexOf(":") + 1);
                    tag               = tag.Substring(0, tag.IndexOf(">"));
                    obj.IsFunc        = true;
                    obj.ReturnType    = tag;
                    obj.ReturnComment = text;
                }
                else if (buf.IndexOf(DOC_PARAM.Substring(0, DOC_PARAM.IndexOf("$"))) != -1)
                {
                    //par
                    var tag = buf.Substring(buf.IndexOf(":") + 1).Trim();
                    tag = tag.Substring(0, tag.IndexOf(">"));
                    obj.ArgumentList.Add(tag);
                    obj.ArgComments.Add(text);
                }
                else if (buf.IndexOf(DOC_COMMENT) != -1)
                {
                    //comment
                    obj.Comment = text;
                }
                else if (buf.IndexOf(DOC_OBJECT_END) != -1)
                {
                    //オブジェクト終端
                    SQObjects.Add(obj);
                    obj = new SQObject();
                }
            }
        }
Beispiel #8
0
        /// <summary>
        /// C++グルーコードからデータを読み込みます。
        /// </summary>
        public static void LoadCPPGlueCode(List <SQObject> data)
        {
            var buf = "";

            foreach (var srcFile in GenerateCPPDocument.srcFiles)
            {
                Console.WriteLine(srcFile);
                using (var r = new StreamReader(srcFile, Program.SJIS)) {
                    //不要な部分は読み捨てる
                    for (var i = 0; i < MetaLineLength; i++)
                    {
                        r.ReadLine();
                    }

                    //以降、終端まで読み込む
                    while (!r.EndOfStream)
                    {
                        buf = r.ReadLine().Replace("\t", "").Trim();        //余分な空白はカット

                        if (string.IsNullOrEmpty(buf))
                        {
                            //空行は無視
                            continue;
                        }
                        else if (buf.IndexOf(SQ_CONST) == 0)
                        {
                            //定数: DEBUG定数が多重に定義されているので、片方を落とす必要がある
                            var NG      = false;
                            var newData = new SQObject(ObjectSubType.Const, false, buf);
                            foreach (var item in data)
                            {
                                if (item.Name == newData.Name && item.ClassPath == newData.ClassPath)
                                {
                                    NG = true;
                                    break;
                                }
                            }
                            if (!NG)
                            {
                                data.Add(newData);
                            }
                        }
                        else if (buf.IndexOf(SQ_ENUM) == 0)
                        {
                            //列挙体定義開始
                            data.Add(new SQObject(ObjectSubType.Enum, false, buf));
                        }
                        else if (buf.IndexOf(SQ_ENUMMEMBER) == 0)
                        {
                            //列挙体メンバー
                            data.Add(new SQObject(ObjectSubType.EnumMember, false, buf));
                        }
                        else if (buf.IndexOf(SQ_VALUE) == 0)
                        {
                            //グローバル変数
                            data.Add(new SQObject(ObjectSubType.GlobalValue, false, buf));
                        }
                        else if (buf.IndexOf(SQ_FUNC) == 0)
                        {
                            //グローバル関数
                            data.Add(new SQObject(ObjectSubType.GlobalFunc, true, buf));
                        }
                        else if (buf.IndexOf(SQ_CLASS) == 0)
                        {
                            //クラス定義開始
                            data.Add(new SQObject(ObjectSubType.Class, false, buf));
                        }
                        else if (buf.IndexOf(SQ_CLASSVALUE) == 0)
                        {
                            //クラス変数
                            data.Add(new SQObject(ObjectSubType.ClassValue, false, buf));
                        }
                        else if (buf.IndexOf(SQ_CLASSFUNC) == 0)
                        {
                            //クラスメソッド
                            data.Add(new SQObject(ObjectSubType.ClassFunc, true, buf));
                        }
                        else if (buf.IndexOf(SQ_INSTANCEVALUE) == 0)
                        {
                            //メンバー変数
                            data.Add(new SQObject(ObjectSubType.MemberValue, false, buf));
                        }
                        else if (buf.IndexOf(SQ_INSTANCEFUNC) == 0)
                        {
                            //メンバーメソッド
                            data.Add(new SQObject(ObjectSubType.MemberFunc, true, buf));
                        }
                        else if (buf.IndexOf(SQ_PROP) == 0)
                        {
                            //メンバープロパティ
                            data.Add(new SQObject(ObjectSubType.MemberProperty, false, buf));
                        }
                    }
                }
            }
        }