Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
        /// <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);
        }