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