Skip to content

Commit 60ebb3a

Browse files
Updated client registration handler to behave more like the vscode (#457)
* OnTypeRename -> LinkedEditingRange * Updated shas * Updated client registration handler to behave more like the vscode one, unknown handlers will throw. Also fixed bug where some handlers were export their registration options when they shouldn't be * Updated registration helpers
1 parent 6354163 commit 60ebb3a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+175
-130
lines changed

LSP.sln

-17
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = ".build", ".build\.build.csp
5252
EndProject
5353
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".build", ".build", "{26522B49-0743-4CBE-BA67-6D17FF65CAB9}"
5454
EndProject
55-
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "benchmarks", "benchmarks", "{954FB493-FA91-470B-8A78-FA32A7B05E97}"
56-
EndProject
57-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pipeline", "benchmarks\Pipeline\Pipeline.csproj", "{B781CDC6-34BB-4131-B18A-3B1294F53062}"
58-
EndProject
5955
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared", "src\Shared\Shared.csproj", "{18FB2302-023B-4F6F-9F6D-099B47B69D9F}"
6056
EndProject
6157
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dap.Tests", "test\Dap.Tests\Dap.Tests.csproj", "{6D9E5BF4-4666-476B-AC88-D108A80567F6}"
@@ -212,18 +208,6 @@ Global
212208
{28B13787-A442-4D28-BF9A-3D65BF13AAEC}.Release|Any CPU.ActiveCfg = Release|Any CPU
213209
{28B13787-A442-4D28-BF9A-3D65BF13AAEC}.Release|x64.ActiveCfg = Release|Any CPU
214210
{28B13787-A442-4D28-BF9A-3D65BF13AAEC}.Release|x86.ActiveCfg = Release|Any CPU
215-
{B781CDC6-34BB-4131-B18A-3B1294F53062}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
216-
{B781CDC6-34BB-4131-B18A-3B1294F53062}.Debug|Any CPU.Build.0 = Debug|Any CPU
217-
{B781CDC6-34BB-4131-B18A-3B1294F53062}.Debug|x64.ActiveCfg = Debug|Any CPU
218-
{B781CDC6-34BB-4131-B18A-3B1294F53062}.Debug|x64.Build.0 = Debug|Any CPU
219-
{B781CDC6-34BB-4131-B18A-3B1294F53062}.Debug|x86.ActiveCfg = Debug|Any CPU
220-
{B781CDC6-34BB-4131-B18A-3B1294F53062}.Debug|x86.Build.0 = Debug|Any CPU
221-
{B781CDC6-34BB-4131-B18A-3B1294F53062}.Release|Any CPU.ActiveCfg = Release|Any CPU
222-
{B781CDC6-34BB-4131-B18A-3B1294F53062}.Release|Any CPU.Build.0 = Release|Any CPU
223-
{B781CDC6-34BB-4131-B18A-3B1294F53062}.Release|x64.ActiveCfg = Release|Any CPU
224-
{B781CDC6-34BB-4131-B18A-3B1294F53062}.Release|x64.Build.0 = Release|Any CPU
225-
{B781CDC6-34BB-4131-B18A-3B1294F53062}.Release|x86.ActiveCfg = Release|Any CPU
226-
{B781CDC6-34BB-4131-B18A-3B1294F53062}.Release|x86.Build.0 = Release|Any CPU
227211
{18FB2302-023B-4F6F-9F6D-099B47B69D9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
228212
{18FB2302-023B-4F6F-9F6D-099B47B69D9F}.Debug|Any CPU.Build.0 = Debug|Any CPU
229213
{18FB2302-023B-4F6F-9F6D-099B47B69D9F}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -360,7 +344,6 @@ Global
360344
{F2C9D555-118E-442B-A953-9A7B58A53F33} = {D764E024-3D3F-4112-B932-2DB722A1BACC}
361345
{E1A9123B-A236-4240-8C82-A61BD85C3BF4} = {D764E024-3D3F-4112-B932-2DB722A1BACC}
362346
{28B13787-A442-4D28-BF9A-3D65BF13AAEC} = {26522B49-0743-4CBE-BA67-6D17FF65CAB9}
363-
{B781CDC6-34BB-4131-B18A-3B1294F53062} = {954FB493-FA91-470B-8A78-FA32A7B05E97}
364347
{18FB2302-023B-4F6F-9F6D-099B47B69D9F} = {D764E024-3D3F-4112-B932-2DB722A1BACC}
365348
{6D9E5BF4-4666-476B-AC88-D108A80567F6} = {2F323ED5-EBF8-45E1-B9D3-C014561B3DDA}
366349
{678A4DD2-A656-4DCC-AE78-F9940C82A6E6} = {D764E024-3D3F-4112-B932-2DB722A1BACC}

src/Client/LanguageClientRegistrationManager.cs

+18-9
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,9 @@ ILogger<LanguageClientRegistrationManager> logger
4040
_registrations = new ConcurrentDictionary<string, Registration>(StringComparer.OrdinalIgnoreCase);
4141
}
4242

43-
Task<Unit> IRequestHandler<RegistrationParams, Unit>.Handle(RegistrationParams request, CancellationToken cancellationToken)
43+
async Task<Unit> IRequestHandler<RegistrationParams, Unit>.Handle(RegistrationParams request, CancellationToken cancellationToken)
4444
{
45+
await Task.Yield();
4546
lock (this)
4647
{
4748
Register(request.Registrations.ToArray());
@@ -52,11 +53,12 @@ Task<Unit> IRequestHandler<RegistrationParams, Unit>.Handle(RegistrationParams r
5253
_registrationSubject.OnNext(_registrations.Values);
5354
}
5455

55-
return Unit.Task;
56+
return Unit.Value;
5657
}
5758

58-
Task<Unit> IRequestHandler<UnregistrationParams, Unit>.Handle(UnregistrationParams request, CancellationToken cancellationToken)
59+
async Task<Unit> IRequestHandler<UnregistrationParams, Unit>.Handle(UnregistrationParams request, CancellationToken cancellationToken)
5960
{
61+
await Task.Yield();
6062
lock (this)
6163
{
6264
foreach (var item in request.Unregisterations ?? new UnregistrationContainer())
@@ -70,7 +72,7 @@ Task<Unit> IRequestHandler<UnregistrationParams, Unit>.Handle(UnregistrationPara
7072
_registrationSubject.OnNext(_registrations.Values);
7173
}
7274

73-
return Unit.Task;
75+
return Unit.Value;
7476
}
7577

7678
public void RegisterCapabilities(ServerCapabilities serverCapabilities)
@@ -123,19 +125,25 @@ public void RegisterCapabilities(ServerCapabilities serverCapabilities)
123125

124126
private void Register(params Registration[] registrations)
125127
{
128+
var newRegistrations = new List<Registration>();
126129
foreach (var registration in registrations)
127130
{
128-
Register(registration);
131+
newRegistrations.Add(Register(registration));
132+
}
133+
134+
foreach (var reg in newRegistrations)
135+
{
136+
_registrations.AddOrUpdate(reg.Id, reg, (a, b) => reg);
129137
}
130138
}
131139

132-
private void Register(Registration registration)
140+
private Registration Register(Registration registration)
133141
{
134142
var registrationType = _handlerTypeDescriptorProvider.GetRegistrationType(registration.Method);
135143
if (registrationType == null)
136144
{
137-
_registrations.AddOrUpdate(registration.Id, x => registration, (a, b) => registration);
138-
return;
145+
// vscode client throws if given an unknown registration type
146+
throw new NotSupportedException($"Unknown Registration Type '{registration.Method}'");
139147
}
140148

141149
var deserializedRegistration = new Registration {
@@ -145,7 +153,8 @@ private void Register(Registration registration)
145153
? token.ToObject(registrationType, _serializer.JsonSerializer)
146154
: registration.RegisterOptions
147155
};
148-
_registrations.AddOrUpdate(deserializedRegistration.Id, x => deserializedRegistration, (a, b) => deserializedRegistration);
156+
157+
return deserializedRegistration;
149158
}
150159

151160
public IObservable<IEnumerable<Registration>> Registrations

src/JsonRpc.Generators/Strategies/HandlerGeneratorStrategy.cs

+5
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ public IEnumerable<MemberDeclarationSyntax> Apply(GeneratorData item)
4040
.WithModifiers(item.TypeDeclaration.Modifiers)
4141
.AddBaseListTypes(SimpleBaseType(GetBaseHandlerInterface(item)));
4242

43+
if (item.Request.Symbol.AllInterfaces.Any(z => z.Name == "IDoesNotParticipateInRegistration"))
44+
{
45+
handlerInterface = handlerInterface.AddBaseListTypes(SimpleBaseType(IdentifierName("IDoesNotParticipateInRegistration")));
46+
}
47+
4348
if (!handlerInterface.Modifiers.Any(z => z.IsKind(SyntaxKind.PartialKeyword)))
4449
{
4550
handlerInterface = handlerInterface.AddModifiers(Token(SyntaxKind.PartialKeyword));

src/JsonRpc/InputHandler.cs

-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ public InputHandler(
8888
supportContentModified,
8989
concurrency,
9090
TaskPoolScheduler.Default
91-
// new EventLoopScheduler(_ => new Thread(_) {IsBackground = true, Name = "InputHandler"})
9291
);
9392
_headersBuffer = new Memory<byte>(new byte[HeadersFinishedLength]);
9493
_contentLengthBuffer = new Memory<byte>(new byte[ContentLengthLength]);

src/JsonRpc/OutputHandler.cs

-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ ILogger<OutputHandler> logger
7373
serializer,
7474
outputFilters,
7575
TaskPoolScheduler.Default,
76-
//new EventLoopScheduler(_ => new Thread(_) { IsBackground = true, Name = "OutputHandler" }),
7776
logger
7877
)
7978
{

src/Protocol/Features/Document/CodeActionFeature.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public record CodeActionContext
9999
GenerateContainer
100100
]
101101
[RegistrationOptions(typeof(CodeActionRegistrationOptions)), Capability(typeof(CodeActionCapability))]
102-
public partial record CodeAction : ICanBeResolved, IRequest<CodeAction>
102+
public partial record CodeAction : ICanBeResolved, IRequest<CodeAction>, IDoesNotParticipateInRegistration
103103
{
104104
/// <summary>
105105
/// A short, human-readable, title for this code action.
@@ -286,6 +286,7 @@ public partial class CodeActionContainer<T>
286286

287287
[GenerateRegistrationOptions(nameof(ServerCapabilities.CodeActionProvider))]
288288
[RegistrationOptionsConverter(typeof(CodeActionRegistrationOptionsConverter))]
289+
[RegistrationName(TextDocumentNames.CodeAction)]
289290
public partial class CodeActionRegistrationOptions : IWorkDoneProgressOptions, ITextDocumentRegistrationOptions
290291
{
291292
/// <summary>

src/Protocol/Features/Document/CodeLensFeature.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public partial record CodeLensParams : ITextDocumentIdentifierParams, IWorkDoneP
6363
GenerateContainer
6464
]
6565
[RegistrationOptions(typeof(CodeLensRegistrationOptions)), Capability(typeof(CodeLensCapability))]
66-
public partial record CodeLens : IRequest<CodeLens>, ICanBeResolved
66+
public partial record CodeLens : IRequest<CodeLens>, ICanBeResolved, IDoesNotParticipateInRegistration
6767
{
6868
/// <summary>
6969
/// The range in which this code lens is valid. Should only span a single line.
@@ -91,6 +91,7 @@ public partial record CodeLens : IRequest<CodeLens>, ICanBeResolved
9191

9292
[GenerateRegistrationOptions(nameof(ServerCapabilities.CodeLensProvider))]
9393
[RegistrationOptionsConverter(typeof(CodeLensRegistrationOptionsConverter))]
94+
[RegistrationName(TextDocumentNames.CodeLens)]
9495
public partial class CodeLensRegistrationOptions : IWorkDoneProgressOptions, ITextDocumentRegistrationOptions
9596
{
9697
/// <summary>

src/Protocol/Features/Document/ColorFeature.cs

+1
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ public record DocumentColor
137137
}
138138

139139
[GenerateRegistrationOptions(nameof(ServerCapabilities.ColorProvider))]
140+
[RegistrationName(TextDocumentNames.DocumentColor)]
140141
public partial class DocumentColorRegistrationOptions : IWorkDoneProgressOptions, ITextDocumentRegistrationOptions, IStaticRegistrationOptions
141142
{
142143
}

src/Protocol/Features/Document/CompletionFeature.cs

+69-68
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public partial record CompletionParams : TextDocumentPositionParams, IWorkDonePr
6161
GenerateTypedData
6262
]
6363
[RegistrationOptions(typeof(CompletionRegistrationOptions)), Capability(typeof(CompletionCapability))]
64-
public partial record CompletionItem : ICanBeResolved, IRequest<CompletionItem>
64+
public partial record CompletionItem : ICanBeResolved, IRequest<CompletionItem>, IDoesNotParticipateInRegistration
6565
{
6666
/// <summary>
6767
/// The label of this completion item. By default
@@ -217,8 +217,57 @@ public partial record CompletionItem : ICanBeResolved, IRequest<CompletionItem>
217217
public override string ToString() => DebuggerDisplay;
218218
}
219219

220+
/// <summary>
221+
/// Completion item tags are extra annotations that tweak the rendering of a completion
222+
/// item.
223+
///
224+
/// @since 3.15.0
225+
/// </summary>
226+
[JsonConverter(typeof(NumberEnumConverter))]
227+
public enum CompletionItemTag
228+
{
229+
/// <summary>
230+
/// Render a completion as obsolete, usually using a strike-out.
231+
/// </summary>
232+
Deprecated = 1
233+
}
234+
235+
/// <summary>
236+
/// The kind of a completion entry.
237+
/// </summary>
238+
[JsonConverter(typeof(NumberEnumConverter))]
239+
public enum CompletionItemKind
240+
{
241+
Text = 1,
242+
Method = 2,
243+
Function = 3,
244+
Constructor = 4,
245+
Field = 5,
246+
Variable = 6,
247+
Class = 7,
248+
Interface = 8,
249+
Module = 9,
250+
Property = 10,
251+
Unit = 11,
252+
Value = 12,
253+
Enum = 13,
254+
Keyword = 14,
255+
Snippet = 15,
256+
Color = 16,
257+
File = 17,
258+
Reference = 18,
259+
Folder = 19,
260+
EnumMember = 20,
261+
Constant = 21,
262+
Struct = 22,
263+
Event = 23,
264+
Operator = 24,
265+
TypeParameter = 25,
266+
}
267+
220268
[GenerateRegistrationOptions(nameof(ServerCapabilities.CompletionProvider))]
221269
[RegistrationOptionsConverter(typeof(CompletionRegistrationOptionsConverter))]
270+
[RegistrationName(TextDocumentNames.Completion)]
222271
public partial class CompletionRegistrationOptions : IWorkDoneProgressOptions, ITextDocumentRegistrationOptions
223272
{
224273
/// <summary>
@@ -293,6 +342,25 @@ public record CompletionContext
293342
public string? TriggerCharacter { get; init; }
294343
}
295344

345+
[JsonConverter(typeof(NumberEnumConverter))]
346+
public enum CompletionTriggerKind
347+
{
348+
/// <summary>
349+
/// Completion was triggered by typing an identifier (24x7 code complete), manual invocation (e.g Ctrl+Space) or via API.
350+
/// </summary>
351+
Invoked = 1,
352+
353+
/// <summary>
354+
/// Completion was triggered by a trigger character specified by the `triggerCharacters` properties of the `CompletionRegistrationOptions`.
355+
/// </summary>
356+
TriggerCharacter = 2,
357+
358+
/// <summary>
359+
/// Completion was re-triggered as the current completion list is incomplete.
360+
/// </summary>
361+
TriggerForIncompleteCompletions = 3,
362+
}
363+
296364
/// <summary>
297365
/// Represents a collection of [completion items](#CompletionItem) to be presented
298366
/// in the editor.
@@ -514,73 +582,6 @@ public class CompletionItemKindCapabilityOptions
514582
public Container<CompletionItemKind>? ValueSet { get; set; }
515583
}
516584

517-
/// <summary>
518-
/// Completion item tags are extra annotations that tweak the rendering of a completion
519-
/// item.
520-
///
521-
/// @since 3.15.0
522-
/// </summary>
523-
[JsonConverter(typeof(NumberEnumConverter))]
524-
public enum CompletionItemTag
525-
{
526-
/// <summary>
527-
/// Render a completion as obsolete, usually using a strike-out.
528-
/// </summary>
529-
Deprecated = 1
530-
}
531-
532-
/// <summary>
533-
/// The kind of a completion entry.
534-
/// </summary>
535-
[JsonConverter(typeof(NumberEnumConverter))]
536-
public enum CompletionItemKind
537-
{
538-
Text = 1,
539-
Method = 2,
540-
Function = 3,
541-
Constructor = 4,
542-
Field = 5,
543-
Variable = 6,
544-
Class = 7,
545-
Interface = 8,
546-
Module = 9,
547-
Property = 10,
548-
Unit = 11,
549-
Value = 12,
550-
Enum = 13,
551-
Keyword = 14,
552-
Snippet = 15,
553-
Color = 16,
554-
File = 17,
555-
Reference = 18,
556-
Folder = 19,
557-
EnumMember = 20,
558-
Constant = 21,
559-
Struct = 22,
560-
Event = 23,
561-
Operator = 24,
562-
TypeParameter = 25,
563-
}
564-
565-
[JsonConverter(typeof(NumberEnumConverter))]
566-
public enum CompletionTriggerKind
567-
{
568-
/// <summary>
569-
/// Completion was triggered by typing an identifier (24x7 code complete), manual invocation (e.g Ctrl+Space) or via API.
570-
/// </summary>
571-
Invoked = 1,
572-
573-
/// <summary>
574-
/// Completion was triggered by a trigger character specified by the `triggerCharacters` properties of the `CompletionRegistrationOptions`.
575-
/// </summary>
576-
TriggerCharacter = 2,
577-
578-
/// <summary>
579-
/// Completion was re-triggered as the current completion list is incomplete.
580-
/// </summary>
581-
TriggerForIncompleteCompletions = 3,
582-
}
583-
584585
public class CompletionItemTagSupportCapabilityOptions
585586
{
586587
/// <summary>

src/Protocol/Features/Document/DeclarationFeature.cs

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ namespace Models
3030
public partial record DeclarationParams : TextDocumentPositionParams, IWorkDoneProgressParams, IPartialItemsRequest<LocationOrLocationLinks, LocationOrLocationLink> { }
3131

3232
[GenerateRegistrationOptions(nameof(ServerCapabilities.DeclarationProvider))]
33+
[RegistrationName(TextDocumentNames.Declaration)]
3334
public partial class DeclarationRegistrationOptions : ITextDocumentRegistrationOptions, IWorkDoneProgressOptions, IStaticRegistrationOptions
3435
{
3536
}

src/Protocol/Features/Document/DefinitionFeature.cs

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public partial record DefinitionParams : TextDocumentPositionParams, IWorkDonePr
2828
}
2929

3030
[GenerateRegistrationOptions(nameof(ServerCapabilities.DefinitionProvider))]
31+
[RegistrationName(TextDocumentNames.Definition)]
3132
public partial class DefinitionRegistrationOptions : ITextDocumentRegistrationOptions, IWorkDoneProgressOptions
3233
{
3334
}

src/Protocol/Features/Document/DocumentFormattingFeature.cs

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public partial record DocumentFormattingParams : ITextDocumentIdentifierParams,
3838
}
3939

4040
[GenerateRegistrationOptions(nameof(ServerCapabilities.DocumentFormattingProvider))]
41+
[RegistrationName(TextDocumentNames.DocumentFormatting)]
4142
public partial class DocumentFormattingRegistrationOptions : ITextDocumentRegistrationOptions, IWorkDoneProgressOptions { }
4243
}
4344

src/Protocol/Features/Document/DocumentHighlightFeature.cs

+1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ public enum DocumentHighlightKind
7272
}
7373

