diff --git a/samples/Generators.Sandbox/Generators.Sandbox.csproj b/samples/Generators.Sandbox/Generators.Sandbox.csproj index 885e71af4e1..37b496b9249 100644 --- a/samples/Generators.Sandbox/Generators.Sandbox.csproj +++ b/samples/Generators.Sandbox/Generators.Sandbox.csproj @@ -1,4 +1,4 @@ - + Exe net6.0 @@ -8,7 +8,7 @@ - + diff --git a/src/tools/Avalonia.Generators/GeneratorContextExtensions.cs b/src/tools/Avalonia.Generators/GeneratorContextExtensions.cs index 3e4426e6bba..9690e5606ad 100644 --- a/src/tools/Avalonia.Generators/GeneratorContextExtensions.cs +++ b/src/tools/Avalonia.Generators/GeneratorContextExtensions.cs @@ -21,6 +21,7 @@ public static void ReportNameGeneratorUnhandledError(this GeneratorExecutionCont context.Report(UnhandledErrorDescriptorId, "Unhandled exception occured while generating typed Name references. " + "Please file an issue: https://github.com/avaloniaui/Avalonia", + error.Message, error.ToString()); public static void ReportNameGeneratorInvalidType(this GeneratorExecutionContext context, string typeName) => @@ -28,9 +29,16 @@ public static void ReportNameGeneratorInvalidType(this GeneratorExecutionContext $"Avalonia x:Name generator was unable to generate names for type '{typeName}'. " + $"The type '{typeName}' does not exist in the assembly."); - private static void Report(this GeneratorExecutionContext context, string id, string title, string message = null) => + private static void Report(this GeneratorExecutionContext context, string id, string title, string message = null, string description = null) => context.ReportDiagnostic( Diagnostic.Create( - new DiagnosticDescriptor(id, title, message ?? title, "Usage", DiagnosticSeverity.Error, true), + new DiagnosticDescriptor( + id: id, + title: title, + messageFormat: message ?? title, + category: "Usage", + defaultSeverity: DiagnosticSeverity.Error, + isEnabledByDefault: true, + description), Location.None)); } diff --git a/src/tools/Avalonia.Generators/NameGenerator/AvaloniaNameSourceGenerator.cs b/src/tools/Avalonia.Generators/NameGenerator/AvaloniaNameSourceGenerator.cs index 407cf4f35fb..3219bda792d 100644 --- a/src/tools/Avalonia.Generators/NameGenerator/AvaloniaNameSourceGenerator.cs +++ b/src/tools/Avalonia.Generators/NameGenerator/AvaloniaNameSourceGenerator.cs @@ -1,4 +1,7 @@ using System; +using System.Collections.Generic; +using System.Linq; + using Avalonia.Generators.Common; using Avalonia.Generators.Common.Domain; using Avalonia.Generators.Compiler; @@ -10,6 +13,8 @@ namespace Avalonia.Generators.NameGenerator; [Generator] public class AvaloniaNameSourceGenerator : ISourceGenerator { + private const string SourceItemGroupMetadata = "build_metadata.AdditionalFiles.SourceItemGroup"; + public void Initialize(GeneratorInitializationContext context) { } public void Execute(GeneratorExecutionContext context) @@ -22,7 +27,7 @@ public void Execute(GeneratorExecutionContext context) return; } - var partials = generator.GenerateNameReferences(context.AdditionalFiles, context.CancellationToken); + var partials = generator.GenerateNameReferences(ResolveAdditionalFiles(context), context.CancellationToken); foreach (var (fileName, content) in partials) { if(context.CancellationToken.IsCancellationRequested) @@ -42,6 +47,16 @@ public void Execute(GeneratorExecutionContext context) } } + private static IEnumerable ResolveAdditionalFiles(GeneratorExecutionContext context) + { + return context + .AdditionalFiles + .Where(f => context.AnalyzerConfigOptions + .GetOptions(f) + .TryGetValue(SourceItemGroupMetadata, out var sourceItemGroup) + && sourceItemGroup == "AvaloniaXaml"); + } + private static INameGenerator CreateNameGenerator(GeneratorExecutionContext context) { var options = new GeneratorOptions(context);