Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/Client/LanguageClientRegistrationManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,11 @@ public void RegisterCapabilities(ServerCapabilities serverCapabilities)
continue;
}

if (string.IsNullOrWhiteSpace(registrationOptions.Id))
{
registrationOptions.Id = Guid.NewGuid().ToString();
}

var reg = new Registration {
Id = registrationOptions.Id,
Method = method,
Expand Down
12 changes: 8 additions & 4 deletions src/JsonRpc.Generators/GenerateHandlerMethodsGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -330,13 +330,13 @@ MemberDeclarationSyntax MakeDerivedAction(TypeSyntax syntax)
{
var partialTypeSyntax = ResolveTypeName(partialItem);

method = method.WithExpressionBody(GetPartialResultHandlerExpression(GetMethodName(handlerInterface), requestType, responseType));
method = method.WithExpressionBody(GetPartialResultHandlerExpression(GetMethodName(handlerInterface), requestType, partialItem, responseType));

yield return MakeAction(CreatePartialAction(requestType, partialTypeSyntax, true));
yield return MakeAction(CreatePartialAction(requestType, partialTypeSyntax, false));
if (capability != null)
{
method = method.WithExpressionBody(GetPartialResultCapabilityHandlerExpression(GetMethodName(handlerInterface), requestType, responseType, capability));
method = method.WithExpressionBody(GetPartialResultCapabilityHandlerExpression(GetMethodName(handlerInterface), requestType, partialItem, responseType, capability));
yield return MakeAction(CreatePartialAction(requestType, partialTypeSyntax, capability));
}
}
Expand All @@ -346,6 +346,10 @@ MemberDeclarationSyntax MakeDerivedAction(TypeSyntax syntax)
method = method.WithExpressionBody(
GetRequestCapabilityHandlerExpression(GetMethodName(handlerInterface), requestType, responseType, capability)
);
if (responseType.Name == "Unit")
{
method = method.WithExpressionBody(GetVoidRequestCapabilityHandlerExpression(GetMethodName(handlerInterface), requestType, capability));
}
yield return MakeAction(CreateAsyncFunc(responseType, requestType, capability));
}
}
Expand Down Expand Up @@ -443,15 +447,15 @@ MemberDeclarationSyntax MakeDerivedAction(TypeSyntax syntax)
{
var partialTypeSyntax = ResolveTypeName(partialItem);

method = method.WithBody(GetPartialResultRegistrationHandlerExpression(GetMethodName(handlerInterface), requestType, responseType, registrationOptions));
method = method.WithBody(GetPartialResultRegistrationHandlerExpression(GetMethodName(handlerInterface), requestType, partialItem, responseType, registrationOptions));

yield return MakeAction(CreatePartialAction(requestType, partialTypeSyntax, true));
yield return MakeAction(CreatePartialAction(requestType, partialTypeSyntax, false));
if (capability != null)
{
method = method.WithBody(
GetPartialResultRegistrationHandlerExpression(
GetMethodName(handlerInterface), requestType, responseType, registrationOptions,
GetMethodName(handlerInterface), requestType, partialItem, responseType, registrationOptions,
capability
)
);
Expand Down
61 changes: 56 additions & 5 deletions src/JsonRpc.Generators/Helpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -444,6 +444,29 @@ ITypeSymbol capability
);
}

public static ArrowExpressionClauseSyntax GetVoidRequestCapabilityHandlerExpression(
ExpressionSyntax nameExpression, ITypeSymbol requestType,
ITypeSymbol capability
)
{
var requestName = ResolveTypeName(requestType);
var capabilityName = ResolveTypeName(capability);
return ArrowExpressionClause(
AddHandler(
Argument(nameExpression),
Argument(
CreateHandlerArgument(
IdentifierName("LanguageProtocolDelegatingHandlers"),
"RequestCapability",
requestName,
capabilityName
)
.WithArgumentList(GetHandlerArgumentList())
)
)
);
}

