Example #1
0
        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);
        }
Example #2
0
        private void AddVarEntry(StringBuilder sb, DfmObject parent)
        {
            sb.AppendLine($"\t{parent.Name}: {parent.Type};");

            foreach (var child in parent.Objects)
            {
                AddVarEntry(sb, child);
            }
        }
Example #3
0
        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);
            }
        }
Example #4
0
        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);
            }
        }
Example #5
0
        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);
        }
Example #6
0
 /// <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);