2017年11月 / 10月≪ 123456789101112131415161718192021222324252627282930≫12月

インフォメーション

FC2ブログで画像等を一括アップロードするソフトを地味に配布してます。
FC2ブログ用ファイルアップロードの最新版はこちら
(ベクター)FC2ブログ用ファイルアップロード

--.--.-- (--)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


 |  --:--  |  スポンサー広告  |  Top↑

2008.04.16 (Wed)

参照されていないメソッドを探すマクロ

VisualStudio2005のC#.NETでコードを書いてるとき、
「どこからも参照されない変数」の場合はエラーなり警告で表示されてわかりやすい。
しかし「どこからも参照されないメソッド」は特に何も出ない。
設定で警告にしたり出来るんじゃないかと思ったけど出来ず、仕方がないので
VisualStudioマクロで探すことにしました。


Sub SearchAllFunctionReference()
    Dim textSelection As EnvDTE.TextSelection
    Dim codeElement As EnvDTE.CodeElement
    Dim codeElements As EnvDTE.CodeElements
    Dim classElement As EnvDTE.CodeElement
    Dim codeModel As EnvDTE.FileCodeModel = DTE.ActiveDocument.ProjectItem.FileCodeModel
    Dim i, j, k As Integer

    For i = 1 To codeModel.CodeElements.Count
        codeElement = codeModel.CodeElements.Item(i)
        If codeElement.Kind = vsCMElement.vsCMElementNamespace Then
            'クラスを取得
            Dim classElements = codeElement.Children()

            For j = 1 To codeElement.Children().Count
                If codeElement.Children().Item(j).Kind = vsCMElement.vsCMElementClass Then
                    classElement = codeElement.Children().Item(j)
                    For k = 1 To classElement.Children.Count
                        If classElement.Children().Item(k).Kind = vsCMElement.vsCMElementFunction Then
                            '参照の検索
                            Dim cnt As Integer
                            cnt = SearchReference(classElement.Children().Item(k))
                            If cnt <= 1 Then MsgBox(classElement.Children().Item(k).Name)
                        End If
                    Next
                End If
            Next
        End If
    Next

End Sub
Function SearchReference(ByVal codeElement As EnvDTE.CodeElement) As Integer
    Dim textSelection As EnvDTE.TextSelection
    Dim resultcount As Integer
    Dim rescaption As String

    Dim regex As New System.Text.RegularExpressions.Regex(" - [0-9]+")

    textSelection = DTE.ActiveDocument.Selection
    Try
        If Not (codeElement Is Nothing) Then
            textSelection.MoveToPoint(codeElement.GetStartPoint(vsCMPart.vsCMPartHeader))
            'エレメント名選択
            textSelection.FindText(codeElement.Name, vsFindOptions.vsFindOptionsMatchCase)
            'すべての参照の検索を実行
            DTE.ActiveDocument.Activate()
            DTE.ExecuteCommand("Edit.FindAllReferences")
            rescaption = DTE.Windows.Item(Constants.vsWindowKindFindSymbolResults).Caption

            '検索結果ウィンドウのタイトルから件数を取得
            resultcount = CType(regex.Match(rescaption).Value.Substring(3), Integer)

            Return resultcount

        End If
    Catch ex As Exception
    End Try

End Function

SearchAllFunctionReferenceを実行すると、アクティブなドキュメント(ソースファイル)内のメソッドを探し、全てのメソッドに対して「すべての参照を検索」を実行し参照数を取得、
参照数が1以下(どこからも参照されていない)の場合はダイアログでその関数名が表示される。

ほんとはシンボルの検索結果みたいに表示させたいけどよくわからないので・・・。
とりあえず今使いたくて調べつつ作ったマクロなのでちょっとややこしいです。

ほんとは参照されないゴミメソッドなんて出ないようなきれいな書き方すればいいんだけどね。
どうも何かとメソッドに分けたがるタイプなのでよくゴミが出る・・・


 |  17:46  |  プログラム全般  |  トラックバック(0)  |  コメント(0)  |  Top↑

Comment

コメントを投稿する

URL
コメント
パス  編集・削除するのに必要
非公開  管理者だけにコメントを表示
 

Trackback

この記事のトラックバックURL

この記事へのトラックバック

 | BLOGTOP | 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。