12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- 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<System.Xml.XmlNode>().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($" /// <summary>");
- stringBuilder.AppendLine($" /// {item.Value}");
- stringBuilder.AppendLine($" /// </summary>");
- stringBuilder.AppendLine($" public StreamGeometry {item.Value} {"{get;}"}= StreamGeometry.Parse(\"{item.InnerText}\");");
- }
- stringBuilder.AppendLine(" }");
- stringBuilder.AppendLine("}");
- c.AddSource("IconResourceValueViewModel.g.cs", stringBuilder.ToString());
- });
- }
- }
- }
- }
|