VS.NET Macro To Group and Sort Your Using Statements

I try to follow a coding standard for organizing my using statements. System.* goes at the top and then other namespaces grouped together like this:

        using System;
        using System.Collections.Generic;
        using System.Configuration;
        using System.Data;
        using System.Data.SqlClient;
        using System.Web;
        using System.Web.Script.Services;
        using System.Web.Services;
        using System.Web.Services.Protocols;

        using Microsoft;
        using Microsoft.CSharp;

        using MyCompany;
        using MyCompany.Web;

I finally got tired enough of keeping this all sorted out that I made a VS.NET macro to do it for me. This macro will take the current selection, parse it for using statements, group and sort them like the above example.

Here's the macro code:

    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

4 Comments

Comments have been disabled for this content.