Option Explicit On
Imports EnvDTE
Imports System.Diagnostics
Public Module SolutionProfiler
Private Const newline = vbLf
Private m_textDocument As TextDocument
Private m_editPoint As EditPoint
Private m_indent As Integer = 0
Private m_writeOn As Boolean = False
Private m_numberOfProjects As Integer = 0
Private m_numberOfClasses As Integer = 0
Private m_numberOfFunctions As Integer = 0
Private m_linesOfCode As Integer = 0
Public Sub ProfileSolution()
DTE.ItemOperations.NewFile("General\Text File")
m_textDocument = DTE.ActiveDocument.Object("TextDocument")
m_editPoint = m_textDocument.StartPoint.CreateEditPoint()
Dim solution As Solution = DTE.Solution
For Each project As Project In solution.Projects
WriteLine(project.Name)
WriteProject(project)
Next
WriteSummary()
End Sub
Private Sub WriteSummary()
m_writeOn = True
WriteLine(String.Format("Number of Projects = {0}", m_numberOfProjects))
WriteLine(String.Format("Number of Classes = {0}", m_numberOfClasses))
WriteLine(String.Format("Number of Functions = {0}", m_numberOfFunctions))
WriteLine(String.Format("Number of LOK = {0}", m_linesOfCode))
End Sub
Private Sub WriteProject(ByVal project As Project)
m_numberOfProjects += 1
Dim codeModel As CodeModel = project.CodeModel
If Not codeModel Is Nothing Then
TabIn()
For Each childElement As CodeElement In codeModel.CodeElements
If TypeOf childElement Is CodeClass Then
WriteClass(childElement)
End If
If TypeOf childElement Is CodeEnum Then
WriteLine("Enum: " & childElement.FullName)
End If
If TypeOf childElement Is CodeInterface Then
WriteLine("Interface: " & childElement.FullName)
End If
Next
TabOut()
End If
End Sub
Private Sub WriteClass(ByVal codeClass As CodeClass)
If codeClass Is Nothing Then
Return
End If
m_numberOfClasses += 1
WriteLine("Class: " & codeClass.FullName)
TabIn()
WriteLine("Properties")
TabIn()
For Each member As CodeElement In codeClass.Members
If TypeOf member Is CodeProperty Then
WriteProperties(member)
End If
Next
TabOut()
WriteLine("Functions")
TabIn()
For Each member As CodeElement In codeClass.Members
If TypeOf member Is CodeFunction Then
WriteFunction(member)
End If
Next
TabOut()
TabOut()
End Sub
Private Sub WriteProperties(ByVal codeProperty As CodeProperty)
If codeProperty Is Nothing Then
Return
End If
WriteLine(codeProperty.Name)
End Sub
Private Sub WriteFunction(ByVal codeFunction As CodeFunction)
If codeFunction Is Nothing Then
Return
End If
m_numberOfFunctions += 1
WriteLine(codeFunction.Name)
Dim startPoint As TextPoint = codeFunction.StartPoint
Dim endPoint As TextPoint = codeFunction.EndPoint
Dim lines As Integer = endPoint.Line - startPoint.Line
m_linesOfCode += lines
End Sub
Private Sub TabIn()
m_indent += 1
End Sub
Private Sub TabOut()
m_indent -= 1
End Sub
Private Sub WriteLine(ByVal line As String)
If m_writeOn Then
m_editPoint.Insert(New String(vbTab, m_indent) & line & newline)
End If
End Sub
End Module
Wednesday, February 01, 2006
A VS Macro to count projects classes and functions
I was playing around writing Macros for VS 2003 recently, exploring the CodeModel API and came up with this little solution profiler that counts the number of projects, classes and functions in the current solution.
Microsoft has a load of VS 2005 automation samples you can download here
No comments:
Post a Comment
Note: only a member of this blog may post a comment.