Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Public Module SearchALlReference
Sub SearchAllDocuments()
For Each doc As Document In DTE.Documents
If doc.Name.EndsWith(".cs") Then
SearchAllFunctionReference(doc)
End If
Next
End Sub
Sub SearchAllFunctionReference(byval doc As Document)
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 = doc.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), doc)
'If cnt <= 1 Then MsgBox(classElement.Children().Item(k).Name)
If cnt <= 1 Then ShowNotRefenceToOutputWindow(classElement.Name & " : " & classElement.Children().Item(k).Name & Environment.NewLine)
End If
Next
End If
Next
End If
Next
End Sub
Function ShowNotRefenceToOutputWindow(ByVal content As String)
Dim outputWindowPane As OutputWindowPane
outputWindowPane = GetOutputWindowPane("出力")
outputWindowPane.Clear()
outputWindowPane.OutputString(content)
End Function
Function GetOutputWindowPane(ByVal Name As String, Optional ByVal show As Boolean = True) As OutputWindowPane
Dim window As Window
Dim outputWindow As OutputWindow
Dim outputWindowPane As OutputWindowPane
window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput)
If show Then window.Visible = True
outputWindow = window.Object
Try
outputWindowPane = outputWindow.OutputWindowPanes.Item(Name)
Catch e As System.Exception
outputWindowPane = outputWindow.OutputWindowPanes.Add(Name)
End Try
outputWindowPane.Activate()
Return outputWindowPane
End Function
Function SearchReference(ByVal codeElement As EnvDTE.CodeElement, ByVal doc As Document) 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 = doc.Selection
Try
If Not (codeElement Is Nothing) Then
textSelection.MoveToPoint(codeElement.GetStartPoint(vsCMPart.vsCMPartHeader))
'エレメント名選択
textSelection.FindText(codeElement.Name, vsFindOptions.vsFindOptionsMatchCase)
'すべての参照の検索を実行
doc.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
End Module