private string Run(DfmObject obj) { Logger.WriteLn("CodeGen executing..."); Guard.Ensure.NotNull(obj, nameof(obj), "DfmObject has not been initialized"); _dfmObject = obj; _template = File.ReadAllText(Config.GetPath(@"Generator\Template.txt")); _objCount = 0; Logger.WriteLn("- template and function signature"); InitFunctionSignature(); Logger.WriteLn("- vars section"); InitVarSection(); Logger.WriteLn("- object creation"); InitObjects(); Logger.WriteLn("- object assignments"); InitAssignments(); Logger.WriteLn("CodeGen is finished..."); return(_template); }
private void AddVarEntry(StringBuilder sb, DfmObject parent) { sb.AppendLine($"\t{parent.Name}: {parent.Type};"); foreach (var child in parent.Objects) { AddVarEntry(sb, child); } }
private void AddAssignment(Stack <string> stack, DfmObject parent) { foreach (var child in parent.Objects) { stack.Push($"\t{parent.Name}.AddObject({child.Name});"); } foreach (var child in parent.Objects) { AddAssignment(stack, child); } }
private void AddObject(StringBuilder sb, DfmObject parent) { ++_objCount; var indent = new string('\t', _objCount); Logger.WriteLn($"{indent}Creating object ({_objCount}): {parent.Name}"); sb.AppendLine($"\t{parent.Name} := {parent.Type}.Create(nil);"); foreach (var property in parent.Properties) { Logger.WriteLn($"{indent}\tCreating property: {property.Name}"); var name = PropertyNameAdapter.Adapt(parent, property); if (string.IsNullOrEmpty(name)) { sb.AppendLine("\t// ignored property"); sb.AppendLine($"\t// {parent.Name}.{property.Name} := {property.Value};"); } else if (IsEventHandler(property.Name)) { sb.AppendLine($"\t// {parent.Name}.{name} := {property.Value};"); } else { var value = PropertyValueAdapter.Adapt(property.Name, property); sb.AppendLine($"\t{parent.Name}.{name} := {value};"); } } sb.AppendLine(); // Todo: confirm siblings are generated in correct order, if not reverse through the list foreach (var child in parent.Objects) { AddObject(sb, child); } }
public static string Adapt(DfmObject obj, DfmProperty property) { var name = property.Name.ToLowerInvariant(); if (name == "viewport.width") { return("Width"); } if (name == "viewport.height") { return("Height"); } if (name == "designermasterstyle") { return(string.Empty); } return(property.Name); }
/// <summary> /// Generates Delphi code for the specified Dfm. /// </summary> /// <param name="dfmObject">An object representing a Dfm definition</param> /// <returns></returns> public static string Execute(DfmObject dfmObject) => new CodeGen().Run(dfmObject);