Skip to content

Commit

Permalink
Fix XAML name generator with non-Avalonia XAML files (#13001)
Browse files Browse the repository at this point in the history
* Fix #12841 by not putting stacktrace in the error message

* Respect SourceItemGroupMetadata to fix #12855

* Fix Generators.Sandbox
  • Loading branch information
maxkatz6 authored Sep 23, 2023
1 parent c0f3769 commit 292d7ac
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 5 deletions.
4 changes: 2 additions & 2 deletions samples/Generators.Sandbox/Generators.Sandbox.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
Expand All @@ -8,7 +8,7 @@
<ItemGroup>
<AvaloniaResource Include="**\*.xaml"/>
<!-- Note this AdditionalFiles directive. -->
<AdditionalFiles Include="**\*.xaml"/>
<AdditionalFiles Include="**\*.xaml" SourceItemGroup="AvaloniaXaml" />
</ItemGroup>

<ItemGroup>
Expand Down
12 changes: 10 additions & 2 deletions src/tools/Avalonia.Generators/GeneratorContextExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,24 @@ 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) =>
context.Report(InvalidTypeDescriptorId,
$"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));
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -42,6 +47,16 @@ public void Execute(GeneratorExecutionContext context)
}
}

private static IEnumerable<AdditionalText> 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);
Expand Down

0 comments on commit 292d7ac

Please sign in to comment.