using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Text;
namespace GameCult.Caching.MessagePack.Generator
{
[Generator]
public class CultDocumentMessagePackGenerator : IIncrementalGenerator
{
public void Initialize(IncrementalGeneratorInitializationContext context)
{
var documentTypes = context.SyntaxProvider
.CreateSyntaxProvider(
static (node, _) => node is ClassDeclarationSyntax cds && cds.AttributeLists.Count > 0,
static (ctx, _) => ctx.SemanticModel.GetDeclaredSymbol(ctx.Node) as INamedTypeSymbol)
.Where(static symbol => symbol is not null)!
.Select((symbol, _) => symbol!)
.Where(static symbol => symbol.GetAttributes().Any(attribute =>
attribute.AttributeClass?.ToDisplayString() == "GameCult.Caching.CultDocumentAttribute"));
context.RegisterSourceOutput(documentTypes.Collect(), (spc, types) =>
{
var builder = new StringBuilder();
builder.AppendLine("// ");
builder.AppendLine("#nullable enable");
builder.AppendLine("using MessagePack.Formatters;");
builder.AppendLine("namespace GameCult.Caching.MessagePack");
builder.AppendLine("{");
builder.AppendLine(" public static partial class GeneratedCultDocumentResolvers");
builder.AppendLine(" {");
builder.AppendLine(" public static IMessagePackFormatter? GetFormatter()");
builder.AppendLine(" {");
builder.AppendLine(" return null;");
builder.AppendLine(" }");
builder.AppendLine(" }");
builder.AppendLine("}");
spc.AddSource("GeneratedCultDocumentResolvers.g.cs", SourceText.From(builder.ToString(), Encoding.UTF8));
});
}
}
}