Skip to content
Closed
29 changes: 29 additions & 0 deletions LanguageServer.Framework/Protocol/JsonProtocolContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,11 @@
using EmmyLua.LanguageServer.Framework.Protocol.Model.TextEdit;
using EmmyLua.LanguageServer.Framework.Protocol.Model.Union;
using EmmyLua.LanguageServer.Framework.Protocol.Model.WorkDoneProgress;
using EmmyLua.LanguageServer.Framework.Protocol.Union;
using WCKYWCKF.EmmyLua.LanguageServer.Framework.ClientEx.Protocol;
using FileSystemWatcher = EmmyLua.LanguageServer.Framework.Protocol.Message.WorkspaceWatchedFile.Watch.FileSystemWatcher;
using FoldingRangeKind = EmmyLua.LanguageServer.Framework.Protocol.Message.FoldingRange.FoldingRangeKind;
using MessageType = EmmyLua.LanguageServer.Framework.Protocol.Message.Client.ShowMessage.MessageType;


namespace EmmyLua.LanguageServer.Framework.Protocol;
Expand Down Expand Up @@ -308,5 +311,31 @@ namespace EmmyLua.LanguageServer.Framework.Protocol;
[JsonSerializable(typeof(ConfigurationItem))]
[JsonSerializable(typeof(List<ConfigurationItem>))]
[JsonSerializable(typeof(List<LSPAny>))]
[JsonSerializable(typeof(UniquenessLevel))]
[JsonSerializable(typeof(MonikerKind))]
[JsonSerializable(typeof(ShowDocumentResult))]
[JsonSerializable(typeof(MessageActionItem))]
[JsonSerializable(typeof(Moniker))]
[JsonSerializable(typeof(ShowDocumentParams))]
[JsonSerializable(typeof(ShowMessageRequestParams))]
[JsonSerializable(typeof(MonikerParams))]
[JsonSerializable(typeof(MonikerKind))]
[JsonSerializable(typeof(UniquenessLevel))]
[JsonSerializable(typeof(ProgressToken))]
[JsonSerializable(typeof(WorkDoneProgressCancelParams))]
[JsonSerializable(typeof(WorkDoneProgressCreateParams))]
[JsonSerializable(typeof(TextDocumentContentParams))]
[JsonSerializable(typeof(TextDocumentContentResult))]
[JsonSerializable(typeof(LogTraceParams))]
[JsonSerializable(typeof(TextDocumentContentRefreshParams))]
[JsonSerializable(typeof(Hover))]
[JsonSerializable(typeof(MarkedString))]
[JsonSerializable(typeof(List<MarkedString>))]
[JsonSerializable(typeof(MarkedStringsOrMarkupContent))]
[JsonSerializable(typeof(LogMessageParams))]
[JsonSerializable(typeof(MessageType))]
[JsonSerializable(typeof(DidChangeConfigurationParams))]
[JsonSerializable(typeof(SymbolInformation))]
[JsonSerializable(typeof(List<SymbolTag>))]
// ReSharper disable once ClassNeverInstantiated.Global
public partial class JsonProtocolContext: JsonSerializerContext;
27 changes: 27 additions & 0 deletions LanguageServer.Framework/Protocol/Model/Kind/MonikerKind.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using System.Text.Json;
using System.Text.Json.Serialization;

namespace EmmyLua.LanguageServer.Framework.Protocol.Model.Kind;

[JsonConverter(typeof(MonikerKindJsonConverter))]
public readonly record struct MonikerKind(string Kind)
{
public static readonly MonikerKind Import = new("import");
public static readonly MonikerKind Export = new("export");
public static readonly MonikerKind Local = new("local");
public string Kind { get; } = Kind;
}

public class MonikerKindJsonConverter : JsonConverter<MonikerKind>
{
public override MonikerKind Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var value = reader.GetString();
return new MonikerKind(value!);
}

public override void Write(Utf8JsonWriter writer, MonikerKind value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.Kind);
}
}
29 changes: 29 additions & 0 deletions LanguageServer.Framework/Protocol/Model/Kind/UniquenessLevel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System.Text.Json;
using System.Text.Json.Serialization;

namespace EmmyLua.LanguageServer.Framework.Protocol.Model.Kind;

