using Microsoft.CodeAnalysis; using System; using System.Text; using System.Xml; namespace IconResourceSourceGenerator { [Generator(LanguageNames.CSharp)] public class IconResourceSourceGenerator : IIncrementalGenerator { public void Initialize(IncrementalGeneratorInitializationContext context) { string name = typeof(IconResourceSourceGenerator).Assembly.GetManifestResourceNames().First(x => x.IndexOf("IconResource.axaml") >= 0); var stream = typeof(IconResourceSourceGenerator).Assembly.GetManifestResourceStream(name); XmlDocument document = new XmlDocument(); document.PreserveWhitespace = false; document.Load(stream); var val = document.ChildNodes[0]!.ChildNodes.Cast().Where(x => x.NodeType == XmlNodeType.Element && x.Attributes?.Count > 0).Select(x => (x!.Attributes![0]!.Value, x.InnerText)).ToList(); if (val.Count > 0) { context.RegisterPostInitializationOutput(c => { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("using Avalonia.Collections;"); stringBuilder.AppendLine("using Avalonia.Controls;"); stringBuilder.AppendLine("using Avalonia.Markup.Xaml;"); stringBuilder.AppendLine("using Avalonia.Media;"); stringBuilder.AppendLine("using System;"); stringBuilder.AppendLine("namespace IViewModel.ViewModels"); stringBuilder.AppendLine("{"); stringBuilder.AppendLine(" public sealed class IconResourceValueViewModel :ViewModelBase"); stringBuilder.AppendLine(" {"); stringBuilder.AppendLine($" public StreamGeometry this[string key] => (StreamGeometry)Avalonia.Application.Current?.FindResource(key);"); stringBuilder.AppendLine(" private IconResourceValueViewModel()"); stringBuilder.AppendLine(" {"); stringBuilder.AppendLine(" }"); stringBuilder.AppendLine(" static IconResourceValueViewModel()"); stringBuilder.AppendLine(" {"); stringBuilder.AppendLine(" }"); stringBuilder.AppendLine(" public static IconResourceValueViewModel Instance {get;}= new IconResourceValueViewModel();"); foreach (var item in val) { stringBuilder.AppendLine($" /// "); stringBuilder.AppendLine($" /// {item.Value}"); stringBuilder.AppendLine($" /// "); stringBuilder.AppendLine($" public StreamGeometry {item.Value} {"{get;}"}= StreamGeometry.Parse(\"{item.InnerText}\");"); } stringBuilder.AppendLine(" }"); stringBuilder.AppendLine("}"); c.AddSource("IconResourceValueViewModel.g.cs", stringBuilder.ToString()); }); } } } }