private void NodeToJson(JsonWriter jw, SyntaxNodeOrToken node, Dictionary <SyntaxNodeOrToken, int> nodeToIdx) { jw.WriteStartObject(); jw.WritePropertyName("id"); jw.WriteValue(nodeToIdx[node]); jw.WritePropertyName("type"); jw.WriteValue(node.Kind().ToString()); if (node.IsKind(SyntaxKind.IdentifierName) || node.IsKind(SyntaxKind.PredefinedType) || RoslynUtils.IsSimpleLiteral(node) || node.IsToken || node.AsNode().ChildNodes().Count() == 0) { jw.WritePropertyName("value"); jw.WriteValue(node.ToString()); } else { jw.WritePropertyName("children"); jw.WriteStartArray(); foreach (var child in node.AsNode().ChildNodesAndTokens()) { if (!nodeToIdx.TryGetValue(child, out int idx)) { idx = int.MaxValue; } jw.WriteValue(idx); } jw.WriteEndArray(); } jw.WriteEndObject(); }