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
Published Wednesday, February 07, 2007 10:20 PM by findleyd
Filed under: ,

Comments

# re: VS.NET Macro To Group and Sort Your Using Statements

Thursday, February 08, 2007 12:25 AM by koistya

Nice stuff. David, can you please send to me full version of this Macro project? - navin@php.net

I am just new to Macros and can't figure out how to make it work...

# re: VS.NET Macro To Group and Sort Your Using Statements

Thursday, February 08, 2007 12:51 AM by koistya

To my previous comment - forget it, I've already managed it. Thanks.

# re: VS.NET Macro To Group and Sort Your Using Statements

Thursday, February 08, 2007 12:56 AM by koistya

Btw, thinks that would be better use whole active document text instead of just DTE.ActiveDocument.Selection

For example you could search for "Imports region":

#region Imports...

using System;

...

#endregion

..and also think that would be cool to make it work for all .cs files in a solution.

# re: VS.NET Macro To Group and Sort Your Using Statements

Thursday, May 12, 2011 9:06 AM by weblogs.asp.net

Vs net macro to group and sort your using statements.. Nifty :)

# re: VS.NET Macro To Group and Sort Your Using Statements

Sunday, June 26, 2011 11:37 AM by weblogs.asp.net

Vs net macro to group and sort your using statements.. Dandy :)

Leave a Comment

(required) 
(required) 
(optional)
(required)