Giter VIP home page Giter VIP logo

compilerattributes's Introduction

CompilerAttributes

NuGet version (CompilerAttributes) Build status MyGet Build Status Percentage of issues still open Average time to resolve an issue

Discuss on Slack

ReSharper

We've all been in the situation where we wanted the compiler to interpret custom attributes like it does for Obsolete. Sadly, the compiler is hardwired to recognize only that one.

Until now! This project is a 2-in-1 library that contains a Roslyn analyzer and a couple of attributes that you can use to create compiler-recognized attributes to your heart's content!

It's published via a Nuget package that gets installed both as an analyzer and as a library reference. Here's how it works:

Install the Nuget packages

Install-Package CompilerAttributes

Create an attribute

This attribute is what you'll use to decorate identifiers that should generate a warning or error.

public class MyAttributeAttribute : Attribute
{
}

NOTE By convention, attribute class names are suffixed with "Attribute". When they're used, the suffix can be omitted. Thus using the above attribute will look like [MyAttribute].

Decorate your attribute

CompilerAttributes provides two attributes to mark your attribute as one that generates compiler output: GeneratesWarningAttribute and GeneratesErrorAttribute. Pick one and decorate your attribute with it.

[GeneratesWarning("{0} generated a warning")]
public class MyAttributeAttribute : Attribute
{
}

The single argument that is passed into the attribute is the message that will appear in the compiler output. It supports up to a single string format argument (i.e. {0}) that will be replaced with the identifier name.

Enjoy the fruits of your labor

Now whenever you use the MyAttribute attribute on something that thing will generate a compiler warning.

[MyAttribute]
public class Class1
{
}

// later

var instance = new Class1();        // this line generates a warning that says "Class1 generated a warning"

Backstory

I originally created this because I needed a way to indicate that some features I was working on for Manatee.Json were going to be experimental, kind of an opposite of the Obsolete attribute.

Contributing

If you have questions, experience problems, or feature ideas, please create an issue.

If you'd like to help out with the code, please feel free to fork and create a pull request.

The Project

This code uses C# 7 features, so a compiler/IDE that supports these features is required.

There are three solutions:

  • ComplierAttributes - This is the main solution that builds the Nuget package. It contains three projects the main project, a test project, and a VISX generating project. Though I don't publish from the VISX project, it's immensely useful for debugging. It will start a new instance of VS under a different profile and install the VISX. From there, you just need to open a solution. That's where the other solution comes in.
  • ClassLibrary1 - This has some boilerplate code that gives as many examples of usage of a symbol that I cared to think of. Happily, all of these usages are underlined with little green squigglies, and the error output shows a bunch of warnings.
  • AutoBuild - This one just contains the main project. I use it to isolate this project as part of my CI process. Just ignore it.

Building

During development, building within Visual Studio should be fine.

I don't use the test project right now. It was added as part of the template. It could use some test cases... eventually.

Code style and maintenance

I use Jetbrains Resharper in Visual Studio to maintain the code style (and for many of the other things that it does). The solution is set up with team style settings, so if you're using Resharper the settings should automatically load. Please follow the suggestions.

compilerattributes's People

Contributors

gregsdennis avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.