Skip to content

Commit c451a74

Browse files
Fixed DocumentTextSync converter / Added semantic token refresh notification (#344)
* Added additional textdocumentsync converter tests * added new semantic token refresh handler * fixed partial abstract handler
1 parent 5497d76 commit c451a74

22 files changed

+579
-259
lines changed

src/Client/LanguageClientRegistrationManager.cs

+5
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@ public void RegisterCapabilities(ServerCapabilities serverCapabilities)
7777
continue;
7878
}
7979

80+
if (string.IsNullOrWhiteSpace(registrationOptions.Id))
81+
{
82+
registrationOptions.Id = Guid.NewGuid().ToString();
83+
}
84+
8085
var reg = new Registration {
8186
Id = registrationOptions.Id,
8287
Method = method,

src/JsonRpc.Generators/GenerateHandlerMethodsGenerator.cs

+8-4
Original file line numberDiff line numberDiff line change
@@ -330,13 +330,13 @@ MemberDeclarationSyntax MakeDerivedAction(TypeSyntax syntax)
330330
{
331331
var partialTypeSyntax = ResolveTypeName(partialItem);
332332

333-
method = method.WithExpressionBody(GetPartialResultHandlerExpression(GetMethodName(handlerInterface), requestType, responseType));
333+
method = method.WithExpressionBody(GetPartialResultHandlerExpression(GetMethodName(handlerInterface), requestType, partialItem, responseType));
334334

335335
yield return MakeAction(CreatePartialAction(requestType, partialTypeSyntax, true));
336336
yield return MakeAction(CreatePartialAction(requestType, partialTypeSyntax, false));
337337
if (capability != null)
338338
{
339-
method = method.WithExpressionBody(GetPartialResultCapabilityHandlerExpression(GetMethodName(handlerInterface), requestType, responseType, capability));
339+
method = method.WithExpressionBody(GetPartialResultCapabilityHandlerExpression(GetMethodName(handlerInterface), requestType, partialItem, responseType, capability));
340340
yield return MakeAction(CreatePartialAction(requestType, partialTypeSyntax, capability));
341341
}
342342
}
@@ -346,6 +346,10 @@ MemberDeclarationSyntax MakeDerivedAction(TypeSyntax syntax)
346346
method = method.WithExpressionBody(
347347
GetRequestCapabilityHandlerExpression(GetMethodName(handlerInterface), requestType, responseType, capability)
348348
);
349+
if (responseType.Name == "Unit")
350+
{
351+
method = method.WithExpressionBody(GetVoidRequestCapabilityHandlerExpression(GetMethodName(handlerInterface), requestType, capability));
352+
}
349353
yield return MakeAction(CreateAsyncFunc(responseType, requestType, capability));
350354
}
351355
}
@@ -443,15 +447,15 @@ MemberDeclarationSyntax MakeDerivedAction(TypeSyntax syntax)
443447
{
444448
var partialTypeSyntax = ResolveTypeName(partialItem);
445449

446-
method = method.WithBody(GetPartialResultRegistrationHandlerExpression(GetMethodName(handlerInterface), requestType, responseType, registrationOptions));
450+
method = method.WithBody(GetPartialResultRegistrationHandlerExpression(GetMethodName(handlerInterface), requestType, partialItem, responseType, registrationOptions));
447451

448452
yield return MakeAction(CreatePartialAction(requestType, partialTypeSyntax, true));
449453
yield return MakeAction(CreatePartialAction(requestType, partialTypeSyntax, false));
450454
if (capability != null)
451455
{
452456
method = method.WithBody(
453457
GetPartialResultRegistrationHandlerExpression(
454-
GetMethodName(handlerInterface), requestType, responseType, registrationOptions,
458+
GetMethodName(handlerInterface), requestType, partialItem, responseType, registrationOptions,
455459
capability
456460
)
457461
);

src/JsonRpc.Generators/Helpers.cs

+56-5
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,29 @@ ITypeSymbol capability
444444
);
445445
}
446446

