diff --git a/ExternalProjects/AnalyzersCommon/RoslynUtils.cs b/ExternalProjects/AnalyzersCommon/RoslynUtils.cs index ae51b4353c..2c2ce1f596 100644 --- a/ExternalProjects/AnalyzersCommon/RoslynUtils.cs +++ b/ExternalProjects/AnalyzersCommon/RoslynUtils.cs @@ -6,12 +6,8 @@ using System.Threading; public static class RoslynUtils { - public static SyntaxNode? EnclosingTypeDeclarationSyntax(this CSharpSyntaxNode node) - { - var parent = node.Parent; - while (parent is not (null or TypeDeclarationSyntax)) parent = parent.Parent; - return parent; - } + public static TypeDeclarationSyntax? EnclosingTypeDeclarationSyntax(this CSharpSyntaxNode node) + => node.NearestAncestorOfType(); public static string GetMethodName(this ConversionOperatorDeclarationSyntax cods) => cods.ImplicitOrExplicitKeyword.ToString() is "implicit" @@ -132,9 +128,21 @@ public static class RoslynUtils SyntaxNodeAnalysisContext snac) => list.Matching(targetAttrSym, snac.SemanticModel, snac.CancellationToken); + public static T? NearestAncestorOfType(this CSharpSyntaxNode node) + where T : CSharpSyntaxNode + => node.Parent?.FirstAncestorOrSelf(); + public static TextSpan Slice(this TextSpan span, int start) => TextSpan.FromBounds(start: span.Start + start, end: span.End); public static TextSpan Slice(this TextSpan span, int start, int length) => new(start: span.Start + start, length: length); + + public static string ToMetadataNameStr(this NameSyntax nameSyn) + => nameSyn switch + { + QualifiedNameSyntax qual => $"{qual.Left.ToMetadataNameStr()}.{qual.Right.ToMetadataNameStr()}", + SimpleNameSyntax simple => simple.Identifier.ValueText, + _ => throw new InvalidOperationException(), + }; } diff --git a/ExternalProjects/BizHawk.SrcGen.ReflectionCache/ReflectionCacheGenerator.cs b/ExternalProjects/BizHawk.SrcGen.ReflectionCache/ReflectionCacheGenerator.cs index 1974796e43..a0aed303b7 100644 --- a/ExternalProjects/BizHawk.SrcGen.ReflectionCache/ReflectionCacheGenerator.cs +++ b/ExternalProjects/BizHawk.SrcGen.ReflectionCache/ReflectionCacheGenerator.cs @@ -4,6 +4,8 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using BizHawk.Analyzers; + [Generator] public sealed class ReflectionCacheGenerator : ISourceGenerator { @@ -35,14 +37,8 @@ public sealed class ReflectionCacheGenerator : ISourceGenerator public void OnVisitSyntaxNode(SyntaxNode syntaxNode) { - static string Ser(NameSyntax nameSyn) => nameSyn switch - { - SimpleNameSyntax simple => simple.Identifier.ValueText, - QualifiedNameSyntax qual => $"{Ser(qual.Left)}.{Ser(qual.Right)}", - _ => throw new InvalidOperationException(), - }; if (_namespace != null || syntaxNode is not NamespaceDeclarationSyntax syn) return; - var newNS = Ser(syn.Name); + var newNS = syn.Name.ToMetadataNameStr(); if (!newNS.StartsWith("BizHawk.", StringComparison.Ordinal)) return; _namespaces.Add(newNS); if (_namespaces.Count == SAMPLE_SIZE) _namespace = CalcNamespace(); diff --git a/ExternalProjects/BizHawk.SrcGen.SettingsUtil/DefaultSetterGenerator.cs b/ExternalProjects/BizHawk.SrcGen.SettingsUtil/DefaultSetterGenerator.cs index 2d4a55f182..505cf1131f 100644 --- a/ExternalProjects/BizHawk.SrcGen.SettingsUtil/DefaultSetterGenerator.cs +++ b/ExternalProjects/BizHawk.SrcGen.SettingsUtil/DefaultSetterGenerator.cs @@ -5,12 +5,14 @@ using System.Collections.Immutable; using System.Linq; using System.Text; +using BizHawk.Analyzers; + [Generator] public class DefaultSetterGenerator : ISourceGenerator { public class SyntaxReceiver : ISyntaxContextReceiver { - public readonly List<(ClassDeclarationSyntax, SemanticModel)> ClassDeclarations = new(); + public readonly List<(ClassDeclarationSyntax CDS, SemanticModel SemanticModel)> ClassDeclarations = new(); public void OnVisitSyntaxNode(GeneratorSyntaxContext context) { @@ -82,25 +84,25 @@ public class DefaultSetterGenerator : ISourceGenerator { return; } + var consumerAttrSym = context.Compilation.GetTypeByMetadataName("BizHawk.Emulation.Common.CoreSettingsAttribute"); + if (consumerAttrSym is null) return; // Generated source code var source = new StringBuilder(@" -namespace BizHawk.Common +namespace BizHawk.Emulation.Cores { public static partial class SettingsUtil {"); - foreach (var (cds, semanticModel) in syntaxReceiver.ClassDeclarations) + foreach (var (cds, semanticModel) in syntaxReceiver.ClassDeclarations + .Where(tuple => tuple.CDS.AttributeLists.Matching( + consumerAttrSym, + tuple.SemanticModel, + context.CancellationToken).Any())) { - if (cds.AttributeLists.SelectMany(e => e.Attributes) - .Any(e => e.Name.NormalizeWhitespace().ToFullString() == "CoreSettings")) - { - var symbol = semanticModel.GetDeclaredSymbol(cds, context.CancellationToken); - if (symbol is not null) // probably never happens? - { - CreateDefaultSetter(source, symbol); - } - } + var symbol = semanticModel.GetDeclaredSymbol(cds, context.CancellationToken); + if (symbol is null) continue; // probably never happens? + CreateDefaultSetter(source, symbol); } source.Append(@" diff --git a/References/BizHawk.SrcGen.ReflectionCache.dll b/References/BizHawk.SrcGen.ReflectionCache.dll index d201f895a8..186a2add54 100644 Binary files a/References/BizHawk.SrcGen.ReflectionCache.dll and b/References/BizHawk.SrcGen.ReflectionCache.dll differ diff --git a/References/BizHawk.SrcGen.SettingsUtil.dll b/References/BizHawk.SrcGen.SettingsUtil.dll index d2d9636c95..be0335a619 100644 Binary files a/References/BizHawk.SrcGen.SettingsUtil.dll and b/References/BizHawk.SrcGen.SettingsUtil.dll differ diff --git a/src/BizHawk.Emulation.Cores/Computers/Commodore64/C64.ISettable.cs b/src/BizHawk.Emulation.Cores/Computers/Commodore64/C64.ISettable.cs index 65203ab17e..287c6e473b 100644 --- a/src/BizHawk.Emulation.Cores/Computers/Commodore64/C64.ISettable.cs +++ b/src/BizHawk.Emulation.Cores/Computers/Commodore64/C64.ISettable.cs @@ -1,6 +1,5 @@ using System.ComponentModel; -using BizHawk.Common; using BizHawk.Emulation.Common; namespace BizHawk.Emulation.Cores.Computers.Commodore64 diff --git a/src/BizHawk.Emulation.Cores/Computers/MSX/MSX.ISettable.cs b/src/BizHawk.Emulation.Cores/Computers/MSX/MSX.ISettable.cs index e98f1bc583..0f5550081f 100644 --- a/src/BizHawk.Emulation.Cores/Computers/MSX/MSX.ISettable.cs +++ b/src/BizHawk.Emulation.Cores/Computers/MSX/MSX.ISettable.cs @@ -1,5 +1,5 @@ using System.ComponentModel; -using BizHawk.Common; + using BizHawk.Emulation.Common; namespace BizHawk.Emulation.Cores.Computers.MSX