diff --git a/Net.Sdk.Web.Extensions.SourceGenerators/Net.Sdk.Web.Extensions.SourceGenerators.csproj b/Net.Sdk.Web.Extensions.SourceGenerators/Net.Sdk.Web.Extensions.SourceGenerators.csproj index 83eb846..71b8e3c 100644 --- a/Net.Sdk.Web.Extensions.SourceGenerators/Net.Sdk.Web.Extensions.SourceGenerators.csproj +++ b/Net.Sdk.Web.Extensions.SourceGenerators/Net.Sdk.Web.Extensions.SourceGenerators.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 0.8.10 + 0.8.11 latest true Alexandru Macocian diff --git a/Net.Sdk.Web.Extensions.SourceGenerators/RouteFilterAttributeGenerator.cs b/Net.Sdk.Web.Extensions.SourceGenerators/RouteFilterAttributeGenerator.cs new file mode 100644 index 0000000..3f19e10 --- /dev/null +++ b/Net.Sdk.Web.Extensions.SourceGenerators/RouteFilterAttributeGenerator.cs @@ -0,0 +1,42 @@ +using Microsoft.CodeAnalysis; +using Sybil; +using System; + +namespace Net.Sdk.Web.Extensions.SourceGenerators; + +[Generator(LanguageNames.CSharp)] +#nullable enable +public class RouteFilterAttributeGenerator : IIncrementalGenerator +{ + public void Initialize(IncrementalGeneratorInitializationContext context) + { + context.RegisterPostInitializationOutput(GenerateRouteFilterAttribute); + } + + private static void GenerateRouteFilterAttribute(IncrementalGeneratorPostInitializationContext context) + { + var builder = SyntaxBuilder.CreateCompilationUnit() + .WithNamespace( + SyntaxBuilder.CreateNamespace(Constants.Namespace) + .WithClass(SyntaxBuilder.CreateClass(Constants.RouteFilterAttributeName) + .WithModifier(Constants.Public) + .WithConstructor(SyntaxBuilder.CreateConstructor(Constants.RouteFilterAttributeName) + .WithModifier(Constants.Public)) + .WithAttribute(SyntaxBuilder.CreateAttribute("AttributeUsage") + .WithArgument(AttributeTargets.Class | AttributeTargets.Method) + .WithArgument("Inherited", false) + .WithArgument("AllowMultiple", true)) + .WithBaseClass(nameof(Attribute)) + .WithProperty(SyntaxBuilder.CreateProperty($"{Constants.TypeType}?", Constants.RouteFilterTypePropertyName) + .WithModifier(Constants.Public) + .WithAccessor(SyntaxBuilder.CreateGetter()) + .WithAccessor(SyntaxBuilder.CreateSetter())))); + + + var syntax = builder.Build(); + var source = syntax.ToFullString(); + context.AddSource($"{Constants.RouteFilterAttributeName}.g", $"#nullable enable\n{source}\n#nullable disable\n"); + } +} + +#nullable disable \ No newline at end of file diff --git a/Net.Sdk.Web.Extensions.SourceGenerators/UseRoutesGenerator.cs b/Net.Sdk.Web.Extensions.SourceGenerators/UseRoutesGenerator.cs index 6eccbd1..2e786d9 100644 --- a/Net.Sdk.Web.Extensions.SourceGenerators/UseRoutesGenerator.cs +++ b/Net.Sdk.Web.Extensions.SourceGenerators/UseRoutesGenerator.cs @@ -16,8 +16,6 @@ public class UseRoutesGenerator : IIncrementalGenerator { public void Initialize(IncrementalGeneratorInitializationContext context) { - context.RegisterPostInitializationOutput(GenerateRouteFilterAttribute); - var classDeclarations = context.SyntaxProvider.CreateSyntaxProvider( predicate: static (s, _) => s is ClassDeclarationSyntax, transform: static (ctx, _) => GetFilteredClassDeclarationSyntax(ctx)).Where(static c => c is not null); @@ -293,31 +291,6 @@ public class UseRoutesGenerator : IIncrementalGenerator return GetParentOfType(syntaxNode.Parent); } - - private static void GenerateRouteFilterAttribute(IncrementalGeneratorPostInitializationContext context) - { - var builder = SyntaxBuilder.CreateCompilationUnit() - .WithNamespace( - SyntaxBuilder.CreateNamespace(Constants.Namespace) - .WithClass(SyntaxBuilder.CreateClass(Constants.RouteFilterAttributeName) - .WithModifier(Constants.Public) - .WithConstructor(SyntaxBuilder.CreateConstructor(Constants.RouteFilterAttributeName) - .WithModifier(Constants.Public)) - .WithAttribute(SyntaxBuilder.CreateAttribute("AttributeUsage") - .WithArgument(AttributeTargets.Class | AttributeTargets.Method) - .WithArgument("Inherited", false) - .WithArgument("AllowMultiple", true)) - .WithBaseClass(nameof(Attribute)) - .WithProperty(SyntaxBuilder.CreateProperty($"{Constants.TypeType}?", Constants.RouteFilterTypePropertyName) - .WithModifier(Constants.Public) - .WithAccessor(SyntaxBuilder.CreateGetter()) - .WithAccessor(SyntaxBuilder.CreateSetter())))); - - - var syntax = builder.Build(); - var source = syntax.ToFullString(); - context.AddSource($"{Constants.RouteFilterAttributeName}.g", $"#nullable enable\n{source}\n#nullable disable\n"); - } } #nullable disable \ No newline at end of file