using CodingCannon.Pages.Basic; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using ScintillaNET; namespace CodingCannon.Pages { internal partial class PropertyWalkerPage : CcUserControlBase { public PropertyWalkerPage() { InitializeComponent(); Text = "Property Walker for MAPPING"; } protected override void OnHandleCreated(EventArgs e) { base.OnHandleCreated(e); scintilla1.Margins[0].Width = 64; scintilla1.Margins[0].Type = MarginType.Number; scintilla1.Margins[1].Width = 12; scintilla1.Margins[1].Type = MarginType.Symbol; //scintilla1.LexerLanguage = "Cpp"; //scintilla1.Styles[Style.Default].Font = "fixedsys"; scintilla1.Styles[Style.Default].Size = 16; // Configure the CPP (C#) lexer styles scintilla1.Styles[Style.Cpp.Default].ForeColor = Color.Silver; scintilla1.Styles[Style.Cpp.Comment].ForeColor = Color.FromArgb(0, 128, 0); // Green scintilla1.Styles[Style.Cpp.CommentLine].ForeColor = Color.FromArgb(0, 128, 0); // Green scintilla1.Styles[Style.Cpp.CommentLineDoc].ForeColor = Color.FromArgb(128, 128, 128); // Gray scintilla1.Styles[Style.Cpp.Number].ForeColor = Color.Olive; scintilla1.Styles[Style.Cpp.Word].ForeColor = Color.Blue; scintilla1.Styles[Style.Cpp.Word2].ForeColor = Color.Blue; scintilla1.Styles[Style.Cpp.String].ForeColor = Color.FromArgb(163, 21, 21); // Red scintilla1.Styles[Style.Cpp.Character].ForeColor = Color.FromArgb(163, 21, 21); // Red scintilla1.Styles[Style.Cpp.Verbatim].ForeColor = Color.FromArgb(163, 21, 21); // Red scintilla1.Styles[Style.Cpp.StringEol].BackColor = Color.Pink; scintilla1.Styles[Style.Cpp.Operator].ForeColor = Color.Purple; scintilla1.Styles[Style.Cpp.Preprocessor].ForeColor = Color.Maroon; scintilla1.Lexer = Lexer.Cpp; scintilla1.AllowDrop = true; scintilla1.DragOver += delegate (object? sender, DragEventArgs args) { args.Effect = args.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Link : DragDropEffects.None; }; scintilla1.DragDrop += delegate (object? sender, DragEventArgs args) { string[] files; if (args.Data?.GetDataPresent(DataFormats.FileDrop) != true || null == (files = (string[])args.Data.GetData(DataFormats.FileDrop)!) || files.Length != 1) return; var text = File.ReadAllText(files![0]); var tree = CSharpSyntaxTree.ParseText(text); var walker = new PropertyWalker(); walker.Visit(tree.GetRoot()); scintilla1.Text = "//Auto generated by Coding Cannon" + Environment.NewLine + Environment.NewLine + string.Join(Environment.NewLine, walker.PropertyNames.Select(p => $"t.{p}=f.{p};")); }; } private class PropertyWalker : CSharpSyntaxWalker { private readonly List _properties = new(); public IReadOnlyCollection PropertyNames => _properties; public override void VisitPropertyDeclaration(PropertyDeclarationSyntax node) { _properties.Add(node.Identifier.Text); base.VisitPropertyDeclaration(node); } } } }