/// <summary> /// 新しいスクリプト関数情報を生成します。 /// </summary> private static SQObject CreateSQObjectForFunc() { var tempobj = new SQObject { IsFunc = true, NodeID = GenerateCPPDocument.ObjectType.Function, SubType = GenerateCPPDocument.ObjectSubType.SQFunc }; return(tempobj); }
/// <summary> /// 新しいスクリプトオブジェクト情報を生成します。 /// </summary> private static SQObject CreateSQObjectForConst(GenerateCPPDocument.ObjectSubType subType) { var tempobj = new SQObject { IsFunc = false, NodeID = GenerateCPPDocument.ObjectType.Const, SubType = subType, ReturnType = "不明" }; return(tempobj); }
/// <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); }
/// <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); } } }
/// <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); } } } }
/// <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); }
/// <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(); } } }
/// <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)); } } } } }