/// <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> /// KAGタグの情報をエディタドキュメント情報から取得し返す /// </summary> /// <param name="document">エディタのドキュメント情報</param> /// <param name="lineNumber">行番号</param> /// <param name="colNumber">カーソル位置を表す桁番号</param> /// <returns>KAGタグ情報(見つからなかったときはnullを返す)</returns> public static KagTagKindInfo GetTagKind(IDocument document, int lineNumber, int colNumber) { if (document == null) { return(null); //ドキュメントがないとき } LineSegment lineSeg = document.GetLineSegment(lineNumber); if (lineSeg == null) { return(null); //情報が無いとき } string lineText = document.GetText(lineSeg); 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); }
/// <summary> /// ツールチップで表示するテキストを取得する /// </summary> /// <param name="document"></param> /// <param name="lineNumber"></param> /// <param name="colNumber"></param> /// <returns></returns> public static string GetText(IDocument document, int lineNumber, int colNumber) { if (document == null) { return(null); //ドキュメントがないとき } string tip = ""; string word = TextUtilities.GetWordAt(document, document.PositionToOffset(new Point(colNumber, lineNumber))); KagTagKindInfo info = KagUtility.GetTagKind(document, lineNumber, colNumber); if (info == null) { return(""); //取得できなかった } switch (info.Kind) { case KagCompletionData.Kind.KagTagName: tip = getTagComment(word); break; case KagCompletionData.Kind.AttrName: tip = getTagAttrComment(word, info); break; default: break; //不明とか属性値は何もしない } return(tip); }
/// <summary> /// 指定したマクロ名の説明を取得する /// </summary> /// <param name="info"></param> /// <param name="macroName"></param> /// <returns></returns> private static string getTagComment(string macroName) { KagMacro macro = KagUtility.GetKagMacro(macroName); if (macro == null) { return(""); } return(macro.Comment); }
/// <summary> /// 指定した属性の説明を取得する /// </summary> /// <param name="info"></param> /// <param name="attrName"></param> /// <returns></returns> private static string getTagAttrComment(string attrName, KagTagKindInfo info) { KagMacro[] macroList = GlobalStatus.ParserSrv.GetKagMacroList(); if (macroList.Length == 0) { return(""); //一つもないとき } KagMacroAttr attr = KagUtility.GetKagMacroAttr(attrName, info, macroList); if (attr == null) { return(""); //属性が取得できなかったとき } return(attr.Comment); }
/// <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); }