7474
[GenerateRegistrationOptions(nameof(ServerCapabilities.DocumentHighlightProvider))]
75+
[RegistrationName(TextDocumentNames.DocumentHighlight)]
7576
public partial class DocumentHighlightRegistrationOptions : ITextDocumentRegistrationOptions, IWorkDoneProgressOptions
7677
{
7778
}

src/Protocol/Features/Document/DocumentLinkFeature.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public partial record DocumentLinkParams : ITextDocumentIdentifierParams, IParti
6060
GenerateContainer
6161
]
6262
[RegistrationOptions(typeof(DocumentLinkRegistrationOptions)), Capability(typeof(DocumentLinkCapability))]
63-
public partial record DocumentLink : ICanBeResolved, IRequest<DocumentLink>
63+
public partial record DocumentLink : ICanBeResolved, IRequest<DocumentLink>, IDoesNotParticipateInRegistration
6464
{
6565
/// <summary>
6666
/// The range this link applies to.
@@ -99,6 +99,7 @@ public partial record DocumentLink : ICanBeResolved, IRequest<DocumentLink>
9999
}
100100

101101
[GenerateRegistrationOptions(nameof(ServerCapabilities.DocumentLinkProvider))]
102+
[RegistrationName(TextDocumentNames.DocumentLink)]
102103
[RegistrationOptionsConverter(typeof(DocumentLinkRegistrationOptionsConverter))]
103104
public partial class DocumentLinkRegistrationOptions : ITextDocumentRegistrationOptions, IWorkDoneProgressOptions
104105
{

0 commit comments

Comments
 (0)