447+
public static ArrowExpressionClauseSyntax GetVoidRequestCapabilityHandlerExpression(
448+
ExpressionSyntax nameExpression, ITypeSymbol requestType,
449+
ITypeSymbol capability
450+
)
451+
{
452+
var requestName = ResolveTypeName(requestType);
453+
var capabilityName = ResolveTypeName(capability);
454+
return ArrowExpressionClause(
455+
AddHandler(
456+
Argument(nameExpression),
457+
Argument(
458+
CreateHandlerArgument(
459+
IdentifierName("LanguageProtocolDelegatingHandlers"),
460+
"RequestCapability",
461+
requestName,
462+
capabilityName
463+
)
464+
.WithArgumentList(GetHandlerArgumentList())
465+
)
466+
)
467+
);
468+
}
469+
447470
public static BlockSyntax GetRequestRegistrationHandlerExpression(
448471
ExpressionSyntax nameExpression, ITypeSymbol requestType, ITypeSymbol responseType,
449472
ITypeSymbol registrationOptions
@@ -593,36 +616,44 @@ public static ArrowExpressionClauseSyntax GetRequestHandlerExpression(Expression
593616
}
594617

595618
public static ArrowExpressionClauseSyntax GetPartialResultCapabilityHandlerExpression(
596-
ExpressionSyntax nameExpression, ITypeSymbol requestType, ITypeSymbol responseType,
619+
ExpressionSyntax nameExpression, ITypeSymbol requestType, ITypeSymbol itemType, ITypeSymbol responseType,
597620
ITypeSymbol capability
598621
)
599622
{
600623
var requestName = ResolveTypeName(requestType);
624+
var itemName = ResolveTypeName(itemType);
601625
var responseName = ResolveTypeName(responseType);
602626
var capabilityName = ResolveTypeName(capability);
603627
return ArrowExpressionClause(
604628
AddHandler(
605629
Argument(nameExpression),
606630
Argument(
631+
SimpleLambdaExpression(
632+
Parameter(
633+
Identifier("_")
634+
),
607635
CreateHandlerArgument(
608636
IdentifierName("LanguageProtocolDelegatingHandlers"),
609637
"PartialResultCapability",
610638
requestName,
611639
responseName,
640+
itemName,
612641
capabilityName
613642
)
614643
.WithArgumentList(GetPartialResultArgumentList(responseName))
644+
)
615645
)
616646
)
617647
);
618648
}
619649

620650
public static BlockSyntax GetPartialResultRegistrationHandlerExpression(
621-
ExpressionSyntax nameExpression, ITypeSymbol requestType, ITypeSymbol responseType,
651+
ExpressionSyntax nameExpression, ITypeSymbol requestType, ITypeSymbol itemType, ITypeSymbol responseType,
622652
ITypeSymbol registrationOptions
623653
)
624654
{
625655
var requestName = ResolveTypeName(requestType);
656+
var itemName = ResolveTypeName(itemType);
626657
var responseName = ResolveTypeName(responseType);
627658
var registrationOptionsName = ResolveTypeName(registrationOptions);
628659
return Block(
@@ -631,27 +662,34 @@ ITypeSymbol registrationOptions
631662
AddHandler(
632663
Argument(nameExpression),
633664
Argument(
665+
SimpleLambdaExpression(
666+
Parameter(
667+
Identifier("_")
668+
),
634669
CreateHandlerArgument(
635670
IdentifierName("LanguageProtocolDelegatingHandlers"),
636671
"PartialResult",
637672
requestName,
638673
responseName,
674+
itemName,
639675
registrationOptionsName
640676
)
641677
.WithArgumentList(GetPartialResultRegistrationArgumentList(IdentifierName("registrationOptions"), responseName))
678+
)
642679
)
643680
)
644681
)
645682
);
646683
}
647684

648685
public static BlockSyntax GetPartialResultRegistrationHandlerExpression(
649-
ExpressionSyntax nameExpression, ITypeSymbol requestType, ITypeSymbol responseType,
686+
ExpressionSyntax nameExpression, ITypeSymbol requestType, ITypeSymbol itemType, ITypeSymbol responseType,
650687
ITypeSymbol registrationOptions,
651688
ITypeSymbol capability
652689
)
653690
{
654691
var requestName = ResolveTypeName(requestType);
692+
var itemName = ResolveTypeName(itemType);
655693
var responseName = ResolveTypeName(responseType);
656694
var registrationOptionsName = ResolveTypeName(registrationOptions);
657695
var capabilityName = ResolveTypeName(capability);
@@ -661,36 +699,49 @@ ITypeSymbol capability
661699
AddHandler(
662700
Argument(nameExpression),
663701
Argument(
702+
SimpleLambdaExpression(
703+
Parameter(
704+
Identifier("_")
705+
),
664706
CreateHandlerArgument(
665707
IdentifierName("LanguageProtocolDelegatingHandlers"),
666708
"PartialResult",
667709
requestName,
668710
responseName,
711+
itemName,
669712
capabilityName,
670713
registrationOptionsName
671714
)
672715
.WithArgumentList(GetPartialResultRegistrationArgumentList(IdentifierName("registrationOptions"), responseName))
716+
)
673717
)
674718
)
675719
)
676720
);
677721
}
678722

679-
public static ArrowExpressionClauseSyntax GetPartialResultHandlerExpression(ExpressionSyntax nameExpression, ITypeSymbol requestType, ITypeSymbol responseType)
723+
public static ArrowExpressionClauseSyntax GetPartialResultHandlerExpression(ExpressionSyntax nameExpression, ITypeSymbol requestType, ITypeSymbol partialItem, ITypeSymbol responseType)
680724
{
681725
var requestName = ResolveTypeName(requestType);
726+
var itemName = ResolveTypeName(partialItem);
682727
var responseName = ResolveTypeName(responseType);
683728
return ArrowExpressionClause(
684729
AddHandler(
685730
Argument(nameExpression),
686731
Argument(
732+
SimpleLambdaExpression(
733+
Parameter(
734+
Identifier("_")
735+
),
687736
CreateHandlerArgument(
688737
IdentifierName("LanguageProtocolDelegatingHandlers"),
689738
"PartialResult",
690739
requestName,
691-
responseName
740+
responseName,
741+
itemName
692742
)
693743
.WithArgumentList(GetPartialResultArgumentList(responseName))
744+
)
694745
)
695746
)
696747
);

src/Protocol/AbstractHandlers.cs

+6-6
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ public abstract class Request<TParams, TResult, TCapability, TRegistrationOption
3333
void ICapability<TCapability>.SetCapability(TCapability capability) => Capability = capability;
3434
}
3535