public static BlockSyntax GetRequestRegistrationHandlerExpression(
ExpressionSyntax nameExpression, ITypeSymbol requestType, ITypeSymbol responseType,
ITypeSymbol registrationOptions
Expand Down Expand Up @@ -593,36 +616,44 @@ public static ArrowExpressionClauseSyntax GetRequestHandlerExpression(Expression
}

public static ArrowExpressionClauseSyntax GetPartialResultCapabilityHandlerExpression(
ExpressionSyntax nameExpression, ITypeSymbol requestType, ITypeSymbol responseType,
ExpressionSyntax nameExpression, ITypeSymbol requestType, ITypeSymbol itemType, ITypeSymbol responseType,
ITypeSymbol capability
)
{
var requestName = ResolveTypeName(requestType);
var itemName = ResolveTypeName(itemType);
var responseName = ResolveTypeName(responseType);
var capabilityName = ResolveTypeName(capability);
return ArrowExpressionClause(
AddHandler(
Argument(nameExpression),
Argument(
SimpleLambdaExpression(
Parameter(
Identifier("_")
),
CreateHandlerArgument(
IdentifierName("LanguageProtocolDelegatingHandlers"),
"PartialResultCapability",
requestName,
responseName,
itemName,
capabilityName
)
.WithArgumentList(GetPartialResultArgumentList(responseName))
)
)
)
);
}

public static BlockSyntax GetPartialResultRegistrationHandlerExpression(
ExpressionSyntax nameExpression, ITypeSymbol requestType, ITypeSymbol responseType,
ExpressionSyntax nameExpression, ITypeSymbol requestType, ITypeSymbol itemType, ITypeSymbol responseType,
ITypeSymbol registrationOptions
)
{
var requestName = ResolveTypeName(requestType);
var itemName = ResolveTypeName(itemType);
var responseName = ResolveTypeName(responseType);
var registrationOptionsName = ResolveTypeName(registrationOptions);
return Block(
Expand All @@ -631,27 +662,34 @@ ITypeSymbol registrationOptions
AddHandler(
Argument(nameExpression),
Argument(
SimpleLambdaExpression(
Parameter(
Identifier("_")
),
CreateHandlerArgument(
IdentifierName("LanguageProtocolDelegatingHandlers"),
"PartialResult",
requestName,
responseName,
itemName,
registrationOptionsName
)
.WithArgumentList(GetPartialResultRegistrationArgumentList(IdentifierName("registrationOptions"), responseName))
)
)
)
)
);
}

public static BlockSyntax GetPartialResultRegistrationHandlerExpression(
ExpressionSyntax nameExpression, ITypeSymbol requestType, ITypeSymbol responseType,
ExpressionSyntax nameExpression, ITypeSymbol requestType, ITypeSymbol itemType, ITypeSymbol responseType,
ITypeSymbol registrationOptions,
ITypeSymbol capability
)
{
var requestName = ResolveTypeName(requestType);
var itemName = ResolveTypeName(itemType);
var responseName = ResolveTypeName(responseType);
var registrationOptionsName = ResolveTypeName(registrationOptions);
var capabilityName = ResolveTypeName(capability);
Expand All @@ -661,36 +699,49 @@ ITypeSymbol capability
AddHandler(
Argument(nameExpression),
Argument(
SimpleLambdaExpression(
Parameter(
Identifier("_")
),
CreateHandlerArgument(
IdentifierName("LanguageProtocolDelegatingHandlers"),
"PartialResult",
requestName,
responseName,
itemName,
capabilityName,
registrationOptionsName
)
.WithArgumentList(GetPartialResultRegistrationArgumentList(IdentifierName("registrationOptions"), responseName))
)
)
)
)
);
}

public static ArrowExpressionClauseSyntax GetPartialResultHandlerExpression(ExpressionSyntax nameExpression, ITypeSymbol requestType, ITypeSymbol responseType)
public static ArrowExpressionClauseSyntax GetPartialResultHandlerExpression(ExpressionSyntax nameExpression, ITypeSymbol requestType, ITypeSymbol partialItem, ITypeSymbol responseType)
{
var requestName = ResolveTypeName(requestType);
var itemName = ResolveTypeName(partialItem);
var responseName = ResolveTypeName(responseType);
return ArrowExpressionClause(
AddHandler(
Argument(nameExpression),
Argument(
SimpleLambdaExpression(
Parameter(
Identifier("_")
),
CreateHandlerArgument(
IdentifierName("LanguageProtocolDelegatingHandlers"),
"PartialResult",
requestName,
responseName
responseName,
itemName
)
.WithArgumentList(GetPartialResultArgumentList(responseName))
)
)
)
);
Expand Down
12 changes: 6 additions & 6 deletions src/Protocol/AbstractHandlers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@ public abstract class Request<TParams, TResult, TCapability, TRegistrationOption
void ICapability<TCapability>.SetCapability(TCapability capability) => Capability = capability;
}

