2013년 5월 1일 수요일

[미완] using 정렬

분류 > c#, vs

참조
http://weblogs.asp.net/dfindley/archive/2007/02/07/vs-net-macro-to-group-and-sort-your-using-statements.aspx


Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Imports System.Collections.Generic
Imports System.Text
Imports System.Text.RegularExpressions

Public Module SortUsing

    Dim _usingPattern As Regex = New Regex( _
        "\s*(?<using>using\s*(?<group>\w+)[^;]*);", _
        RegexOptions.IgnoreCase _
        Or RegexOptions.Multiline _
        Or RegexOptions.ExplicitCapture _
        Or RegexOptions.CultureInvariant _
        Or RegexOptions.Compiled _
    )

    Public Sub SortUsing()
        If Not DTE.ActiveDocument Is Nothing Then
            Dim sel As TextSelection = DTE.ActiveDocument.Selection

            If sel.Text.Contains(vbCrLf) Then
                If sel.ActivePoint Is sel.BottomPoint Then sel.SwapAnchor()
                sel.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstColumn, True)
                sel.SwapAnchor()
                sel.EndOfLine(True)

                Dim groups As New SortedList(Of String, List(Of String))()
                For Each match As Match In _usingPattern.Matches(sel.Text)
                    Dim u As String = match.Groups("using").Value
                    Dim g As String = match.Groups("group").Value

                    ' System usings sort at the top
                    If g = "System" Then g = "_" + g

                    Dim list As List(Of String)
                    If Not groups.TryGetValue(g, list) Then
                        list = New List(Of String)()
                        groups.Add(g, list)
                    End If
                    list.Add(u)
                Next

                Dim builder As New StringBuilder()
                For Each group As KeyValuePair(Of String, List(Of String)) In groups
                    If builder.Length > 0 Then builder.AppendLine() ' 여기 주석치면 라인 없어짐
                    group.Value.Sort()
                    For Each line As String In group.Value
                        builder.Append(line)
                        builder.AppendLine(";")
                    Next
                Next

                sel.DeleteLeft()
                sel.Insert(builder.ToString())
            End If
        End If
    End Sub

End Module

댓글 없음:

댓글 쓰기