Visual Studio 巨集(Todo加到Tasklist中)

  • 2277
  • 0
  • 2015-05-25

Visual Studio 巨集(Todo加到Tasklist中)

 

Visual Studio 有個滿不錯的功能
就是在註解裡打上關鍵字(如TODO之類的),
這行註解就會出現在Tasklist裡面,
可是遇到 .js 的檔案就沒有幫我們自動加到Tasklist裡了,
下面提供用巨集的方式把Todo加到Tasklist裡:

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Imports System.IO
Imports System.Text.RegularExpressions

Public Module JS_TODO_LIST
    Delegate Sub DelegateDoParse(ByVal filename As String)
    Private StrRegex As New Regex("")

    Sub Parse(ByVal filename As String)

        Dim reader As StreamReader

        'Put in task list 
        Dim tl As TaskList = DTE.Windows.Item(Constants.vsWindowKindTaskList).Object

        reader = File.OpenText(filename)
        Dim holefile As String = reader.ReadToEnd
        holefile = holefile.Replace(vbCrLf, vbCr).Replace(vbLf, vbCr).Replace(vbCr, vbCrLf) '一律換成Dos模式的換行符號

        Dim m As System.Text.RegularExpressions.MatchCollection = StrRegex.Matches(holefile, "(^ *//.*TODO.*|^ *//.*#Region.*|^ *//.*#Memo.*)", RegexOptions.Multiline + RegexOptions.IgnoreCase)
        For Each item As Text.RegularExpressions.Match In m
            Dim l As Long = Split(holefile.Substring(0, item.Index), vbCrLf).Length '計算行數
            Dim ti As TaskItem
            Select Case True
                Case item.Value.ToUpper Like "*TODO*"
                    ti = TryCast(tl.TaskItems, TaskItems2).Add2("TODO", "Javascripts", item.Value.Trim, vsTaskPriority.vsTaskPriorityMedium, , False, filename, l, True, False, True)
                Case item.Value.ToUpper Like "*MEMO*"
                    ti = TryCast(tl.TaskItems, TaskItems2).Add2("MEMO", "Javascripts", item.Value.Trim, vsTaskPriority.vsTaskPriorityMedium, , False, filename, l, True, False, True)
                Case item.Value.ToUpper Like "*REGION*"
                    ti = TryCast(tl.TaskItems, TaskItems2).Add2("REGION", "Javascripts", item.Value.Trim, vsTaskPriority.vsTaskPriorityMedium, , False, filename, l, True, False, True)
            End Select
        Next
        tl.TaskItems.ForceItemsToTaskList()

        ' close the file 
        reader.Close()

    End Sub

    Sub FindTODOsByFileName(ByVal filename As String)
        '刪掉舊的
        Dim tl As TaskList = DTE.Windows.Item(Constants.vsWindowKindTaskList).Object
        For Each t As TaskItem In tl.TaskItems
            If StrRegex.IsMatch(t.Category, "(TODO|MEMO|REGION)") AndAlso t.FileName = filename Then
                t.Delete()
            End If
        Next
        Parse(filename)
    End Sub

    Sub FindAllTODOs()
        '刪掉舊的
        Dim tl As TaskList = DTE.Windows.Item(Constants.vsWindowKindTaskList).Object
        For Each t As TaskItem In tl.TaskItems
            If StrRegex.IsMatch(t.Category, "(TODO|MEMO|REGION)") Then
                t.Delete()
            End If
        Next

        Dim piCollection As New Collection
        For Each proj As Project In DTE.Solution.Projects '尋找所有專案
            If Not IsNothing(proj.ProjectItems) Then
                FindFiles(proj.ProjectItems, "js", AddressOf Parse) '遞回找所有副檔名是 "JS" 的
            End If
        Next

    End Sub

    Sub FindFiles(ByVal pis As ProjectItems, ByVal extendFilename As String, ByRef ParseFunc As DelegateDoParse) '在專案中找特定副檔名的檔案
        For Each pi As ProjectItem In pis
            Try
                If IsNothing(pi.ProjectItems) Then
                    If Not IsNothing(pi) AndAlso Not IsNothing(pi.Name) Then
                        If System.IO.Path.GetExtension(pi.FileNames(1)).ToUpper = "." + extendFilename.ToUpper Then
                            ParseFunc(pi.FileNames(1)) '尋找 TODO 字串並加到 Tasklist 裡
                        End If
                    End If
                Else
                    FindFiles(pi.ProjectItems, extendFilename, ParseFunc) '遞回找所有副檔名是 "JS" 的
                End If

            Catch ex As Exception

            End Try
        Next
    End Sub
End Module

再塔配修改 EnvironmentEvents 便可以達到自動載入、更新的功能:

Private Sub DocumentEvents_DocumentSaved(ByVal Document As EnvDTE.Document) Handles DocumentEvents.DocumentSaved
    If System.IO.Path.GetExtension(Document.FullName).ToUpper = ".JS" Then
        JS_TODO_LIST.FindTODOsByFileName(Document.FullName) '存檔完成的重Load該檔的TaskList
    End If
End Sub

Private Sub SolutionEvents_Opened() Handles SolutionEvents.Opened
    JS_TODO_LIST.FindAllTODOs()  '存檔完成的重Load該檔的TaskList
End Sub