/// <summary> /// 属性名リストを取得する /// </summary> /// <param name="info">現在位置の入力情報</param> /// <param name="macroList">マクロ情報リスト</param> /// <returns>マクロ名リスト</returns> public static KagMacroAttr GetKagMacroAttr(string attrName, KagTagKindInfo info, KagMacro[] macroList) { //マクロを取得 KagMacro macro = KagUtility.GetKagMacro(info.TagName, macroList); if (macro == null) { return(null); //マクロが見つからない } //属性を取得 Dictionary <string, KagMacroAttr> table = new Dictionary <string, KagMacroAttr>(); table = getAttrNameListFromMacro(macro, macroList, table, 0); //属性を検索する KagMacroAttr attr = null; if (table.ContainsKey(attrName)) { attr = table[attrName]; } return(attr); }
/// <summary> /// マクロオブジェクトから属性名リストを取得する /// *再帰する /// </summary> /// <param name="macro">取得するマクロオブジェクト</param> /// <param name="macroList">マクロ情報リスト</param> /// <param name="table">取得した属性名を格納するテーブル</param> /// <returns>取得した属性名テーブル(tableをそのまま返す)</returns> private static Dictionary <string, KagMacroAttr> getAttrNameListFromMacro(KagMacro macro , KagMacro[] macroList, Dictionary <string, KagMacroAttr> table, int reverseCount) { if (reverseCount > MAX_REVERSE_COUNT) { //再帰回数がオーバーしているときは何もせずに終了する return(table); } reverseCount++; //通常のマクロ属性を追加 foreach (KagMacroAttr attr in macro.AttrTable.Values) { if (table.ContainsKey(attr.Name) == false) { //存在しないときだけ追加する table.Add(attr.Name, attr); } } //全省略マクロ属性を追加 KagMacro asterMacro = null; foreach (string macroName in macro.AsteriskTagList) { asterMacro = KagUtility.GetKagMacro(macroName, macroList); if (asterMacro == null) { continue; //このマクロは飛ばす } //自分自身を呼び出し table = getAttrNameListFromMacro(asterMacro, macroList, table, reverseCount); } return(table); }
/// <summary> /// KAGタグの情報をエディタドキュメント情報から取得し返す /// </summary> /// <param name="document">エディタのドキュメント情報</param> /// <param name="lineNumber">行番号</param> /// <param name="colNumber">カーソル位置を表す桁番号</param> /// <returns>KAGタグ情報(見つからなかったときはnullを返す)</returns> public static KagTagKindInfo GetTagKind(string lineText, int colNumber) { if (string.IsNullOrEmpty(lineText)) { return(null); } if (colNumber < lineText.Length) { lineText = lineText.Substring(0, colNumber); } if (KagUtility.ExistLineHead(lineText, ';')) { return(null); //コメント行のとき } if (KagUtility.ExistLineHead(lineText, '*')) { return(null); //ラベル行のとき } KagTagKindInfo info = KagUtility.GetTagKind(lineText); return(info); }