From 3c4448eb9dedd5c996d1d32d4b112e6bb8856352 Mon Sep 17 00:00:00 2001 From: Joey Robichaud Date: Wed, 20 Sep 2023 07:34:38 -0700 Subject: [PATCH 1/2] Pass serializer when calling ToObject --- .../Features/Document/CompletionFeature.cs | 2 +- .../Features/Document/InlayHintFeature.cs | 4 ++-- .../Features/Document/InlineValueFeature.cs | 8 ++++---- src/Protocol/Models/RangeOrEditRange.cs | 4 ++-- .../Converters/CommandOrCodeActionConverter.cs | 4 ++-- .../Converters/GlobPatternConverter.cs | 2 +- .../LocationOrFileLocationConverter.cs | 4 ++-- .../LocationOrLocationLinkConverter.cs | 4 ++-- .../RangeOrPlaceholderRangeConverter.cs | 6 +++--- .../SemanticTokensFullOrDeltaConverter.cs | 4 ++-- ...ticTokensFullOrDeltaPartialResultConverter.cs | 4 ++-- ...SymbolInformationOrDocumentSymbolConverter.cs | 4 ++-- .../Converters/TextEditConverter.cs | 4 ++-- .../TextEditOrInsertReplaceEditConverter.cs | 4 ++-- .../Converters/ValueTupleContractResolver.cs | 2 +- .../WorkspaceEditDocumentChangeConverter.cs | 8 ++++---- .../Converters/WorkspaceFolderOrUriConverter.cs | 4 ++-- src/Server/LanguageServer.cs | 2 +- test/Generation.Tests/LspFeatureTests.cs | 2 +- test/Lsp.Integration.Tests/ExtensionTests.cs | 16 +++++++++++----- 20 files changed, 49 insertions(+), 43 deletions(-) diff --git a/src/Protocol/Features/Document/CompletionFeature.cs b/src/Protocol/Features/Document/CompletionFeature.cs index d3e2a8246..23b23698d 100644 --- a/src/Protocol/Features/Document/CompletionFeature.cs +++ b/src/Protocol/Features/Document/CompletionFeature.cs @@ -509,7 +509,7 @@ public override void WriteJson(JsonWriter writer, CompletionList? value, JsonSer var items = result["items"].ToObject>(serializer); return new CompletionList(items, result["isIncomplete"]?.Value() ?? false) { - ItemDefaults = result["itemDefaults"]?.ToObject() + ItemDefaults = result["itemDefaults"]?.ToObject(serializer) }; } diff --git a/src/Protocol/Features/Document/InlayHintFeature.cs b/src/Protocol/Features/Document/InlayHintFeature.cs index 4fcb3544f..9747c018f 100644 --- a/src/Protocol/Features/Document/InlayHintFeature.cs +++ b/src/Protocol/Features/Document/InlayHintFeature.cs @@ -1,4 +1,4 @@ -using System.Collections.ObjectModel; +using System.Collections.ObjectModel; using System.Diagnostics; using MediatR; using Newtonsoft.Json; @@ -231,7 +231,7 @@ public override StringOrInlayHintLabelParts ReadJson( if (reader.TokenType == JsonToken.StartArray) { var result = JArray.Load(reader); - return new StringOrInlayHintLabelParts(result.ToObject>()); + return new StringOrInlayHintLabelParts(result.ToObject>(serializer)); } if (reader.TokenType == JsonToken.String) diff --git a/src/Protocol/Features/Document/InlineValueFeature.cs b/src/Protocol/Features/Document/InlineValueFeature.cs index 769806c78..0e014b027 100644 --- a/src/Protocol/Features/Document/InlineValueFeature.cs +++ b/src/Protocol/Features/Document/InlineValueFeature.cs @@ -1,4 +1,4 @@ -using System.Diagnostics; +using System.Diagnostics; using MediatR; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -98,7 +98,7 @@ public override InlineValueBase ReadJson( { return new InlineValueText() { - Range = result["range"]!.ToObject()!, + Range = result["range"]!.ToObject(serializer)!, Text = result["text"]!.Value()! }; } @@ -107,7 +107,7 @@ public override InlineValueBase ReadJson( { return new InlineValueVariableLookup() { - Range = result["range"].ToObject()!, + Range = result["range"].ToObject(serializer)!, VariableName = result["variableName"]!.Value()!, CaseSensitiveLookup = result["caseSensitiveLookup"]?.Value() ?? false, }; @@ -115,7 +115,7 @@ public override InlineValueBase ReadJson( return new InlineValueEvaluatableExpression() { - Range = result["range"].ToObject()!, + Range = result["range"].ToObject(serializer)!, Expression = result["expression"]?.Value() }; } diff --git a/src/Protocol/Models/RangeOrEditRange.cs b/src/Protocol/Models/RangeOrEditRange.cs index 3f8dbcb5c..575ed6aa5 100644 --- a/src/Protocol/Models/RangeOrEditRange.cs +++ b/src/Protocol/Models/RangeOrEditRange.cs @@ -46,10 +46,10 @@ public override RangeOrEditRange ReadJson( var obj = JObject.Load(reader); if (obj.ContainsKey("insert")) { - return new RangeOrEditRange(obj.ToObject()); + return new RangeOrEditRange(obj.ToObject(serializer)); } - return new RangeOrEditRange(obj.ToObject()); + return new RangeOrEditRange(obj.ToObject(serializer)); } public override bool CanRead => true; diff --git a/src/Protocol/Serialization/Converters/CommandOrCodeActionConverter.cs b/src/Protocol/Serialization/Converters/CommandOrCodeActionConverter.cs index 078523c58..fc280f683 100644 --- a/src/Protocol/Serialization/Converters/CommandOrCodeActionConverter.cs +++ b/src/Protocol/Serialization/Converters/CommandOrCodeActionConverter.cs @@ -31,10 +31,10 @@ public override CommandOrCodeAction ReadJson(JsonReader reader, Type objectType, var command = result["command"]; if (command?.Type == JTokenType.String) { - return new CommandOrCodeAction(result.ToObject()); + return new CommandOrCodeAction(result.ToObject(serializer)); } - return new CommandOrCodeAction(result.ToObject()); + return new CommandOrCodeAction(result.ToObject(serializer)); } public override bool CanRead => true; diff --git a/src/Protocol/Serialization/Converters/GlobPatternConverter.cs b/src/Protocol/Serialization/Converters/GlobPatternConverter.cs index 8b05f1b5b..4a046fdea 100644 --- a/src/Protocol/Serialization/Converters/GlobPatternConverter.cs +++ b/src/Protocol/Serialization/Converters/GlobPatternConverter.cs @@ -29,7 +29,7 @@ public override GlobPattern ReadJson( if (reader.TokenType == JsonToken.StartObject) { - return new GlobPattern(JObject.Load(reader).ToObject()); + return new GlobPattern(JObject.Load(reader).ToObject(serializer)); } return new GlobPattern(""); diff --git a/src/Protocol/Serialization/Converters/LocationOrFileLocationConverter.cs b/src/Protocol/Serialization/Converters/LocationOrFileLocationConverter.cs index 01112e26a..806958524 100644 --- a/src/Protocol/Serialization/Converters/LocationOrFileLocationConverter.cs +++ b/src/Protocol/Serialization/Converters/LocationOrFileLocationConverter.cs @@ -19,10 +19,10 @@ public override LocationOrFileLocation ReadJson(JsonReader reader, Type objectTy var obj = JObject.Load(reader); if (obj.ContainsKey("range")) { - return new LocationOrFileLocation(obj.ToObject()); + return new LocationOrFileLocation(obj.ToObject(serializer)); } - return new LocationOrFileLocation(obj.ToObject()); + return new LocationOrFileLocation(obj.ToObject(serializer)); } public override bool CanRead => true; diff --git a/src/Protocol/Serialization/Converters/LocationOrLocationLinkConverter.cs b/src/Protocol/Serialization/Converters/LocationOrLocationLinkConverter.cs index 73dce0794..94b6fe911 100644 --- a/src/Protocol/Serialization/Converters/LocationOrLocationLinkConverter.cs +++ b/src/Protocol/Serialization/Converters/LocationOrLocationLinkConverter.cs @@ -20,10 +20,10 @@ public override LocationOrLocationLink ReadJson(JsonReader reader, Type objectTy var obj = JObject.Load(reader); if (obj.ContainsKey("uri")) { - return new LocationOrLocationLink(obj.ToObject()); + return new LocationOrLocationLink(obj.ToObject(serializer)); } - return new LocationOrLocationLink(obj.ToObject()); + return new LocationOrLocationLink(obj.ToObject(serializer)); } public override bool CanRead => true; diff --git a/src/Protocol/Serialization/Converters/RangeOrPlaceholderRangeConverter.cs b/src/Protocol/Serialization/Converters/RangeOrPlaceholderRangeConverter.cs index ff641aa77..ece6400fc 100644 --- a/src/Protocol/Serialization/Converters/RangeOrPlaceholderRangeConverter.cs +++ b/src/Protocol/Serialization/Converters/RangeOrPlaceholderRangeConverter.cs @@ -36,13 +36,13 @@ public override void WriteJson(JsonWriter writer, RangeOrPlaceholderRange? value { var obj = (JToken.ReadFrom(reader) as JObject)!; return obj.ContainsKey("placeholder") - ? new RangeOrPlaceholderRange(obj.ToObject()) + ? new RangeOrPlaceholderRange(obj.ToObject(serializer)) : obj.ContainsKey("defaultBehavior") ? new RangeOrPlaceholderRange( - obj.ToObject() + obj.ToObject(serializer) ) : new RangeOrPlaceholderRange( - obj.ToObject() + obj.ToObject(serializer) ); } diff --git a/src/Protocol/Serialization/Converters/SemanticTokensFullOrDeltaConverter.cs b/src/Protocol/Serialization/Converters/SemanticTokensFullOrDeltaConverter.cs index ac1aaf56f..4f0293439 100644 --- a/src/Protocol/Serialization/Converters/SemanticTokensFullOrDeltaConverter.cs +++ b/src/Protocol/Serialization/Converters/SemanticTokensFullOrDeltaConverter.cs @@ -30,10 +30,10 @@ public override SemanticTokensFullOrDelta ReadJson( var obj = JObject.Load(reader); if (obj.ContainsKey("data")) { - return new SemanticTokensFullOrDelta(obj.ToObject()); + return new SemanticTokensFullOrDelta(obj.ToObject(serializer)); } - return new SemanticTokensFullOrDelta(obj.ToObject()); + return new SemanticTokensFullOrDelta(obj.ToObject(serializer)); } public override bool CanRead => true; diff --git a/src/Protocol/Serialization/Converters/SemanticTokensFullOrDeltaPartialResultConverter.cs b/src/Protocol/Serialization/Converters/SemanticTokensFullOrDeltaPartialResultConverter.cs index 5da50c4e7..a32fed57a 100644 --- a/src/Protocol/Serialization/Converters/SemanticTokensFullOrDeltaPartialResultConverter.cs +++ b/src/Protocol/Serialization/Converters/SemanticTokensFullOrDeltaPartialResultConverter.cs @@ -30,10 +30,10 @@ public override SemanticTokensFullOrDeltaPartialResult ReadJson( var obj = JObject.Load(reader); if (obj.ContainsKey("data")) { - return new SemanticTokensFullOrDeltaPartialResult(obj.ToObject()); + return new SemanticTokensFullOrDeltaPartialResult(obj.ToObject(serializer)); } - return new SemanticTokensFullOrDeltaPartialResult(obj.ToObject()); + return new SemanticTokensFullOrDeltaPartialResult(obj.ToObject(serializer)); } public override bool CanRead => true; diff --git a/src/Protocol/Serialization/Converters/SymbolInformationOrDocumentSymbolConverter.cs b/src/Protocol/Serialization/Converters/SymbolInformationOrDocumentSymbolConverter.cs index 7c813c962..a1c5ebfab 100644 --- a/src/Protocol/Serialization/Converters/SymbolInformationOrDocumentSymbolConverter.cs +++ b/src/Protocol/Serialization/Converters/SymbolInformationOrDocumentSymbolConverter.cs @@ -32,10 +32,10 @@ public override SymbolInformationOrDocumentSymbol ReadJson( // SymbolInformation has property location, DocumentSymbol does not. if (result["location"] != null) { - return new SymbolInformationOrDocumentSymbol(result.ToObject()); + return new SymbolInformationOrDocumentSymbol(result.ToObject(serializer)); } - return new SymbolInformationOrDocumentSymbol(result.ToObject()); + return new SymbolInformationOrDocumentSymbol(result.ToObject(serializer)); } public override bool CanRead => true; diff --git a/src/Protocol/Serialization/Converters/TextEditConverter.cs b/src/Protocol/Serialization/Converters/TextEditConverter.cs index 69929db95..5c180881a 100644 --- a/src/Protocol/Serialization/Converters/TextEditConverter.cs +++ b/src/Protocol/Serialization/Converters/TextEditConverter.cs @@ -31,7 +31,7 @@ public override TextEdit ReadJson(JsonReader reader, Type objectType, TextEdit e if (result["annotationId"] is { Type: JTokenType.String } annotation) { edit = new AnnotatedTextEdit() { - AnnotationId = annotation.ToObject() + AnnotationId = annotation.ToObject(serializer) }; } else @@ -41,7 +41,7 @@ public override TextEdit ReadJson(JsonReader reader, Type objectType, TextEdit e if (result["range"] is { Type: JTokenType.Object } range) { - edit = edit with { Range = range.ToObject()}; + edit = edit with { Range = range.ToObject(serializer)}; } if (result["newText"] is { Type: JTokenType.String } newText) diff --git a/src/Protocol/Serialization/Converters/TextEditOrInsertReplaceEditConverter.cs b/src/Protocol/Serialization/Converters/TextEditOrInsertReplaceEditConverter.cs index eaf924c05..249ec65d8 100644 --- a/src/Protocol/Serialization/Converters/TextEditOrInsertReplaceEditConverter.cs +++ b/src/Protocol/Serialization/Converters/TextEditOrInsertReplaceEditConverter.cs @@ -31,10 +31,10 @@ public override TextEditOrInsertReplaceEdit ReadJson(JsonReader reader, Type obj var command = result["insert"]; if (command?.Type == JTokenType.String) { - return new TextEditOrInsertReplaceEdit(result.ToObject()); + return new TextEditOrInsertReplaceEdit(result.ToObject(serializer)); } - return new TextEditOrInsertReplaceEdit(result.ToObject()); + return new TextEditOrInsertReplaceEdit(result.ToObject(serializer)); } public override bool CanRead => true; diff --git a/src/Protocol/Serialization/Converters/ValueTupleContractResolver.cs b/src/Protocol/Serialization/Converters/ValueTupleContractResolver.cs index 9df92004d..10323ab25 100644 --- a/src/Protocol/Serialization/Converters/ValueTupleContractResolver.cs +++ b/src/Protocol/Serialization/Converters/ValueTupleContractResolver.cs @@ -11,7 +11,7 @@ internal class ValueTupleContractResolver : JsonConverter<(T1, T2)> public override (T1, T2) ReadJson(JsonReader reader, Type objectType, (T1, T2) existingValue, bool hasExistingValue, JsonSerializer serializer) { var a = JArray.Load(reader); - return ( a.ToObject(), a.ToObject() ); + return ( a.ToObject(serializer), a.ToObject(serializer) ); } } } diff --git a/src/Protocol/Serialization/Converters/WorkspaceEditDocumentChangeConverter.cs b/src/Protocol/Serialization/Converters/WorkspaceEditDocumentChangeConverter.cs index c247adef3..ffb55b30e 100644 --- a/src/Protocol/Serialization/Converters/WorkspaceEditDocumentChangeConverter.cs +++ b/src/Protocol/Serialization/Converters/WorkspaceEditDocumentChangeConverter.cs @@ -26,17 +26,17 @@ public override WorkspaceEditDocumentChange ReadJson( switch (kind) { case "create": - return new WorkspaceEditDocumentChange(obj.ToObject()); + return new WorkspaceEditDocumentChange(obj.ToObject(serializer)); case "rename": - return new WorkspaceEditDocumentChange(obj.ToObject()); + return new WorkspaceEditDocumentChange(obj.ToObject(serializer)); case "delete": - return new WorkspaceEditDocumentChange(obj.ToObject()); + return new WorkspaceEditDocumentChange(obj.ToObject(serializer)); default: throw new NotSupportedException("Object with " + kind + " is not supported"); } } - return new WorkspaceEditDocumentChange(obj.ToObject()); + return new WorkspaceEditDocumentChange(obj.ToObject(serializer)); } public override bool CanRead => true; diff --git a/src/Protocol/Serialization/Converters/WorkspaceFolderOrUriConverter.cs b/src/Protocol/Serialization/Converters/WorkspaceFolderOrUriConverter.cs index 9e9ab992c..ee1facb2f 100644 --- a/src/Protocol/Serialization/Converters/WorkspaceFolderOrUriConverter.cs +++ b/src/Protocol/Serialization/Converters/WorkspaceFolderOrUriConverter.cs @@ -32,10 +32,10 @@ public override WorkspaceFolderOrUri ReadJson( var obj = JObject.Load(reader); if (obj.ContainsKey("name")) { - return new WorkspaceFolderOrUri(obj.ToObject()); + return new WorkspaceFolderOrUri(obj.ToObject(serializer)); } - return new WorkspaceFolderOrUri(obj.ToObject()); + return new WorkspaceFolderOrUri(obj.ToObject(serializer)); } return new WorkspaceFolderOrUri(""); diff --git a/src/Server/LanguageServer.cs b/src/Server/LanguageServer.cs index 987229e84..1f6edb6c1 100644 --- a/src/Server/LanguageServer.cs +++ b/src/Server/LanguageServer.cs @@ -419,7 +419,7 @@ out GeneralClientCapabilities generalCapabilities { if (request.Capabilities.SelectToken(group.Key) is JObject capabilityData) { - var capability = capabilityData.ToObject(capabilityType) as ICapability; + var capability = capabilityData.ToObject(capabilityType, _serializer.JsonSerializer) as ICapability; _supportedCapabilities.Add(capability!); } } diff --git a/test/Generation.Tests/LspFeatureTests.cs b/test/Generation.Tests/LspFeatureTests.cs index 50c7541a5..00b584610 100644 --- a/test/Generation.Tests/LspFeatureTests.cs +++ b/test/Generation.Tests/LspFeatureTests.cs @@ -358,7 +358,7 @@ public override StringOrOutlayHintLabelParts ReadJson( if (reader.TokenType == JsonToken.StartArray) { var result = JArray.Load(reader); - return new StringOrOutlayHintLabelParts(result.ToObject>()); + return new StringOrOutlayHintLabelParts(result.ToObject>(serializer)); } if (reader.TokenType == JsonToken.String) diff --git a/test/Lsp.Integration.Tests/ExtensionTests.cs b/test/Lsp.Integration.Tests/ExtensionTests.cs index 5c67a0b61..fe607fba5 100644 --- a/test/Lsp.Integration.Tests/ExtensionTests.cs +++ b/test/Lsp.Integration.Tests/ExtensionTests.cs @@ -7,6 +7,7 @@ using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json.Linq; using NSubstitute; +using OmniSharp.Extensions.JsonRpc; using OmniSharp.Extensions.JsonRpc.Testing; using OmniSharp.Extensions.LanguageProtocol.Testing; using OmniSharp.Extensions.LanguageServer.Client; @@ -67,12 +68,14 @@ public async Task Should_Support_Custom_Capabilities() ); { - var capability = client.ClientSettings.Capabilities!.Workspace!.ExtensionData["unitTests"].ToObject(); + var capability = client.ClientSettings.Capabilities!.Workspace!.ExtensionData["unitTests"] + .ToObject(client.Services.GetRequiredService().JsonSerializer); capability.Property.Should().Be("Abcd"); } { - var capability = server.ClientSettings.Capabilities!.Workspace!.ExtensionData["unitTests"].ToObject(); + var capability = server.ClientSettings.Capabilities!.Workspace!.ExtensionData["unitTests"] + .ToObject(server.Services.GetRequiredService().JsonSerializer); capability.Property.Should().Be("Abcd"); } @@ -127,7 +130,8 @@ public async Task Should_Support_Custom_Capabilities_Using_Json() ); { - var capability = server.ClientSettings.Capabilities!.Workspace!.ExtensionData["unitTests"].ToObject(); + var capability = server.ClientSettings.Capabilities!.Workspace!.ExtensionData["unitTests"] + .ToObject(server.Services.GetRequiredService().JsonSerializer); capability.Property.Should().Be("Abcd"); } @@ -175,14 +179,16 @@ public async Task Should_Support_Custom_Static_Options() ); { - var capability = server.ClientSettings.Capabilities!.Workspace!.ExtensionData["unitTests"].ToObject(); + var capability = server.ClientSettings.Capabilities!.Workspace!.ExtensionData["unitTests"] + .ToObject(server.Services.GetRequiredService().JsonSerializer); capability.Property.Should().Be("Abcd"); } { server.ServerSettings.Capabilities.ExtensionData["unitTestDiscovery"].Should().NotBeNull(); server.ServerSettings.Capabilities.ExtensionData["unitTestDiscovery"] - .ToObject().SupportsDebugging.Should().BeTrue(); + .ToObject(server.Services.GetRequiredService().JsonSerializer) + .SupportsDebugging.Should().BeTrue(); } { From 17851aef80c76f038bf78930315d8a4da1fc6bcd Mon Sep 17 00:00:00 2001 From: Joey Robichaud Date: Wed, 20 Sep 2023 07:35:56 -0700 Subject: [PATCH 2/2] Fix up registration options and capabilities --- .../ITextDocumentClientCapabilities.cs | 6 +-- .../TextDocumentClientCapabilities.cs | 6 +-- .../Capabilities/WorkspaceEditCapability.cs | 2 +- .../Features/Document/DiagnosticsFeature.cs | 2 +- .../Features/Document/InlayHintFeature.cs | 40 ++++++++++++++++--- .../Features/Document/InlineValueFeature.cs | 15 ++++--- .../Document/SemanticTokensFeature.cs | 13 +++--- .../DidChangeConfigurationFeature.cs | 2 +- .../Workspace/DidChangeWatchedFilesFeature.cs | 2 +- .../Workspace/ExecuteCommandFeature.cs | 2 +- .../Workspace/WorkspaceSymbolsFeature.cs | 2 +- src/Protocol/WorkspaceNames.cs | 1 + ...ource.00AssemblyCapabilityKeys.verified.cs | 2 +- 13 files changed, 67 insertions(+), 28 deletions(-) diff --git a/src/Protocol/Client/Capabilities/ITextDocumentClientCapabilities.cs b/src/Protocol/Client/Capabilities/ITextDocumentClientCapabilities.cs index fb7104c29..27efadef3 100644 --- a/src/Protocol/Client/Capabilities/ITextDocumentClientCapabilities.cs +++ b/src/Protocol/Client/Capabilities/ITextDocumentClientCapabilities.cs @@ -159,20 +159,20 @@ public interface ITextDocumentClientCapabilities : ICapabilitiesBase /// /// @since 3.17.0 /// - Supports InlineValue { get; set; } + Supports InlineValue { get; set; } /// /// Capability specific to the `textDocument/inlayHint` request. /// /// @since 3.17.0 /// - Supports InlayHint { get; set; } + Supports InlayHint { get; set; } /// /// Capability specific to the diagnostic pull model. /// /// @since 3.17.0 /// - Supports Diagnostic { get; set; } + Supports Diagnostic { get; set; } } } diff --git a/src/Protocol/Client/Capabilities/TextDocumentClientCapabilities.cs b/src/Protocol/Client/Capabilities/TextDocumentClientCapabilities.cs index c8b70d5d5..202983903 100644 --- a/src/Protocol/Client/Capabilities/TextDocumentClientCapabilities.cs +++ b/src/Protocol/Client/Capabilities/TextDocumentClientCapabilities.cs @@ -159,20 +159,20 @@ public class TextDocumentClientCapabilities : CapabilitiesBase, ITextDocumentCli /// /// @since 3.17.0 /// - public Supports InlineValue { get; set; } + public Supports InlineValue { get; set; } /// /// Capability specific to the `textDocument/inlayHint` request. /// /// @since 3.17.0 /// - public Supports InlayHint { get; set; } + public Supports InlayHint { get; set; } /// /// Capability specific to the diagnostic pull model. /// /// @since 3.17.0 /// - public Supports Diagnostic { get; set; } + public Supports Diagnostic { get; set; } } } diff --git a/src/Protocol/Client/Capabilities/WorkspaceEditCapability.cs b/src/Protocol/Client/Capabilities/WorkspaceEditCapability.cs index a6e4ccc85..78028f9e2 100644 --- a/src/Protocol/Client/Capabilities/WorkspaceEditCapability.cs +++ b/src/Protocol/Client/Capabilities/WorkspaceEditCapability.cs @@ -3,7 +3,7 @@ namespace OmniSharp.Extensions.LanguageServer.Protocol.Client.Capabilities { - [CapabilityKey(nameof(ClientCapabilities.TextDocument), nameof(WorkspaceClientCapabilities.WorkspaceEdit))] + [CapabilityKey(nameof(ClientCapabilities.Workspace), nameof(WorkspaceClientCapabilities.WorkspaceEdit))] public class WorkspaceEditCapability : ICapability { /// diff --git a/src/Protocol/Features/Document/DiagnosticsFeature.cs b/src/Protocol/Features/Document/DiagnosticsFeature.cs index bf7cce533..1a79b7a70 100644 --- a/src/Protocol/Features/Document/DiagnosticsFeature.cs +++ b/src/Protocol/Features/Document/DiagnosticsFeature.cs @@ -467,7 +467,7 @@ internal WorkspaceDiagnosticReportPartialResult(WorkspaceDiagnosticReport partia [GenerateRegistrationOptions(nameof(ServerCapabilities.DiagnosticProvider))] [RegistrationName(TextDocumentNames.Diagnostics)] - public partial class DiagnosticsRegistrationOptions : ITextDocumentRegistrationOptions, IWorkDoneProgressOptions + public partial class DiagnosticsRegistrationOptions : ITextDocumentRegistrationOptions, IWorkDoneProgressOptions, IStaticRegistrationOptions { /// /// An optional identifier under which the diagnostics are diff --git a/src/Protocol/Features/Document/InlayHintFeature.cs b/src/Protocol/Features/Document/InlayHintFeature.cs index 9747c018f..ef8168687 100644 --- a/src/Protocol/Features/Document/InlayHintFeature.cs +++ b/src/Protocol/Features/Document/InlayHintFeature.cs @@ -1,4 +1,4 @@ -using System.Collections.ObjectModel; +using System.Collections.ObjectModel; using System.Diagnostics; using MediatR; using Newtonsoft.Json; @@ -12,6 +12,7 @@ using OmniSharp.Extensions.LanguageServer.Protocol.Models; using OmniSharp.Extensions.LanguageServer.Protocol.Serialization; using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters; +using OmniSharp.Extensions.LanguageServer.Protocol.Server; using OmniSharp.Extensions.LanguageServer.Protocol.Server.Capabilities; // ReSharper disable once CheckNamespace @@ -26,7 +27,7 @@ namespace Models GenerateHandlerMethods, GenerateRequestMethods(typeof(ITextDocumentLanguageClient), typeof(ILanguageClient)) ] - [RegistrationOptions(typeof(InlayHintRegistrationOptions)), Capability(typeof(InlayHintWorkspaceClientCapabilities))] + [RegistrationOptions(typeof(InlayHintRegistrationOptions)), Capability(typeof(InlayHintClientCapabilities))] [Resolver(typeof(InlayHint))] public partial record InlayHintParams : ITextDocumentIdentifierParams, IWorkDoneProgressParams, IRequest @@ -55,7 +56,7 @@ public partial record InlayHintParams : ITextDocumentIdentifierParams, IWorkDone [GenerateRequestMethods(typeof(ITextDocumentLanguageClient), typeof(ILanguageClient))] [GenerateTypedData] [GenerateContainer] - [Capability(typeof(InlayHintWorkspaceClientCapabilities))] + [Capability(typeof(InlayHintClientCapabilities))] public partial record InlayHint : ICanBeResolved, IRequest, IDoesNotParticipateInRegistration { /// @@ -265,10 +266,18 @@ public enum InlayHintKind Parameter = 2 } + [Parallel] + [Method(WorkspaceNames.InlayHintRefresh, Direction.ServerToClient)] + [GenerateHandler("OmniSharp.Extensions.LanguageServer.Protocol.Workspace")] + [GenerateHandlerMethods] + [GenerateRequestMethods(typeof(IWorkspaceLanguageServer), typeof(ILanguageServer))] + [Capability(typeof(InlayHintWorkspaceClientCapabilities))] + public partial record InlayHintRefreshParams : IRequest; + [GenerateRegistrationOptions(nameof(ServerCapabilities.InlayHintProvider))] [RegistrationOptionsConverter(typeof(InlayHintRegistrationOptionsConverter))] [RegistrationName(TextDocumentNames.InlayHint)] - public partial class InlayHintRegistrationOptions : ITextDocumentRegistrationOptions, IWorkDoneProgressOptions + public partial class InlayHintRegistrationOptions : ITextDocumentRegistrationOptions, IWorkDoneProgressOptions, IStaticRegistrationOptions { /// /// The server provides support to resolve additional @@ -301,7 +310,7 @@ public override StaticOptions Convert(InlayHintRegistrationOptions source) namespace Client.Capabilities { [CapabilityKey(nameof(ClientCapabilities.TextDocument), nameof(TextDocumentClientCapabilities.InlayHint))] - public partial class InlayHintWorkspaceClientCapabilities : DynamicCapability + public partial class InlayHintClientCapabilities : DynamicCapability { /// /// Indicates which properties a client can resolve lazily on a inlay @@ -322,6 +331,27 @@ public class InlayHintCapabilityResolveSupport /// public Container Properties { get; set; } } + + /// + /// Client workspace capabilities specific to inlay hints. + /// + /// @since 3.17.0. + /// + [CapabilityKey(nameof(ClientCapabilities.Workspace), nameof(WorkspaceClientCapabilities.SemanticTokens))] + public class InlayHintWorkspaceClientCapabilities : ICapability + { + /// + /// Whether the client implementation supports a refresh request sent from + /// the server to the client. + /// + /// Note that this event is global and will force the client to refresh all + /// inlay hints currently shown. It should be used with absolute care and + /// is useful for situation where a server for example detects a project wide + /// change that requires such a calculation. + /// + [Optional] + public bool RefreshSupport { get; set; } + } } namespace Document diff --git a/src/Protocol/Features/Document/InlineValueFeature.cs b/src/Protocol/Features/Document/InlineValueFeature.cs index 0e014b027..b904f531c 100644 --- a/src/Protocol/Features/Document/InlineValueFeature.cs +++ b/src/Protocol/Features/Document/InlineValueFeature.cs @@ -1,4 +1,4 @@ -using System.Diagnostics; +using System.Diagnostics; using MediatR; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -25,7 +25,7 @@ namespace Models GenerateHandlerMethods, GenerateRequestMethods(typeof(ITextDocumentLanguageClient), typeof(ILanguageClient)) ] - [RegistrationOptions(typeof(InlineValueRegistrationOptions)), Capability(typeof(InlineValueWorkspaceClientCapabilities))] + [RegistrationOptions(typeof(InlineValueRegistrationOptions)), Capability(typeof(InlineValueClientCapabilities))] public partial record InlineValueParams : ITextDocumentIdentifierParams, IWorkDoneProgressParams, IRequest?> { @@ -69,7 +69,7 @@ public partial record InlineValueContext [GenerateHandler("OmniSharp.Extensions.LanguageServer.Protocol.Workspace")] [GenerateHandlerMethods] [GenerateRequestMethods(typeof(IWorkspaceLanguageServer), typeof(ILanguageServer))] - [Capability(typeof(CodeLensWorkspaceClientCapabilities))] + [Capability(typeof(InlineValueWorkspaceClientCapabilities))] public partial record InlineValueRefreshParams : IRequest; [JsonConverter(typeof(Converter))] @@ -179,7 +179,7 @@ public partial record InlineValueEvaluatableExpression : InlineValueBase [GenerateRegistrationOptions(nameof(ServerCapabilities.InlineValueProvider))] [RegistrationName(TextDocumentNames.InlineValue)] - public partial class InlineValueRegistrationOptions : ITextDocumentRegistrationOptions, IWorkDoneProgressOptions + public partial class InlineValueRegistrationOptions : ITextDocumentRegistrationOptions, IWorkDoneProgressOptions, IStaticRegistrationOptions { } } @@ -190,12 +190,17 @@ namespace Server.Capabilities namespace Client.Capabilities { + [CapabilityKey(nameof(ClientCapabilities.TextDocument), nameof(TextDocumentClientCapabilities.InlineValue))] + public partial class InlineValueClientCapabilities : DynamicCapability + { + } + /// /// Client workspace capabilities specific to inline values. /// /// @since 3.17.0 /// - [CapabilityKey(nameof(ClientCapabilities.TextDocument), nameof(TextDocumentClientCapabilities.InlineValue))] + [CapabilityKey(nameof(ClientCapabilities.Workspace), nameof(WorkspaceClientCapabilities.InlineValue))] public partial class InlineValueWorkspaceClientCapabilities : ICapability { /// diff --git a/src/Protocol/Features/Document/SemanticTokensFeature.cs b/src/Protocol/Features/Document/SemanticTokensFeature.cs index cd9d56358..dc651b2ed 100644 --- a/src/Protocol/Features/Document/SemanticTokensFeature.cs +++ b/src/Protocol/Features/Document/SemanticTokensFeature.cs @@ -790,14 +790,17 @@ public partial class SemanticTokensCapabilityRequestFull /// /// @since 3.16.0. /// - [CapabilityKey(nameof(ClientCapabilities.TextDocument), nameof(WorkspaceClientCapabilities.SemanticTokens))] + [CapabilityKey(nameof(ClientCapabilities.Workspace), nameof(WorkspaceClientCapabilities.SemanticTokens))] public class SemanticTokensWorkspaceCapability : ICapability { /// - /// Whether the client implementation supports a refresh request send from - /// the server to the client. This is useful if a server detects a project - /// wide configuration change which requires a re-calculation of all semantic - /// tokens provided by the server issuing the request. + /// Whether the client implementation supports a refresh request sent from + /// the server to the client. + /// + /// Note that this event is global and will force the client to refresh all + /// semantic tokens currently shown. It should be used with absolute care + /// and is useful for situation where a server for example detect a project + /// wide change that requires such a calculation. /// [Optional] public bool RefreshSupport { get; set; } diff --git a/src/Protocol/Features/Workspace/DidChangeConfigurationFeature.cs b/src/Protocol/Features/Workspace/DidChangeConfigurationFeature.cs index 2011eadf7..83468c6b1 100644 --- a/src/Protocol/Features/Workspace/DidChangeConfigurationFeature.cs +++ b/src/Protocol/Features/Workspace/DidChangeConfigurationFeature.cs @@ -26,7 +26,7 @@ public partial record DidChangeConfigurationParams : IRequest namespace Client.Capabilities { - [CapabilityKey(nameof(ClientCapabilities.TextDocument), nameof(WorkspaceClientCapabilities.Configuration))] + [CapabilityKey(nameof(ClientCapabilities.Workspace), nameof(WorkspaceClientCapabilities.Configuration))] public partial class DidChangeConfigurationCapability : DynamicCapability { } diff --git a/src/Protocol/Features/Workspace/DidChangeWatchedFilesFeature.cs b/src/Protocol/Features/Workspace/DidChangeWatchedFilesFeature.cs index fe48f3cef..7e02f041f 100644 --- a/src/Protocol/Features/Workspace/DidChangeWatchedFilesFeature.cs +++ b/src/Protocol/Features/Workspace/DidChangeWatchedFilesFeature.cs @@ -36,7 +36,7 @@ public partial class DidChangeWatchedFilesRegistrationOptions namespace Client.Capabilities { - [CapabilityKey(nameof(ClientCapabilities.TextDocument), nameof(WorkspaceClientCapabilities.DidChangeWatchedFiles))] + [CapabilityKey(nameof(ClientCapabilities.Workspace), nameof(WorkspaceClientCapabilities.DidChangeWatchedFiles))] public partial class DidChangeWatchedFilesCapability : DynamicCapability { /// diff --git a/src/Protocol/Features/Workspace/ExecuteCommandFeature.cs b/src/Protocol/Features/Workspace/ExecuteCommandFeature.cs index cadf26083..1b69c1085 100644 --- a/src/Protocol/Features/Workspace/ExecuteCommandFeature.cs +++ b/src/Protocol/Features/Workspace/ExecuteCommandFeature.cs @@ -107,7 +107,7 @@ public override StaticOptions Convert(ExecuteCommandRegistrationOptions source) namespace Client.Capabilities { - [CapabilityKey(nameof(ClientCapabilities.TextDocument), nameof(WorkspaceClientCapabilities.ExecuteCommand))] + [CapabilityKey(nameof(ClientCapabilities.Workspace), nameof(WorkspaceClientCapabilities.ExecuteCommand))] public class ExecuteCommandCapability : DynamicCapability { } diff --git a/src/Protocol/Features/Workspace/WorkspaceSymbolsFeature.cs b/src/Protocol/Features/Workspace/WorkspaceSymbolsFeature.cs index 7626390d5..62baefaa4 100644 --- a/src/Protocol/Features/Workspace/WorkspaceSymbolsFeature.cs +++ b/src/Protocol/Features/Workspace/WorkspaceSymbolsFeature.cs @@ -187,7 +187,7 @@ public override StaticOptions Convert(WorkspaceSymbolRegistrationOptions source) namespace Client.Capabilities { - [CapabilityKey(nameof(ClientCapabilities.TextDocument), nameof(WorkspaceClientCapabilities.Symbol))] + [CapabilityKey(nameof(ClientCapabilities.Workspace), nameof(WorkspaceClientCapabilities.Symbol))] public partial class WorkspaceSymbolCapability : DynamicCapability // { /// diff --git a/src/Protocol/WorkspaceNames.cs b/src/Protocol/WorkspaceNames.cs index 598adb7bf..4c757b513 100644 --- a/src/Protocol/WorkspaceNames.cs +++ b/src/Protocol/WorkspaceNames.cs @@ -22,5 +22,6 @@ public static class WorkspaceNames public const string InlineValueRefresh = "workspace/inlineValue/refresh"; public const string DiagnosticRefresh = "workspace/diagnostic/refresh"; public const string Diagnostics = "workspace/diagnostic"; + public const string InlayHintRefresh = "workspace/inlayHint/refresh"; } } diff --git a/test/Generation.Tests/snapshots/LspFeatureTests.Supports_Params_Type_As_Source.00AssemblyCapabilityKeys.verified.cs b/test/Generation.Tests/snapshots/LspFeatureTests.Supports_Params_Type_As_Source.00AssemblyCapabilityKeys.verified.cs index 52a6b6c98..cb652ae8f 100644 --- a/test/Generation.Tests/snapshots/LspFeatureTests.Supports_Params_Type_As_Source.00AssemblyCapabilityKeys.verified.cs +++ b/test/Generation.Tests/snapshots/LspFeatureTests.Supports_Params_Type_As_Source.00AssemblyCapabilityKeys.verified.cs @@ -13,4 +13,4 @@ using OmniSharp.Extensions.LanguageServer.Protocol.Workspace; using System.Diagnostics; -[assembly: AssemblyCapabilityKey(typeof(OmniSharp.Extensions.LanguageServer.Protocol.Client.Capabilities.WorkspaceSymbolCapability), nameof(ClientCapabilities.TextDocument), nameof(WorkspaceClientCapabilities.Symbol))] \ No newline at end of file +[assembly: AssemblyCapabilityKey(typeof(OmniSharp.Extensions.LanguageServer.Protocol.Client.Capabilities.WorkspaceSymbolCapability), nameof(ClientCapabilities.Workspace), nameof(WorkspaceClientCapabilities.Symbol))]