public static string GetType(ParamDecl element) { string type = element.Value != null?CppElementBuilder.GetValue(element.Value) : element.Data != null ? $"{element.Data.Name.Underscore()}_data" : element.Key != null ? $"{element.Key.Name.Underscore()}_key" : element.Enum != null?element.Enum.Name.Underscore() : throw new ArgumentException("Can't deduct type"); return(element.Vector == YesNo.Y ? $"dot::list<{type}>" : type); }
private static void BuildClassDeclaration(TypeDecl decl, CodeWriter writer) { var settings = GeneratorSettingsProvider.Get(decl.Module.ModuleName); var type = decl.Name.Underscore(); bool isRecord = decl.Keys.Any(); bool isDerived = decl.Inherit != null; // Self-forward writer.AppendLine($"class {type}_data_impl; using {type}_data = dot::ptr<{type}_data_impl>;"); if (isRecord) { writer.AppendLine($"class {type}_key_impl; using {type}_key = dot::ptr<{type}_key_impl>;"); } // Get unique keys and data from elements var dataForwards = decl.Elements.Where(e => e.Data != null) .Where(e => e.Data.Module.ModuleName == decl.Module.ModuleName) .Select(e => $"{e.Data.Name.Underscore()}_data").ToList(); var keysForwards = decl.Elements.Where(e => e.Key != null) .Where(e => e.Key.Module.ModuleName == decl.Module.ModuleName) .Select(e => $"{e.Key.Name.Underscore()}_key").ToList(); var forwards = keysForwards.Union(dataForwards).Distinct(); // Appends forwards foreach (var f in forwards) { writer.AppendLine($"class {f}_impl; using {f} = dot::ptr<{f}_impl>;"); } writer.AppendNewLineWithoutIndent(); writer.AppendLine($"inline {type}_data make_{type}_data();"); writer.AppendNewLineWithoutIndent(); writer.AppendLines(CommentHelper.FormatComment(decl.Comment)); var baseType = isRecord ? $"record_impl<{type}_key_impl, {type}_data_impl>" : isDerived ? $"{decl.Inherit.Name.Underscore()}_data_impl" : "data_impl"; writer.AppendLine($"class {settings.DeclSpec} {type}_data_impl : public {baseType}"); writer.AppendLine("{"); writer.PushIndent(); writer.AppendLine($"typedef {type}_data_impl self;"); writer.AppendLine($"friend {type}_data make_{type}_data();"); writer.PopIndent(); writer.AppendNewLineWithoutIndent(); writer.AppendLine("public: // FIELDS"); writer.AppendNewLineWithoutIndent(); var elements = decl.Elements; if (elements.Any()) { writer.PushIndent(); CppElementBuilder.WriteElements(decl.Elements, writer); writer.PopIndent(); } if (decl.Declare != null) { writer.AppendLine("public: // METHODS"); writer.AppendNewLineWithoutIndent(); writer.PushIndent(); CppMethodBuilder.WriteElements(decl, writer); writer.PopIndent(); } writer.AppendLine("public:"); writer.PushIndent(); writer.AppendLine("virtual dot::type_t type();"); writer.AppendLine("static dot::type_t typeof();"); writer.PopIndent(); writer.AppendLine("};"); writer.AppendNewLineWithoutIndent(); writer.AppendLine("/// Create an empty instance."); writer.AppendLine($"inline {type}_data make_{type}_data() {{ return new {type}_data_impl; }}"); }