private static void SerializeNode(object node, IFastJsonWriter writer, string?parentPropertyName, ref bool parentChildrenStarted, IFSharpSession session) { EnsureChildrenStarted(ref parentChildrenStarted, writer); writer.WriteStartObject(); writer.WriteProperty("kind", AstTypeNames.Value[node.GetType()]); if (parentPropertyName != null) { writer.WriteProperty("property", parentPropertyName); } if (node is SyntaxTree.SynConst @const) { writer.WriteProperty("type", "token"); if (@const is SyntaxTree.SynConst.String @string) { writer.WritePropertyName("value"); writer.WriteValueFromParts("\"", @string.text, "\""); } else if (@const is SyntaxTree.SynConst.Char @char) { writer.WritePropertyName("value"); writer.WriteValueFromParts("'", @char.Item, "'"); } else { if (ConstValueGetters.Value.TryGetValue(@const.GetType(), out var getter)) { writer.WritePropertyName("value"); writer.WriteValue(getter(@const)); } } } else { writer.WriteProperty("type", "node"); var tagName = GetTagName(node); if (tagName != null) { writer.WriteProperty("value", tagName); } } var rangeGetter = GetRangeGetter(node.GetType()); if (rangeGetter != null) { SerializeRangeProperty(rangeGetter(node), writer, session); } var childrenStarted = false; GetChildrenSerializer(node.GetType()).Invoke(node, writer, ref childrenStarted, session); EnsureChildrenEnded(childrenStarted, writer); writer.WriteEndObject(); }
private static void SerializeRangeProperty(Range.range range, IFastJsonWriter writer, IFSharpSession session) { writer.WritePropertyName("range"); var startOffset = session.ConvertToOffset(range.StartLine, range.StartColumn); var endOffset = session.ConvertToOffset(range.EndLine, range.EndColumn); writer.WriteValueFromParts(startOffset, '-', endOffset); }
private static void SerializeEnum <TEnum>(TEnum value, IFastJsonWriter writer, string?parentPropertyName, ref bool parentChildrenStarted, IFSharpSession session) where TEnum : struct, IFormattable { EnsureChildrenStarted(ref parentChildrenStarted, writer); if (parentPropertyName != null) { writer.WriteStartObject(); writer.WriteProperty("type", "value"); writer.WriteProperty("property", parentPropertyName); writer.WriteProperty("value", EnumCache <TEnum> .Strings[value]); writer.WriteEndObject(); } else { writer.WriteValue(EnumCache <TEnum> .Strings[value]); } }
private static void SerializeIdentList(FSharpList <SyntaxTree.Ident> list, IFastJsonWriter writer, string?parentPropertyName, ref bool parentChildrenStarted, IFSharpSession session) { foreach (var ident in list) { SerializeIdent(ident, writer, parentPropertyName, ref parentChildrenStarted, session); } }
private static void SerializeIdent(SyntaxTree.Ident ident, IFastJsonWriter writer, string?parentPropertyName, ref bool parentChildrenStarted, IFSharpSession session) { EnsureChildrenStarted(ref parentChildrenStarted, writer); writer.WriteStartObject(); writer.WriteProperty("type", "token"); writer.WriteProperty("kind", "SyntaxTree.Ident"); if (parentPropertyName != null) { writer.WriteProperty("property", parentPropertyName); } writer.WriteProperty("value", ident.idText); SerializeRangeProperty(ident.idRange, writer, session); writer.WriteEndObject(); }
private static void SerializeList <T>(FSharpList <T> list, IFastJsonWriter writer, string?parentPropertyName, ref bool parentChildrenStarted, IFSharpSession session) { foreach (var item in list) { SerializeNode(item !, writer, null /* UI does not support list property names at the moment */, ref parentChildrenStarted, session); } }