36-
public abstract class PartialResult<TItem, TResponse, TCapability, TRegistrationOptions> :
37-
IJsonRpcRequestHandler<TItem, TResponse>,
36+
public abstract class PartialResult<TParams, TResponse, TItem, TCapability, TRegistrationOptions> :
37+
IJsonRpcRequestHandler<TParams, TResponse>,
3838
IRegistration<TRegistrationOptions>, ICapability<TCapability>
39-
where TItem : IPartialItemRequest<TResponse, TItem>
39+
where TParams : IPartialItemRequest<TResponse, TItem>
4040
where TResponse : class, new()
4141
where TRegistrationOptions : class, new()
4242
where TCapability : ICapability
@@ -57,8 +57,8 @@ Func<TItem, TResponse> factory
5757
_factory = factory;
5858
}
5959

60-
async Task<TResponse> IRequestHandler<TItem, TResponse>.Handle(
61-
TItem request,
60+
async Task<TResponse> IRequestHandler<TParams, TResponse>.Handle(
61+
TParams request,
6262
CancellationToken cancellationToken
6363
)
6464
{
@@ -78,7 +78,7 @@ CancellationToken cancellationToken
7878
}
7979

8080
protected abstract void Handle(
81-
TItem request, IObserver<TItem> results,
81+
TParams request, IObserver<TItem> results,
8282
CancellationToken cancellationToken
8383
);
8484

src/Protocol/Document/Proposals/ISemanticTokensDeltaHandler.cs

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
using System;
2+
using System.Reactive.Subjects;
23
using System.Threading;
34
using System.Threading.Tasks;
5+
using MediatR;
46
using OmniSharp.Extensions.JsonRpc;
7+
using OmniSharp.Extensions.JsonRpc.Generation;
58
using OmniSharp.Extensions.LanguageServer.Protocol.Client;
69
using OmniSharp.Extensions.LanguageServer.Protocol.Client.Capabilities;
710
using OmniSharp.Extensions.LanguageServer.Protocol.Models;
@@ -14,6 +17,7 @@ namespace OmniSharp.Extensions.LanguageServer.Protocol.Document.Proposals
1417
[Obsolete(Constants.Proposal)]
1518
[Parallel]
1619
[Method(TextDocumentNames.SemanticTokensFull, Direction.ClientToServer)]
20+
[GenerateHandlerMethods]
1721
public interface ISemanticTokensHandler : IJsonRpcRequestHandler<SemanticTokensParams, SemanticTokens>,
1822
IRegistration<SemanticTokensRegistrationOptions>, ICapability<SemanticTokensCapability>
1923
{
@@ -22,6 +26,7 @@ public interface ISemanticTokensHandler : IJsonRpcRequestHandler<SemanticTokensP
2226
[Obsolete(Constants.Proposal)]
2327
[Parallel]
2428
[Method(TextDocumentNames.SemanticTokensFullDelta, Direction.ClientToServer)]
29+
[GenerateHandlerMethods]
2530
public interface ISemanticTokensDeltaHandler :
2631
IJsonRpcRequestHandler<SemanticTokensDeltaParams, SemanticTokensFullOrDelta?>,
2732
IRegistration<SemanticTokensRegistrationOptions>, ICapability<SemanticTokensCapability>, IDoesNotParticipateInRegistration
@@ -31,6 +36,7 @@ public interface ISemanticTokensDeltaHandler :
3136
[Obsolete(Constants.Proposal)]
3237
[Parallel]
3338
[Method(TextDocumentNames.SemanticTokensRange, Direction.ClientToServer)]
39+
[GenerateHandlerMethods]
3440
public interface ISemanticTokensRangeHandler : IJsonRpcRequestHandler<SemanticTokensRangeParams, SemanticTokens>,
3541
IRegistration<SemanticTokensRegistrationOptions>, ICapability<SemanticTokensCapability>, IDoesNotParticipateInRegistration
3642
{
@@ -79,7 +85,7 @@ public virtual async Task<SemanticTokens> Handle(SemanticTokensRangeParams reque
7985
}
8086

8187
[Obsolete(Constants.Proposal)]
82-
public static class SemanticTokensExtensions
88+
public static partial class SemanticTokensExtensions
8389
{
8490
public static ILanguageServerRegistry OnSemanticTokens(
8591
this ILanguageServerRegistry registry,

0 commit comments

Comments
 (0)