We all know Resharper and how it makes our lives as Visual studio users so much better.

But alas, sometimes there is this one little thing missing.

If you used resharper you will have noticed that if your filename and typename don’t match up it shows you the “rename file to match typename” quick fix.

But not the other way around “Rename type to macth filename”. Which is odd because sometimes that can be handy. In case you edited the filename and forgot to edit the classname to match.

How I did it

First of all you need Resharper 7 and you need the resharper 7 SDK. Both can be found on the Resharper download page.

Then you need to create a new Resharper 7.0 plugin project.

You then need to inherit from ContextActionBase.

Imports JetBrains.ReSharper.Feature.Services.Bulbs
Imports JetBrains.ReSharper.Intentions.Extensibility
Imports JetBrains.ReSharper.Feature.Services.VB.Bulbs
Imports JetBrains.Util
Imports JetBrains.ProjectModel
Imports JetBrains.Application.Progress
Imports JetBrains.TextControl

Public Class ClassNameToFileNameQuickFixAction
    Inherits ContextActionBase

    Private _provider As IVBContextActionDataProvider
    Public Sub New(dataProvider As IVBContextActionDataProvider)
        _provider = dataProvider
    End Sub

    Protected Overrides Function ExecutePsiTransaction(ByVal solution As ISolution, ByVal progress As IProgressIndicator) As System.Action(Of ITextControl)
        Dim literal = _provider.GetSelectedElement(Of JetBrains.ReSharper.Psi.Tree.ITypeDeclaration)(True, True)
        If (literal IsNot Nothing) Then
            literal.SetName(literal.GetSourceFile().Name.Substring(0, literal.GetSourceFile().Name.Length - 3))
        End If
        Return Nothing
    End Function

    Public Overrides ReadOnly Property Text As String
            Return "Rename class to match filename"
        End Get
    End Property

    Public Overrides Function IsAvailable(ByVal cache As IUserDataHolder) As Boolean
        Dim literal = _provider.GetSelectedElement(Of JetBrains.ReSharper.Psi.Tree.ITypeDeclaration)(True, True)
        If (literal IsNot Nothing AndAlso Not literal.DeclaredName & ".vb" = literal.GetSourceFile().Name) Then
            Return True
        End If
        Return False
    End Function

End Class

The Property you see is the text that will be shown when the quickfix is available. The code in the Isavailable method tells it when to show the quickfix and the ExecutePsiTransaction tells it what to do when the user clicks on that quickfix.

So now I just have to build the project and copy the dll over to the Plugins folder of resharper %programFiles%JetBrainsReSharperv7.0BinPlugins. Which you may have to create because in my case it did not exists.

And now after restarting VS I see this when I Alt Enter on the classname when filename and classname don’t match.

And when I select my new plugin I get this as the result.

Woohoo, it works.


This was a proof of concept because I’m sure this won’t always work and it needs a C# version but I will add that later, should be simple enough.