PropertyWalkerPage.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. using CodingCannon.Pages.Basic;
  12. using Microsoft.CodeAnalysis.CSharp;
  13. using Microsoft.CodeAnalysis.CSharp.Syntax;
  14. using ScintillaNET;
  15. namespace CodingCannon.Pages
  16. {
  17. internal partial class PropertyWalkerPage : CcUserControlBase
  18. {
  19. public PropertyWalkerPage()
  20. {
  21. InitializeComponent();
  22. Text = "Property Walker for MAPPING";
  23. }
  24. protected override void OnHandleCreated(EventArgs e)
  25. {
  26. base.OnHandleCreated(e);
  27. scintilla1.Margins[0].Width = 64;
  28. scintilla1.Margins[0].Type = MarginType.Number;
  29. scintilla1.Margins[1].Width = 12;
  30. scintilla1.Margins[1].Type = MarginType.Symbol;
  31. //scintilla1.LexerLanguage = "Cpp";
  32. //scintilla1.Styles[Style.Default].Font = "fixedsys";
  33. scintilla1.Styles[Style.Default].Size = 16;
  34. // Configure the CPP (C#) lexer styles
  35. scintilla1.Styles[Style.Cpp.Default].ForeColor = Color.Silver;
  36. scintilla1.Styles[Style.Cpp.Comment].ForeColor = Color.FromArgb(0, 128, 0); // Green
  37. scintilla1.Styles[Style.Cpp.CommentLine].ForeColor = Color.FromArgb(0, 128, 0); // Green
  38. scintilla1.Styles[Style.Cpp.CommentLineDoc].ForeColor = Color.FromArgb(128, 128, 128); // Gray
  39. scintilla1.Styles[Style.Cpp.Number].ForeColor = Color.Olive;
  40. scintilla1.Styles[Style.Cpp.Word].ForeColor = Color.Blue;
  41. scintilla1.Styles[Style.Cpp.Word2].ForeColor = Color.Blue;
  42. scintilla1.Styles[Style.Cpp.String].ForeColor = Color.FromArgb(163, 21, 21); // Red
  43. scintilla1.Styles[Style.Cpp.Character].ForeColor = Color.FromArgb(163, 21, 21); // Red
  44. scintilla1.Styles[Style.Cpp.Verbatim].ForeColor = Color.FromArgb(163, 21, 21); // Red
  45. scintilla1.Styles[Style.Cpp.StringEol].BackColor = Color.Pink;
  46. scintilla1.Styles[Style.Cpp.Operator].ForeColor = Color.Purple;
  47. scintilla1.Styles[Style.Cpp.Preprocessor].ForeColor = Color.Maroon;
  48. scintilla1.Lexer = Lexer.Cpp;
  49. scintilla1.AllowDrop = true;
  50. scintilla1.DragOver += delegate (object? sender, DragEventArgs args)
  51. {
  52. args.Effect = args.Data.GetDataPresent(DataFormats.FileDrop)
  53. ? DragDropEffects.Link
  54. : DragDropEffects.None;
  55. };
  56. scintilla1.DragDrop += delegate (object? sender, DragEventArgs args)
  57. {
  58. string[] files;
  59. if (args.Data?.GetDataPresent(DataFormats.FileDrop) != true
  60. || null == (files = (string[])args.Data.GetData(DataFormats.FileDrop)!)
  61. || files.Length != 1) return;
  62. var text = File.ReadAllText(files![0]);
  63. var tree = CSharpSyntaxTree.ParseText(text);
  64. var walker = new PropertyWalker();
  65. walker.Visit(tree.GetRoot());
  66. scintilla1.Text = "//Auto generated by Coding Cannon"
  67. + Environment.NewLine + Environment.NewLine
  68. + string.Join(Environment.NewLine, walker.PropertyNames.Select(p => $"t.{p}=f.{p};"));
  69. };
  70. }
  71. class PropertyWalker : CSharpSyntaxWalker
  72. {
  73. private readonly List<string> _properties = new();
  74. public IReadOnlyCollection<string> PropertyNames => _properties;
  75. public override void VisitPropertyDeclaration(PropertyDeclarationSyntax node)
  76. {
  77. _properties.Add(node.Identifier.Text);
  78. base.VisitPropertyDeclaration(node);
  79. }
  80. }
  81. }
  82. }