public abstract class PartialResult<TItem, TResponse, TCapability, TRegistrationOptions> :
IJsonRpcRequestHandler<TItem, TResponse>,
public abstract class PartialResult<TParams, TResponse, TItem, TCapability, TRegistrationOptions> :
IJsonRpcRequestHandler<TParams, TResponse>,
IRegistration<TRegistrationOptions>, ICapability<TCapability>
where TItem : IPartialItemRequest<TResponse, TItem>
where TParams : IPartialItemRequest<TResponse, TItem>
where TResponse : class, new()
where TRegistrationOptions : class, new()
where TCapability : ICapability
Expand All @@ -57,8 +57,8 @@ Func<TItem, TResponse> factory
_factory = factory;
}

async Task<TResponse> IRequestHandler<TItem, TResponse>.Handle(
TItem request,
async Task<TResponse> IRequestHandler<TParams, TResponse>.Handle(
TParams request,
CancellationToken cancellationToken
)
{
Expand All @@ -78,7 +78,7 @@ CancellationToken cancellationToken
}

protected abstract void Handle(
TItem request, IObserver<TItem> results,
TParams request, IObserver<TItem> results,
CancellationToken cancellationToken
);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
using System;
using System.Reactive.Subjects;
using System.Threading;
using System.Threading.Tasks;
using MediatR;
using OmniSharp.Extensions.JsonRpc;
using OmniSharp.Extensions.JsonRpc.Generation;
using OmniSharp.Extensions.LanguageServer.Protocol.Client;
using OmniSharp.Extensions.LanguageServer.Protocol.Client.Capabilities;
using OmniSharp.Extensions.LanguageServer.Protocol.Models;
Expand All @@ -14,6 +17,7 @@ namespace OmniSharp.Extensions.LanguageServer.Protocol.Document.Proposals
[Obsolete(Constants.Proposal)]
[Parallel]
[Method(TextDocumentNames.SemanticTokensFull, Direction.ClientToServer)]
[GenerateHandlerMethods]
public interface ISemanticTokensHandler : IJsonRpcRequestHandler<SemanticTokensParams, SemanticTokens>,
IRegistration<SemanticTokensRegistrationOptions>, ICapability<SemanticTokensCapability>
{
Expand All @@ -22,6 +26,7 @@ public interface ISemanticTokensHandler : IJsonRpcRequestHandler<SemanticTokensP
[Obsolete(Constants.Proposal)]
[Parallel]
[Method(TextDocumentNames.SemanticTokensFullDelta, Direction.ClientToServer)]
[GenerateHandlerMethods]
public interface ISemanticTokensDeltaHandler :
IJsonRpcRequestHandler<SemanticTokensDeltaParams, SemanticTokensFullOrDelta?>,
IRegistration<SemanticTokensRegistrationOptions>, ICapability<SemanticTokensCapability>, IDoesNotParticipateInRegistration
Expand All @@ -31,6 +36,7 @@ public interface ISemanticTokensDeltaHandler :
[Obsolete(Constants.Proposal)]
[Parallel]
[Method(TextDocumentNames.SemanticTokensRange, Direction.ClientToServer)]
[GenerateHandlerMethods]
public interface ISemanticTokensRangeHandler : IJsonRpcRequestHandler<SemanticTokensRangeParams, SemanticTokens>,
IRegistration<SemanticTokensRegistrationOptions>, ICapability<SemanticTokensCapability>, IDoesNotParticipateInRegistration
{
Expand Down Expand Up @@ -79,7 +85,7 @@ public virtual async Task<SemanticTokens> Handle(SemanticTokensRangeParams reque
}

[Obsolete(Constants.Proposal)]
public static class SemanticTokensExtensions
public static partial class SemanticTokensExtensions
{
public static ILanguageServerRegistry OnSemanticTokens(
this ILanguageServerRegistry registry,
Expand Down
Loading