RhoMicro.CodeAnalysis.UtilityGenerators
16.0.4
See the version list below for details.
dotnet add package RhoMicro.CodeAnalysis.UtilityGenerators --version 16.0.4
NuGet\Install-Package RhoMicro.CodeAnalysis.UtilityGenerators -Version 16.0.4
<PackageReference Include="RhoMicro.CodeAnalysis.UtilityGenerators" Version="16.0.4"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
paket add RhoMicro.CodeAnalysis.UtilityGenerators --version 16.0.4
#r "nuget: RhoMicro.CodeAnalysis.UtilityGenerators, 16.0.4"
// Install RhoMicro.CodeAnalysis.UtilityGenerators as a Cake Addin #addin nuget:?package=RhoMicro.CodeAnalysis.UtilityGenerators&version=16.0.4 // Install RhoMicro.CodeAnalysis.UtilityGenerators as a Cake Tool #tool nuget:?package=RhoMicro.CodeAnalysis.UtilityGenerators&version=16.0.4
What is this?
This project contains generators and analyzers that help writing generators and analyzers.
Currently, there are two generators contained within:
LibraryGenerator
- provides expanding macro string builders, diagnostics accumulators and more
AttributeFactoryGenerator
- automates parsing instructions from
AttributeData
- automates parsing instructions from
Installation
<PackageReference Include="RhoMicro.CodeAnalysis.UtilityGenerators" Version="*">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
LibraryGenerator
Generates types that help with source code generators & analyzers. A more detailed section is coming soon.
AttributeFactoryGenerator
Are you creating source generators for C#? Are you using attributes to allow your consumers to instruct your generator? Are you dissatisfied with the amount of boilerplate you have to write in order to extract those instructions from the roslyn api?
Then this project could be of use to you!
Key Features & Limitations
- Generate Factory for parsing attribute instance from
AttributeData
- Generate helper functions for retrieving instances of your attribute from an
IEnumerable<AttributeData>
- Parse type properties as
ITypeSymbol
s - Generate the attribute source text itself (no requirement for second attribute library)
How to use
Add a compilation flag to your generator project:
<PropertyGroup>
<DefineConstants>$(DefineConstants);GENERATOR</DefineConstants>
</PropertyGroup>
Declare an attribute like so:
[AttributeUsage(AttributeTargets.Class)]
#if GENERATOR
[RhoMicro.CodeAnalysis.GenerateFactory]
#endif
public partial class TestGeneratorTargetAttribute : Attribute
{
#if GENERATOR
[ExcludeFromFactory]
private TestGeneratorTargetAttribute(System.Object typeSymbolContainer) =>
_typeSymbolContainer = typeSymbolContainer;
#endif
public TestGeneratorTargetAttribute(String name, Int32[] ages)
{
Name = name;
Ages = ages;
}
public TestGeneratorTargetAttribute(Type type) => Type = type;
public String Name { get; }
public Int32[] Ages { get; }
public Type? Type { get; set; }
}
The constructor enclosed in the preprocessor condition is required in order to construct an instance when the consumer made use of a constructor taking at least one parameter of type Type
.
For every constructor that takes at least one parameter of type Type
, an equivalent factory constructor is required. These are expected to take an instance of Object
instead of the type and assign it to the generated helper field.
This way, a generated helper property of type ITypeSymbol
may be used to retrieve the type used by the consumer in their typeof
expression.
Use the generated factory and helper methods like so:
ImmutableArray<AttributeData> attributes =
symbol.GetAttributes();
IEnumerable<TestGeneratorTargetAttribute> allParsed =
attributes.OfTestGeneratorTargetAttribute();
TestGeneratorTargetAttribute singleParsed =
TestGeneratorTargetAttribute.TryCreate(attributes[0], out var a) ?
a :
null;
singleParsed =
symbol.TryGetFirstTestGeneratorTargetAttribute(out var a) ?
a :
null;
context.RegisterPostInitializationOutput(
c => c.AddSource($"{nameof(TestGeneratorTargetAttribute)}.g.cs", TestGeneratorTargetAttribute.SourceText));
The generated extension method OfTestGeneratorTargetAttribute
will return all instances of TestGeneratorTargetAttribute
found in the symbols list of attributes.
The generated extension method TryGetFirstTestGeneratorTargetAttribute
attempts to retrieve the first instance of TestGeneratorTargetAttribute
found on the symbol.
The generated extension method ForTestGeneratorTargetAttribute
makes use of the efficient FAWMN
api.
Building The Project
This project is running the generators contained against itself. To do this, run the bootstrap.ps1
script.
Learn more about Target Frameworks and .NET Standard.
-
.NETStandard 2.0
- Microsoft.CodeAnalysis.CSharp (>= 4.12.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
17.0.2 | 44 | 12/24/2024 |
16.1.2 | 69 | 12/22/2024 |
16.1.1 | 72 | 12/21/2024 |
16.1.0 | 73 | 12/20/2024 |
16.0.4 | 91 | 12/18/2024 |
16.0.3 | 77 | 12/18/2024 |
16.0.0 | 88 | 12/18/2024 |
15.3.4 | 170 | 12/7/2024 |
15.3.3 | 80 | 12/7/2024 |
15.3.2 | 84 | 12/7/2024 |
15.3.1 | 88 | 12/7/2024 |
15.3.0 | 93 | 12/6/2024 |
15.2.4 | 100 | 12/6/2024 |
15.2.3 | 102 | 12/6/2024 |
15.1.7 | 228 | 7/15/2024 |
15.1.6 | 176 | 6/11/2024 |
15.1.5 | 187 | 3/26/2024 |
15.1.4 | 126 | 3/26/2024 |
15.1.3 | 213 | 3/11/2024 |
15.1.2 | 147 | 3/8/2024 |
15.1.1 | 172 | 3/4/2024 |
15.1.0 | 153 | 2/28/2024 |
15.0.1 | 124 | 2/22/2024 |
15.0.0 | 169 | 2/20/2024 |
14.0.5 | 148 | 2/19/2024 |
14.0.4 | 97 | 2/19/2024 |
14.0.3 | 106 | 2/19/2024 |
14.0.2 | 130 | 2/15/2024 |
14.0.0 | 129 | 2/15/2024 |
14.0.0-alpha.30 | 60 | 2/15/2024 |
14.0.0-alpha.29 | 53 | 2/15/2024 |
14.0.0-alpha.28 | 55 | 2/15/2024 |
14.0.0-alpha.27 | 58 | 2/15/2024 |
14.0.0-alpha.26 | 62 | 2/15/2024 |
14.0.0-alpha.25 | 59 | 2/15/2024 |
14.0.0-alpha.24 | 63 | 2/15/2024 |
14.0.0-alpha.22 | 58 | 2/15/2024 |
14.0.0-alpha.20 | 62 | 2/15/2024 |
13.0.0 | 228 | 1/8/2024 |
12.1.2 | 163 | 1/6/2024 |
12.1.1 | 146 | 1/6/2024 |
12.1.0 | 134 | 1/6/2024 |
12.0.9 | 178 | 1/5/2024 |
12.0.8 | 160 | 1/5/2024 |
11.0.0 | 160 | 12/16/2023 |
8.0.3 | 139 | 12/11/2023 |
8.0.2 | 157 | 12/11/2023 |
8.0.0 | 186 | 12/11/2023 |