public void GenerateSerializeMethod(StringBuilder sb, SerializeInvocation invocation) { string invocationTypeStr = invocation.TypeArg.ToString(); if (_generatedSerializationMethods.Contains(invocationTypeStr)) { return; } _generatedSerializationMethods.Add(invocationTypeStr); string refprefix = ""; if (ShouldUseRef(invocation.TypeArg)) { refprefix = "ref "; } const string SPC = " "; sb.Append($@"{SPC}{SPC}internal static string Serialize({refprefix}{invocationTypeStr} obj)"); sb.Append(@" { "); GenerateSerializeMethodBody(sb, invocation); sb.Append(@" } "); }
private void GenerateSerializeMethodBody(StringBuilder sb, SerializeInvocation invocation) { // Create nodes TreeContext treeContext = new TreeContext(); treeContext.IndentCSharp(+3); string ct = treeContext.CSharpIndent; List <MethodNode> nodes = new List <MethodNode>(); nodes.Add(new CSharpLineNode($"{ct}StringBuilder sb = new StringBuilder();")); JsonNode jsonTree = BuildTree(invocation.TypeArg, "obj"); if (jsonTree is null) { string invocationTypeStr = invocation.TypeArg.ToString(); nodes.Add(new CSharpLineNode($"{ct}// Type '{invocationTypeStr}' isn't marked as serializable!")); } else { nodes.AddRange(jsonTree.GetNodes(treeContext)); } ct = treeContext.CSharpIndent; nodes.Add(new CSharpLineNode($"{ct}return sb.ToString();")); // Merge json nodes List <MethodNode> mergedNodes = new List <MethodNode>(); List <PlainJsonNode> streak = new List <PlainJsonNode>(); foreach (MethodNode node in nodes) { if (node is PlainJsonNode js) { streak.Add(js); } else { if (streak.Count > 0) { mergedNodes.Add(MergeJsonNodes(streak)); streak.Clear(); } mergedNodes.Add(node); } } if (streak.Count > 0) { mergedNodes.Add(MergeJsonNodes(streak.OfType <PlainJsonNode>())); } nodes = mergedNodes; // Convert json to C# for (int i = 0; i < nodes.Count; ++i) { if (nodes[i] is PlainJsonNode js) { CSharpNode cs = new CSharpLineNode($"{js.CSharpIndent}sb.Append(\"{js.Value.Replace("\"", "\\\"")}\");"); nodes.RemoveAt(i); nodes.Insert(i, cs); } } // Output as string foreach (MethodNode node in mergedNodes) { if (node is CSharpNode cs) { sb.Append(cs.CSharpCode); } } }