GeneratorConsole/GeneratorLib/HelloWorldGenerator.cs
2025-03-05 08:59:53 -07:00

56 lines
1.7 KiB
C#

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using System.Collections.Immutable;
using System.Text;
namespace GeneratorLib;
[Generator(LanguageNames.CSharp)]
public class HelloWorldGenerator : IIncrementalGenerator
{
public void Initialize(IncrementalGeneratorInitializationContext context)
{
var provider = context.SyntaxProvider.CreateSyntaxProvider(
static (syntaxNode, _) => syntaxNode is ClassDeclarationSyntax,
static (generatorSyntaxContext, _) => (ClassDeclarationSyntax)generatorSyntaxContext.Node)
.Where(static node => node != null);
var compilation = context.CompilationProvider.Combine(provider.Collect());
context.RegisterSourceOutput(compilation, ExecuteHelloWorldGeneration);
}
private static void ExecuteHelloWorldGeneration(SourceProductionContext context, (Compilation compilation, ImmutableArray<ClassDeclarationSyntax> classDeclarationSyntax) compilationProvider)
{
// Also tried "HelloWorld" and "HelloWorld.cs".
const string hintName = "HelloWorld.g.cs";
// const string sourceText = """
//namespace HelloNamespace
//{
// public static class HelloWorld
// {
// public static void SayHello()
// {
// Console.WriteLine(""Hello, World!"");
// }
// }
//}
//""";
string sourceText = new StringBuilder()
.AppendLine("namespace HelloNamespace")
.AppendLine("{")
.AppendLine("\tpublic class HelloWorld")
.AppendLine("\t{")
.AppendLine("\t\tpublic static void SayHello()")
.AppendLine("\t\t{")
.AppendLine("\t\t\tConsole.WriteLine(\"Hello, World!\");")
.AppendLine("\t\t}")
.AppendLine("\t}")
.AppendLine("}")
.ToString();
context.AddSource(hintName, sourceText);
}
}