[JsonConverter(typeof(UniquenessLevelJsonConverter))]
public readonly record struct UniquenessLevel(string Level)
{
public static readonly UniquenessLevel Document = new("document");
public static readonly UniquenessLevel Project = new("project");
public static readonly UniquenessLevel Group = new("group");
public static readonly UniquenessLevel Scheme = new("scheme");
public static readonly UniquenessLevel Global = new("global");
public string Level { get; } = Level;
}

public class UniquenessLevelJsonConverter : JsonConverter<UniquenessLevel>
{
public override UniquenessLevel Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var value = reader.GetString();
return new UniquenessLevel(value!);
}

public override void Write(Utf8JsonWriter writer, UniquenessLevel value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.Level);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
using System.Text.Json;
using System.Text.Json.Nodes;
using System.Text.Json.Serialization;
using EmmyLua.LanguageServer.Framework.Protocol.Model.Markup;
using WCKYWCKF.EmmyLua.LanguageServer.Framework.ClientEx.Protocol;

namespace EmmyLua.LanguageServer.Framework.Protocol.Union;

[JsonConverter(typeof(MarkedStringsOrMarkupContentJsonConverter))]
public record MarkedStringsOrMarkupContent
{
public List<MarkedString>? MarkedStrings { get; init; }
public MarkupContent? MarkupContent { get; init; }
}

public class MarkedStringsOrMarkupContentJsonConverter : JsonConverter<MarkedStringsOrMarkupContent>
{
public override MarkedStringsOrMarkupContent? Read(ref Utf8JsonReader reader, Type typeToConvert,
JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.StartObject)
{
var jsonObj = JsonObject.Parse(ref reader);
if (jsonObj?["language"] is not null)
{
var obj = jsonObj.Deserialize<MarkedString>(options);
return new()
{
MarkedStrings = obj is not null ? [obj] : null
};
}

return new()
{
MarkupContent = jsonObj.Deserialize<MarkupContent>(options)
};
}

if (reader.TokenType == JsonTokenType.StartArray)
{
var jsonArray = JsonArray.Parse(ref reader);
return new MarkedStringsOrMarkupContent()
{
MarkedStrings = jsonArray.Deserialize<List<MarkedString>>(options)
};
}

if (reader.TokenType == JsonTokenType.String)
{
return new()
{
MarkedStrings = [new MarkedString() { Value = reader.GetString() ?? string.Empty }]
};
}

return new();
}

