2017年10月 / 09月≪ 12345678910111213141516171819202122232425262728293031≫11月

インフォメーション

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

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

スポンサーサイト

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


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

2008.05.13 (Tue)

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

前回の「参照されていないメソッドを探すマクロ」の検索結果表示方法を変更しただけのもの。
今回は検索して見つかったメソッド名を再度検索処理して「検索結果1」ウィンドウに無理やり出力させてます。

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
Dim existcount As Integer
Dim namelist(0) As String

existcount = 0

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
ReDim Preserve namelist(existcount)
namelist(existcount) = classElement.Children().Item(k).Name
existcount += 1
End If
End If
Next
End If
Next
End If
Next

If existcount > 1 Then
MsgBox(String.Format("参照されていないメソッドが {0}個見つかりました", existcount))

'検索結果1ウィンドウに出力
Dim find1win As Window
Dim sel As TextSelection

find1win = DTE.Windows.Item(Constants.vsWindowKindFindResults1)
sel = find1win.Selection

DTE.Find.FindWhat = "(" & Join(namelist, "|") & ")"
DTE.Find.MatchCase = True '大文字小文字一致
DTE.Find.MatchWholeWord = True '完全に一致する単語
DTE.Find.MatchInHiddenText = True '非表示のも
DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxRegExpr '正規表現
DTE.Find.ResultsLocation = vsFindResultsLocation.vsFindResults1 '検索結果表示ウィンドウ?
DTE.Find.Action = vsFindAction.vsFindActionFindAll 'すべて検索
Else
MsgBox("参照されていないメソッドは見つかりませんでした。")
End If

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


出力部分を変えただけなので相変わらずごっちゃのままですがとりあえず使えます。
VBだと配列の宣言時に指定するのは要素数じゃなくて最大インデックス値なのな。
スポンサーサイト


 |  11:29  |  プログラム全般  |  トラックバック(0)  |  コメント(0)  |  Top↑
 | BLOGTOP | 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。