67 lines
2.1 KiB
C#
67 lines
2.1 KiB
C#
using Microsoft.CodeAnalysis;
|
|
using Microsoft.CodeAnalysis.Text;
|
|
|
|
namespace MfGames.Nitride.Generators;
|
|
|
|
/// <summary>
|
|
/// Base class for classes marked with an attribute.
|
|
/// </summary>
|
|
public abstract class ClassAttributeSourceGeneratorBase<TSyntaxReceiver>
|
|
: ISourceGenerator
|
|
where TSyntaxReceiver : ClassAttributeSyntaxReceiverBase
|
|
{
|
|
public void Execute(GeneratorExecutionContext context)
|
|
{
|
|
// Get the generator infrastructure will create a receiver and
|
|
// populate it we can retrieve the populated instance via the
|
|
// context.
|
|
if (context.SyntaxReceiver is not TSyntaxReceiver syntaxReceiver)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Report any messages.
|
|
foreach (string? message in syntaxReceiver.Messages)
|
|
{
|
|
context.Warning(
|
|
MessageCode.Debug,
|
|
Location.Create(
|
|
"Temporary.g.cs",
|
|
TextSpan.FromBounds(0, 0),
|
|
new LinePositionSpan(
|
|
new LinePosition(0, 0),
|
|
new LinePosition(0, 0))),
|
|
"{0}: Syntax Message: {1}",
|
|
this.GetType().Name,
|
|
message);
|
|
}
|
|
|
|
// If we didn't find anything, then there is nothing to do.
|
|
if (syntaxReceiver.ReferenceList.Count == 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Go through each one.
|
|
foreach (ClassAttributeReference reference in syntaxReceiver
|
|
.ReferenceList)
|
|
{
|
|
this.GenerateClassFile(context, reference);
|
|
}
|
|
}
|
|
|
|
public void Initialize(GeneratorInitializationContext context)
|
|
{
|
|
// Register a factory that can create our custom syntax receiver
|
|
context.RegisterForSyntaxNotifications(
|
|
() => this.CreateSyntaxReceiver(context));
|
|
}
|
|
|
|
protected abstract TSyntaxReceiver CreateSyntaxReceiver(
|
|
GeneratorInitializationContext context);
|
|
|
|
protected abstract void GenerateClassFile(
|
|
GeneratorExecutionContext context,
|
|
ClassAttributeReference reference);
|
|
}
|