Automating File Header Information with ReSharper



[Update: ReSharper 6 now support Macros in File Headers. See the following post for more information]


Many OSS projects often have some license information at the top of each file, reminding you of the evils you need to comply with. Some companies also have policies in place that require every single file to have company information. It would be quite cumbersome if one would have to constantly and manually enter this information. Fortunately though, you don’t need to.  Let’s examine the various ways to do this.

Inserting File Headers during Code Cleanup

ReSharper offers the possibility of running code cleanup on your file, project or solution. As it’s name indicates, Code Cleanup can clean up certain aspects of your files, like optimizing using statements, formatting the layout of type members, removing code redundancies, changing explicit type declarations to use var, and much more.

One of these options is to insert File Headers. For this, it uses the File Header values defined in ReSharper | Options | Languages | File Header. Therefore, the first step to take advantage of this feature is to define the header:

SNAGHTML1028ee97

We can optionally add a region name in the Embrace File Header into Region with Name. By doing so, ReSharper will wrap the header inside a region (currently the File Header is global across solutions).

Once we have the header defined, all we need to do is activate the option in the Code Cleanup. We can either activate it in an existing profile or create a new profile specific for Header insertion. To do so, we invoke the Code Clean up (Cltr+E,C in VS Scheme) and select Edit Profiles

SNAGHTML102e43a9

We then create a new Profile by clicking on Add, and giving it a name, for instance File Header Insertion.

SNAGHTML102f5fef

We then need to select all the cleanup operations we want to happen when we run the profile. In our case, we’re exclusively interested in the Update File Header.

Our newly created profile should now appear as an option when invoking code cleanup. To apply the cleanup to a file, we can invoke it when editing the file or having it selected in the Solution Explorer. To apply to the project, we select the Project. And as expected, selecting the entire Solution will apply the cleanup solution-wide. In our case, we want to apply the licensing to the entire solution

image

That’s it. With one action we’ve applied licensing to our entire solution.

Automating File Headers with File Templates

The previous solution works great when we want to apply licensing on a global scale. The downside is that it’s the same across different solutions. What happens if we want to customize it based on project? One other issue is that it does not  support any type of macros. As such, we cannot insert values such as the filename or date the file was created.

An alternative to this approach could be create file headers when we create the actual files, for which we can use File Templates. (we’ve covered File Templates in details in an earlier post). Let’s see how we can apply this to class creation.

We create a new template under Shared Solution Templates in File Templates

image

in this case called Licensed Class. The definition of the template is:

SNAGHTML1128e92f

which is the default class template, to which we have added a region with the license information and two additional macros: Filename and Date Created. There are corresponding Macros in ReSharper to obtain this information so no need to extend the functionality. We do set the Editable Occurrence of each Macro to false so that ReSharper does not prompt us for values.

The final step is to make this template accessible when creating classes (using Cltr+Alt+Ins). To do that, we need to drag it and drop it on the Quicklist as shown

image

Now when creating a new file, we get Licensed Class as the first entry

image

When we switch to a different solution, the Licensed Class will not be available, so it will not interfere with other solutions were this type of header is not required. Obviously, we could generalize this by modifying the built-in template as well as apply it to other templates (template embedding might be a good feature here!)

Like everything, this also has it’s downsides. First of all, you cannot *apply* this to existing classes since it’s on creation. Secondly, if you run code cleanup with a new File Header, it will overwrite the existing one. The one advantage it does have is that you can place that template anywhere you want. So for instance if you prefer your license information to be at the bottom of the file, you can do that.

Using StyleCop for ReSharper to provide Company and Copyright Information

If you’re not familiar with StyleCop, it’s a tool for Microsoft that highlights certain coding styles. Howard van Rooijen wrote a plug-in for ReSharper that makes using StyleCop much easier and more interactive. Check it out if you’re not familiar with it.

One of the *rules* that StyleCop recommends is for files to have headers with information about author/company, etc. When you install StyleCop for ReSharper, it creates some options under ReSharper | Options as well as entries under the Code Cleanup options.

SNAGHTML113a8050

In order to define the information required, we can right-click on the Project Properties and select StyleCop Settings

image

and enter the information under Company Information

SNAGHTML113c9a07

By just enable StyleCop for ReSharper, we already get quickfixes on our files to provide header information

image

which generates

image

and we can apply it globally using the Code Cleanup Options that StyleCop adds

image

It is important to note that the license information would need to be provided independently using the File Header option of ReSharper. What StyleCop for ReSharper provides is the ability to combine this information with it’s own.

Summary

Based on the type of information we want included, as well as the scope, we can pick one of the different options presented here or combine them when appropriate. Right now the File Header option in ReSharper is slightly limited in the functionality it offers but already suggestions have been made to improve it. If there’s something you’d like, please either log it in YouTrack or leave a comment here.

This entry was posted in News and Events and tagged . Bookmark the permalink.

10 Responses to Automating File Header Information with ReSharper

  1. Keith Nicholas says:

    sooooo…..

    resharper EAP 6? :)

  2. Hadi Hariri says:

    It’s coming………………………

    Seriously though. Minor glitch. We’re working on it. Hope to deliver ASAP.

  3. tim says:

    I have about a dozen projects I would like to apply copyright and header information on ala the Resharper plugin. How can I do it in one swoop?

  4. Hadi Hariri says:

    @Tim

    Easiest way is to just open it in ReSharper, configure a code-cleanup to apply headers as shown in the blog post and hit Cleanup on entire solution.

  5. tim says:

    I added $USER_NAME$ to my File Header Text.
    Three questions:
    1. I can see and use the File Header Insertion to add the Author field to my header, along with the Style cop settings, but this overwrites any existing summary information.
    2. The Author is empty, how do I fill $USER_NAME$
    3. Default Full Cleanup removes the Author tags…

  6. tim says:

    It seems I cannot modify Default Full Cleanup to add my File Header Text?

  7. tim says:

    Another strange thing, when I do File Header Insertion on a single file, it doesn’t add summary, but when I go through the project it does.

  8. Hadi Hariri says:

    @Tim

    Just create a new profile, but you should be able to modify…

  9. Prashant says:

    Is there a way to disable the double forward slashes when adding the file header. For example the file header text is ‘/* this is a test */’

    The final outcome is ///* this is a test */.

    Can you disable the double forward slashes?

    Thanks.

  10. Hadi Hariri says:

    @Prashant,

    Unfortunately not.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">