// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Globalization; using Microsoft.AspNetCore.Razor.Language; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Microsoft.CodeAnalysis.Razor.Serialization { internal class RazorDiagnosticJsonConverter : JsonConverter { public static readonly RazorDiagnosticJsonConverter Instance = new RazorDiagnosticJsonConverter(); private const string RazorDiagnosticMessageKey = "Message"; public override bool CanConvert(Type objectType) { return typeof(RazorDiagnostic).IsAssignableFrom(objectType); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType != JsonToken.StartObject) { return null; } var diagnostic = JObject.Load(reader); var id = diagnostic[nameof(RazorDiagnostic.Id)].Value(); var severity = diagnostic[nameof(RazorDiagnostic.Severity)].Value(); var message = diagnostic[RazorDiagnosticMessageKey].Value(); var span = diagnostic[nameof(RazorDiagnostic.Span)].Value(); var filePath = span[nameof(SourceSpan.FilePath)].Value(); var absoluteIndex = span[nameof(SourceSpan.AbsoluteIndex)].Value(); var lineIndex = span[nameof(SourceSpan.LineIndex)].Value(); var characterIndex = span[nameof(SourceSpan.CharacterIndex)].Value(); var length = span[nameof(SourceSpan.Length)].Value(); var descriptor = new RazorDiagnosticDescriptor(id, () => message, (RazorDiagnosticSeverity)severity); var sourceSpan = new SourceSpan(filePath, absoluteIndex, lineIndex, characterIndex, length); return RazorDiagnostic.Create(descriptor, sourceSpan); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var diagnostic = (RazorDiagnostic)value; writer.WriteStartObject(); WriteProperty(writer, nameof(RazorDiagnostic.Id), diagnostic.Id); WriteProperty(writer, nameof(RazorDiagnostic.Severity), (int)diagnostic.Severity); WriteProperty(writer, RazorDiagnosticMessageKey, diagnostic.GetMessage(CultureInfo.CurrentCulture)); writer.WritePropertyName(nameof(RazorDiagnostic.Span)); writer.WriteStartObject(); WriteProperty(writer, nameof(SourceSpan.FilePath), diagnostic.Span.FilePath); WriteProperty(writer, nameof(SourceSpan.AbsoluteIndex), diagnostic.Span.AbsoluteIndex); WriteProperty(writer, nameof(SourceSpan.LineIndex), diagnostic.Span.LineIndex); WriteProperty(writer, nameof(SourceSpan.CharacterIndex), diagnostic.Span.CharacterIndex); WriteProperty(writer, nameof(SourceSpan.Length), diagnostic.Span.Length); writer.WriteEndObject(); writer.WriteEndObject(); } private void WriteProperty(JsonWriter writer, string key, T value) { writer.WritePropertyName(key); writer.WriteValue(value); } } }