mirror of
https://github.com/AlexMacocian/Net.Sdk.Web.Extensions.git
synced 2026-07-15 13:39:29 +00:00
51 lines
2.4 KiB
C#
51 lines
2.4 KiB
C#
using System;
|
|
using Microsoft.CodeAnalysis;
|
|
using Sybil;
|
|
|
|
namespace Net.Sdk.Web.Extensions.SourceGenerators;
|
|
|
|
[Generator(LanguageNames.CSharp)]
|
|
#nullable enable
|
|
public class MapAttributeGenerator : IIncrementalGenerator
|
|
{
|
|
public void Initialize(IncrementalGeneratorInitializationContext context)
|
|
{
|
|
context.RegisterPostInitializationOutput(context =>
|
|
{
|
|
GenerateMapAttribute(context, Constants.GetAttributeName);
|
|
GenerateMapAttribute(context, Constants.PostAttributeName);
|
|
GenerateMapAttribute(context, Constants.PutAttributeName);
|
|
GenerateMapAttribute(context, Constants.DeleteAttributeName);
|
|
});
|
|
}
|
|
|
|
private static void GenerateMapAttribute(IncrementalGeneratorPostInitializationContext context, string attributeName)
|
|
{
|
|
var builder = SyntaxBuilder.CreateCompilationUnit()
|
|
.WithNamespace(
|
|
SyntaxBuilder.CreateNamespace(Constants.Namespace)
|
|
.WithClass(SyntaxBuilder.CreateClass(attributeName)
|
|
.WithModifier(Constants.Public)
|
|
.WithConstructor(SyntaxBuilder.CreateConstructor(attributeName)
|
|
.WithModifier(Constants.Public)
|
|
.WithBody($"this.{Constants.PatternPropertyName} = string.Empty;"))
|
|
.WithConstructor(SyntaxBuilder.CreateConstructor(attributeName)
|
|
.WithModifier(Constants.Public)
|
|
.WithParameter(Constants.StringType, Constants.PatternArgumentName)
|
|
.WithBody($"this.{Constants.PatternPropertyName} = {Constants.PatternArgumentName};"))
|
|
.WithAttribute(SyntaxBuilder.CreateAttribute("AttributeUsage")
|
|
.WithArgument(AttributeTargets.Method)
|
|
.WithArgument("Inherited", false)
|
|
.WithArgument("AllowMultiple", false))
|
|
.WithBaseClass(nameof(Attribute))
|
|
.WithProperty(SyntaxBuilder.CreateProperty(Constants.StringType, Constants.PatternPropertyName)
|
|
.WithModifier(Constants.Public)
|
|
.WithAccessor(SyntaxBuilder.CreateGetter()))));
|
|
|
|
var syntax = builder.Build();
|
|
var source = syntax.ToFullString();
|
|
context.AddSource($"{attributeName}.g", source);
|
|
}
|
|
}
|
|
|
|
#nullable disable |