PropertyWalkerPage.cs 3.6 KB

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