From 3df637ab84f9784254197b54f4915640a7db6dea Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Fri, 16 May 2025 18:02:04 +1000 Subject: [PATCH] Migrate `BizHawk.SrcGen.*` to `IIncrementalGenerator` --- .../ReflectionCacheGenerator.cs | 31 ++++++++++----- .../BizHawk.SrcGen.SettingsUtil.csproj | 3 ++ .../DefaultSetterGenerator.cs | 36 +++++++----------- .../VersionInfoGenerator.cs | 13 ++++--- References/BizHawk.SrcGen.ReflectionCache.dll | Bin 23040 -> 24064 bytes References/BizHawk.SrcGen.SettingsUtil.dll | Bin 22528 -> 23040 bytes References/BizHawk.SrcGen.VersionInfo.dll | Bin 11264 -> 20480 bytes 7 files changed, 45 insertions(+), 38 deletions(-) diff --git a/ExternalProjects/BizHawk.SrcGen.ReflectionCache/ReflectionCacheGenerator.cs b/ExternalProjects/BizHawk.SrcGen.ReflectionCache/ReflectionCacheGenerator.cs index a0aed303b7..dbaa1c74a1 100644 --- a/ExternalProjects/BizHawk.SrcGen.ReflectionCache/ReflectionCacheGenerator.cs +++ b/ExternalProjects/BizHawk.SrcGen.ReflectionCache/ReflectionCacheGenerator.cs @@ -7,9 +7,9 @@ using System.Text; using BizHawk.Analyzers; [Generator] -public sealed class ReflectionCacheGenerator : ISourceGenerator +public sealed class ReflectionCacheGenerator : IIncrementalGenerator { - private sealed class ReflectionCacheGenSyntaxReceiver : ISyntaxReceiver + private sealed class NamespaceInferrer { /// /// I may have just added RNG to the build process... @@ -35,9 +35,9 @@ public sealed class ReflectionCacheGenerator : ISourceGenerator return ns[ns.Length - 1] == '.' ? ns.Substring(0, ns.Length - 1) : ns; // trim trailing '.' (can't use BizHawk.Common from Source Generators) } - public void OnVisitSyntaxNode(SyntaxNode syntaxNode) + public void AddSample(NamespaceDeclarationSyntax syn) { - if (_namespace != null || syntaxNode is not NamespaceDeclarationSyntax syn) return; + if (_namespace is not null) return; var newNS = syn.Name.ToMetadataNameStr(); if (!newNS.StartsWith("BizHawk.", StringComparison.Ordinal)) return; _namespaces.Add(newNS); @@ -45,13 +45,24 @@ public sealed class ReflectionCacheGenerator : ISourceGenerator } } - public void Initialize(GeneratorInitializationContext context) - => context.RegisterForSyntaxNotifications(() => new ReflectionCacheGenSyntaxReceiver()); - - public void Execute(GeneratorExecutionContext context) + public void Initialize(IncrementalGeneratorInitializationContext context) + { + var nSpace = context.SyntaxProvider + .CreateSyntaxProvider( + predicate: static (syntaxNode, _) => syntaxNode is NamespaceDeclarationSyntax, + transform: static (ctx, _) => (NamespaceDeclarationSyntax) ctx.Node) + .Collect() + .Select((nsSyns, _) => + { + NamespaceInferrer shim = new(); + foreach (var syn in nsSyns) shim.AddSample(syn); + return shim.Namespace; + }); + context.RegisterSourceOutput(nSpace, Execute); + } + + public void Execute(SourceProductionContext context, string nSpace) { - if (context.SyntaxReceiver is not ReflectionCacheGenSyntaxReceiver receiver) return; - var nSpace = receiver.Namespace; var src = $@"#nullable enable using System; diff --git a/ExternalProjects/BizHawk.SrcGen.SettingsUtil/BizHawk.SrcGen.SettingsUtil.csproj b/ExternalProjects/BizHawk.SrcGen.SettingsUtil/BizHawk.SrcGen.SettingsUtil.csproj index 46dbd2596a..bb25595745 100644 --- a/ExternalProjects/BizHawk.SrcGen.SettingsUtil/BizHawk.SrcGen.SettingsUtil.csproj +++ b/ExternalProjects/BizHawk.SrcGen.SettingsUtil/BizHawk.SrcGen.SettingsUtil.csproj @@ -3,4 +3,7 @@ netstandard2.0 + + $(NoWarn);SA1135 + diff --git a/ExternalProjects/BizHawk.SrcGen.SettingsUtil/DefaultSetterGenerator.cs b/ExternalProjects/BizHawk.SrcGen.SettingsUtil/DefaultSetterGenerator.cs index 505cf1131f..ebfbbd634f 100644 --- a/ExternalProjects/BizHawk.SrcGen.SettingsUtil/DefaultSetterGenerator.cs +++ b/ExternalProjects/BizHawk.SrcGen.SettingsUtil/DefaultSetterGenerator.cs @@ -1,31 +1,24 @@ namespace BizHawk.SrcGen.SettingsUtil; -using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using System.Text; using BizHawk.Analyzers; +using TestType = (ClassDeclarationSyntax CDS, SemanticModel SemanticModel); + [Generator] -public class DefaultSetterGenerator : ISourceGenerator +public class DefaultSetterGenerator : IIncrementalGenerator { - public class SyntaxReceiver : ISyntaxContextReceiver + public void Initialize(IncrementalGeneratorInitializationContext context) { - public readonly List<(ClassDeclarationSyntax CDS, SemanticModel SemanticModel)> ClassDeclarations = new(); - - public void OnVisitSyntaxNode(GeneratorSyntaxContext context) - { - if (context.Node is ClassDeclarationSyntax cds) - { - ClassDeclarations.Add((cds, context.SemanticModel)); - } - } + var classDecls = context.SyntaxProvider.CreateSyntaxProvider( + predicate: static (syntaxNode, _) => syntaxNode is ClassDeclarationSyntax, + transform: static (ctx, _) => ((ClassDeclarationSyntax) ctx.Node, ctx.SemanticModel)); + context.RegisterSourceOutput(context.CompilationProvider.Combine(classDecls.Collect()), Execute); } - public void Initialize(GeneratorInitializationContext context) - => context.RegisterForSyntaxNotifications(() => new SyntaxReceiver()); - private static void CreateDefaultSetter(StringBuilder source, INamespaceOrTypeSymbol symbol) { var props = symbol @@ -78,13 +71,12 @@ public class DefaultSetterGenerator : ISourceGenerator "); } - public void Execute(GeneratorExecutionContext context) + public void Execute( + SourceProductionContext context, + (Compilation Compilation, ImmutableArray ClassDeclarations) value) { - if (context.SyntaxContextReceiver is not SyntaxReceiver syntaxReceiver) - { - return; - } - var consumerAttrSym = context.Compilation.GetTypeByMetadataName("BizHawk.Emulation.Common.CoreSettingsAttribute"); + var (compilation, classDeclarations) = value; + var consumerAttrSym = compilation.GetTypeByMetadataName("BizHawk.Emulation.Common.CoreSettingsAttribute"); if (consumerAttrSym is null) return; // Generated source code @@ -94,7 +86,7 @@ namespace BizHawk.Emulation.Cores public static partial class SettingsUtil {"); - foreach (var (cds, semanticModel) in syntaxReceiver.ClassDeclarations + foreach (var (cds, semanticModel) in classDeclarations .Where(tuple => tuple.CDS.AttributeLists.Matching( consumerAttrSym, tuple.SemanticModel, diff --git a/ExternalProjects/BizHawk.SrcGen.VersionInfo/VersionInfoGenerator.cs b/ExternalProjects/BizHawk.SrcGen.VersionInfo/VersionInfoGenerator.cs index ede5815976..bd8908e2c2 100644 --- a/ExternalProjects/BizHawk.SrcGen.VersionInfo/VersionInfoGenerator.cs +++ b/ExternalProjects/BizHawk.SrcGen.VersionInfo/VersionInfoGenerator.cs @@ -5,11 +5,10 @@ using System.IO; using System.Linq; [Generator] -public class VersionInfoGenerator : ISourceGenerator +public class VersionInfoGenerator : IIncrementalGenerator { - public void Initialize(GeneratorInitializationContext context) - { - } + public void Initialize(IncrementalGeneratorInitializationContext context) + => context.RegisterSourceOutput(context.CompilationProvider, Execute); private static string? ExecuteGitWithArguments(string arguments) { @@ -38,12 +37,14 @@ public class VersionInfoGenerator : ISourceGenerator #endif } - public void Execute(GeneratorExecutionContext context) + public void Execute(SourceProductionContext context, Compilation compilation) { // Finds the current project directory in order to pass to git commands. // This is written in a way to (hopefully) work both for build and IDE analyzers // FIXME: This should probably be done in a better way, but I haven't found any - string projectDir = Path.GetDirectoryName(context.Compilation.SyntaxTrees.First(x => x.HasCompilationUnitRoot && x.FilePath.Contains("BizHawk.Common")).FilePath)!; + var projectDir = Path.GetDirectoryName(compilation.SyntaxTrees + .First(static x => x.HasCompilationUnitRoot && x.FilePath.Contains("BizHawk.Common")) + .FilePath)!; var rev = ExecuteGitWithArguments($"-C {projectDir} rev-list HEAD --count") ?? string.Empty; var branch = ExecuteGitWithArguments($"-C {projectDir} rev-parse --abbrev-ref HEAD") ?? "master"; diff --git a/References/BizHawk.SrcGen.ReflectionCache.dll b/References/BizHawk.SrcGen.ReflectionCache.dll index 186a2add54808208527e9ec350d6be8542485931..2ab37c874d69d072594bcfa7490409085b98b7e8 100644 GIT binary patch delta 8548 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 OuYFM#Zt>Q2?)4jBZv1i{?#RC;xy}GC1 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 diff --git a/References/BizHawk.SrcGen.VersionInfo.dll b/References/BizHawk.SrcGen.VersionInfo.dll index 24df49135601aedb528a184d846adcd433010dcd..77d48193e7ea90700e879678eb93da9e276cdfae 100644 GIT binary patch literal 20480 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 delta 4682 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