redesign: Agents

This commit is contained in:
h z
2025-02-27 15:39:27 +00:00
parent 302d11e2dd
commit 03468ad89c

View File

@@ -0,0 +1,57 @@
using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace Polonium.Generators.Generators;
[Generator]
public class PoloniumFactoryGenerator : AssetProcessGenerator
{
public override void Execute(GeneratorExecutionContext context)
{
if (!(context.SyntaxReceiver is ClassSyntaxReceiver receiver))
return;
StringBuilder sb = new();
sb
.AppendLine("using System;")
.AppendLine("using Polonium.Attributes;")
.AppendLine("using Polonium.Interfaces;")
.AppendLine("using Polonium.Resources;")
.AppendLine("[AutoRegister]")
.AppendLine("public class PoloniumFactoryRegister")
.AppendLine("{")
.AppendLine(" public static void Register()")
.AppendLine(" {")
.AppendLine(" GlobalRegistry.PoloniumFactory = new PoloniumFactory();")
.AppendLine(" }")
.AppendLine(" public class PoloniumFactory : IPoloniumFactory")
.AppendLine(" {")
.AppendLine(" public SignalHeader CreateSignalHeader()")
.AppendLine(" {");
Compilation compilation = context.Compilation;
INamedTypeSymbol? signalHeader = compilation.GetTypeByMetadataName("Polonium.Resources.SignalHeader");
bool founded = false;
foreach (ClassDeclarationSyntax cls in receiver.Classes)
{
SemanticModel semanticModel = compilation.GetSemanticModel(cls.SyntaxTree);
INamedTypeSymbol? nCls = semanticModel.GetDeclaredSymbol(cls) as INamedTypeSymbol;
if(nCls is null)
continue;
if (IsDerivedFrom(nCls, signalHeader) && !nCls.IsAbstract)
{
sb.AppendLine($" return new {nCls.ToDisplayString()}();");
founded = true;
break;
}
}
if (!founded)
sb.AppendLine($" throw new NotImplementedException();");
sb
.AppendLine(" }")
.AppendLine(" }")
.AppendLine("}");
context.AddSource("PoloniumFactoryRegistry.g.cs", sb.ToString());
}
}