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