View.cs 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using System;
  2. using System.ComponentModel;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using Avalonia.Controls;
  7. using Microsoft.CodeAnalysis;
  8. using Microsoft.CodeAnalysis.CSharp;
  9. namespace Avalonia.Generators.Tests.Views;
  10. public static class View
  11. {
  12. public const string NamedControl = "NamedControl.xml";
  13. public const string NamedControls = "NamedControls.xml";
  14. public const string XNamedControl = "xNamedControl.xml";
  15. public const string XNamedControls = "xNamedControls.xml";
  16. public const string NoNamedControls = "NoNamedControls.xml";
  17. public const string CustomControls = "CustomControls.xml";
  18. public const string DataTemplates = "DataTemplates.xml";
  19. public const string SignUpView = "SignUpView.xml";
  20. public const string AttachedProps = "AttachedProps.xml";
  21. public const string FieldModifier = "FieldModifier.xml";
  22. public const string ControlWithoutWindow = "ControlWithoutWindow.xml";
  23. public const string ViewWithGenericBaseView = "ViewWithGenericBaseView.xml";
  24. public static async Task<string> Load(string viewName)
  25. {
  26. var assembly = typeof(XamlXNameResolverTests).Assembly;
  27. var fullResourceName = assembly
  28. .GetManifestResourceNames()
  29. .First(name => name.EndsWith(viewName));
  30. await using var stream = assembly.GetManifestResourceStream(fullResourceName);
  31. using var reader = new StreamReader(stream!);
  32. return await reader.ReadToEndAsync();
  33. }
  34. public static CSharpCompilation CreateAvaloniaCompilation(string excludedPattern = null)
  35. {
  36. var compilation = CSharpCompilation
  37. .Create("AvaloniaLib", options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary))
  38. .AddReferences(MetadataReference.CreateFromFile(typeof(string).Assembly.Location))
  39. .AddReferences(MetadataReference.CreateFromFile(typeof(IServiceProvider).Assembly.Location))
  40. .AddReferences(MetadataReference.CreateFromFile(typeof(ITypeDescriptorContext).Assembly.Location))
  41. .AddReferences(MetadataReference.CreateFromFile(typeof(ISupportInitialize).Assembly.Location))
  42. .AddReferences(MetadataReference.CreateFromFile(typeof(TypeConverterAttribute).Assembly.Location));
  43. var avaloniaAssemblyLocation = typeof(TextBlock).Assembly.Location;
  44. var avaloniaAssemblyDirectory = Path.GetDirectoryName(avaloniaAssemblyLocation);
  45. var avaloniaAssemblyReferences = Directory
  46. .EnumerateFiles(avaloniaAssemblyDirectory!)
  47. .Where(file => file.EndsWith(".dll") &&
  48. file.Contains("Avalonia") &&
  49. (string.IsNullOrWhiteSpace(excludedPattern) || !file.Contains(excludedPattern)))
  50. .Select(file => MetadataReference.CreateFromFile(file))
  51. .ToList();
  52. return compilation.AddReferences(avaloniaAssemblyReferences);
  53. }
  54. public static CSharpCompilation WithCustomTextBox(this CSharpCompilation compilation) =>
  55. compilation.AddSyntaxTrees(
  56. CSharpSyntaxTree.ParseText(
  57. "using Avalonia.Controls;" +
  58. "namespace Controls {" +
  59. " public class CustomTextBox : TextBox { }" +
  60. " public class EvilControl { }" +
  61. "}"));
  62. public static CSharpCompilation WithBaseView(this CSharpCompilation compilation) =>
  63. compilation.AddSyntaxTrees(
  64. CSharpSyntaxTree.ParseText(
  65. "using Avalonia.Controls;" +
  66. "namespace Sample.App { public class BaseView<TViewModel> : UserControl { } }"));
  67. }