public override void Write(Utf8JsonWriter writer, MarkedStringsOrMarkupContent value, JsonSerializerOptions options)
{
throw new NotSupportedException("It only use Deserialize.");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System.Text.Json.Nodes;
using System.Text.Json.Serialization;
using EmmyLua.LanguageServer.Framework.Protocol.Model;

namespace WCKYWCKF.EmmyLua.LanguageServer.Framework.ClientEx.Protocol;

public record DidChangeConfigurationParams
{
/// <summary>
/// The actual changed settings
/// </summary>
///
[JsonPropertyName("settings")]
public LSPAny? Settings { get; init; }
}
14 changes: 14 additions & 0 deletions LanguageServer.Framework/Protocol/Supplement/Hover.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
using EmmyLua.LanguageServer.Framework.Protocol.Model;
using EmmyLua.LanguageServer.Framework.Protocol.Model.Markup;
using EmmyLua.LanguageServer.Framework.Protocol.Union;

namespace WCKYWCKF.EmmyLua.LanguageServer.Framework.ClientEx.Protocol;

public record Hover
{
[JsonPropertyName("contents")] public required MarkedStringsOrMarkupContent Contents { get; init; }
[JsonPropertyName("range")] public DocumentRange? Range { get; init; }
}
18 changes: 18 additions & 0 deletions LanguageServer.Framework/Protocol/Supplement/LogMessageParams.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System.Text.Json.Serialization;

namespace WCKYWCKF.EmmyLua.LanguageServer.Framework.ClientEx.Protocol;

public record LogMessageParams
{
/// <summary>
/// The message type. See {@link MessageType}
/// </summary>
[JsonPropertyName("type")]
public MessageType Type { get; init; }

/// <summary>
/// The actual message
/// </summary>
[JsonPropertyName("message")]
public required string Message { get; init; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System.Text.Json.Serialization;

namespace WCKYWCKF.EmmyLua.LanguageServer.Framework.ClientEx.Protocol;

public class LogTraceParams
{
[JsonPropertyName("message")] public required string Message { get; init; }
[JsonPropertyName("verbose")] public string? Verbose { get; init; }
}
72 changes: 72 additions & 0 deletions LanguageServer.Framework/Protocol/Supplement/MarkedString.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
using System;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace WCKYWCKF.EmmyLua.LanguageServer.Framework.ClientEx.Protocol;

[JsonConverter(typeof(MarkedStringJsonConverter))]
public class MarkedString
{
[JsonPropertyName("language")] public string? Language { get; init; }

[JsonPropertyName("value")] public required string Value { get; init; }
}

public class MarkedStringJsonConverter : JsonConverter<MarkedString>
{
public override MarkedString? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
switch (reader.TokenType)
{
case JsonTokenType.String:
return new MarkedString { Value = reader.GetString() ?? string.Empty };

case JsonTokenType.StartObject:
string? language = null;
string? value = null;

while (reader.Read() && reader.TokenType != JsonTokenType.EndObject)
{
if (reader.TokenType == JsonTokenType.PropertyName)
{
var propName = reader.GetString();
reader.Read(); // Move to value

switch (propName)
{
case "language":
language = reader.GetString();
break;
case "value":
value = reader.GetString();
break;
}
}
}

return new MarkedString
{
Language = language,
Value = value ?? string.Empty
};

default:
return new MarkedString { Value = string.Empty };
}
}

public override void Write(Utf8JsonWriter writer, MarkedString value, JsonSerializerOptions options)
{
if (string.IsNullOrWhiteSpace(value.Language))
{
writer.WriteStringValue(value.Value);
}
else
{
writer.WriteStartObject();
writer.WriteString("language", value.Language);
writer.WriteString("value", value.Value);
writer.WriteEndObject();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using System.Text.Json.Serialization;

namespace WCKYWCKF.EmmyLua.LanguageServer.Framework.ClientEx.Protocol;

public record MessageActionItem
{
[JsonPropertyName("title")] public required string Title { get; init; }
}
24 changes: 24 additions & 0 deletions LanguageServer.Framework/Protocol/Supplement/MessageType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
namespace WCKYWCKF.EmmyLua.LanguageServer.Framework.ClientEx.Protocol;

public enum MessageType
{
/// <summary>
/// An error message.
/// </summary>
Error = 1,

/// <summary>
/// A warning message.
/// </summary>
Warning = 2,

/// <summary>
/// An information message.
/// </summary>
Info = 3,

/// <summary>
/// A log message.
/// </summary>
Log = 4,
}
33 changes: 33 additions & 0 deletions LanguageServer.Framework/Protocol/Supplement/Moniker.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using System.Text.Json;
using System.Text.Json.Serialization;
using EmmyLua.LanguageServer.Framework.Protocol.Model.Kind;

namespace WCKYWCKF.EmmyLua.LanguageServer.Framework.ClientEx.Protocol;

public class Moniker
{
/// <summary>
/// The scheme of the moniker. For example tsc or .Net
/// </summary>
[JsonPropertyName("scheme")]
public required string Scheme { get; init; }

/// <summary>
/// The identifier of the moniker. The value is opaque in LSIF however
/// schema owners are allowed to define the structure if they want.
/// </summary>
[JsonPropertyName("identifier")]
public required string Identifier { get; init; }

/// <summary>
/// The scope in which the moniker is unique
/// </summary>
[JsonPropertyName("unique")]
public required UniquenessLevel Unique { get; init; }

/// <summary>
/// The moniker kind if known.
/// </summary>
[JsonPropertyName("kind")]
public MonikerKind Kind { get; init; }
}
10 changes: 10 additions & 0 deletions LanguageServer.Framework/Protocol/Supplement/MonikerParams.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using EmmyLua.LanguageServer.Framework.Protocol.Message.Interface;
using EmmyLua.LanguageServer.Framework.Protocol.Model.TextDocument;

namespace WCKYWCKF.EmmyLua.LanguageServer.Framework.ClientEx.Protocol;

public sealed class MonikerParams : TextDocumentPositionParams, IWorkDoneProgressParams, IPartialResultParams
{
public string? WorkDoneToken { get; set; }
public string? PartialResultToken { get; set; }
}
Loading