Skip to content

Updated capabilities to indicate which handler they are tied too, th… #37

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Oct 18, 2017
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
7 changes: 5 additions & 2 deletions src/Lsp/Capabilities/Client/CodeActionCapability.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
using OmniSharp.Extensions.LanguageServer.Abstractions;
using OmniSharp.Extensions.LanguageServer.Protocol;

namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
{
public class CodeActionCapability : DynamicCapability { }
public class CodeActionCapability : DynamicCapability, ConnectedCapability<ICodeActionHandler> { }
}
7 changes: 5 additions & 2 deletions src/Lsp/Capabilities/Client/CodeLensCapability.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
using OmniSharp.Extensions.LanguageServer.Capabilities.Server;
using OmniSharp.Extensions.LanguageServer.Protocol;

namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
{
public class CodeLensCapability : DynamicCapability { }
public class CodeLensCapability : DynamicCapability, ConnectedCapability<ICodeLensHandler> { }
}
6 changes: 4 additions & 2 deletions src/Lsp/Capabilities/Client/CompletionCapability.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
using OmniSharp.Extensions.LanguageServer.Protocol;

namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
{
public class CompletionCapability : DynamicCapability
public class CompletionCapability : DynamicCapability, ConnectedCapability<ICompletionHandler>
{
/// <summary>
/// The client supports the following `CompletionItem` specific
Expand Down
8 changes: 8 additions & 0 deletions src/Lsp/Capabilities/Client/ConnectedCapability.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using OmniSharp.Extensions.JsonRpc;

namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
{
internal interface ConnectedCapability<out T>
where T : IJsonRpcHandler
{ }
}
6 changes: 4 additions & 2 deletions src/Lsp/Capabilities/Client/DefinitionCapability.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
using OmniSharp.Extensions.LanguageServer.Protocol;

namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
{
public class DefinitionCapability : DynamicCapability { }
public class DefinitionCapability : DynamicCapability, ConnectedCapability<IDefinitionHandler> { }
}
6 changes: 4 additions & 2 deletions src/Lsp/Capabilities/Client/DocumentFormattingCapability.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
using OmniSharp.Extensions.LanguageServer.Protocol;

namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
{
public class DocumentFormattingCapability : DynamicCapability { }
public class DocumentFormattingCapability : DynamicCapability, ConnectedCapability<IDocumentFormattingHandler> { }
}
6 changes: 4 additions & 2 deletions src/Lsp/Capabilities/Client/DocumentHighlightCapability.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
using OmniSharp.Extensions.LanguageServer.Protocol;

namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
{
public class DocumentHighlightCapability : DynamicCapability { }
public class DocumentHighlightCapability : DynamicCapability, ConnectedCapability<IDocumentHighlightHandler> { }
}
6 changes: 4 additions & 2 deletions src/Lsp/Capabilities/Client/DocumentLinkCapability.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
using OmniSharp.Extensions.LanguageServer.Protocol;

namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
{
public class DocumentLinkCapability : DynamicCapability { }
public class DocumentLinkCapability : DynamicCapability, ConnectedCapability<IDocumentLinkHandler> { }
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
using OmniSharp.Extensions.LanguageServer.Protocol;

namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
{
public class DocumentOnTypeFormattingCapability : DynamicCapability { }
public class DocumentOnTypeFormattingCapability : DynamicCapability, ConnectedCapability<IDocumentOnTypeFormatHandler> { }
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
using OmniSharp.Extensions.LanguageServer.Protocol.Document;

namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
{
public class DocumentRangeFormattingCapability : DynamicCapability { }
public class DocumentRangeFormattingCapability : DynamicCapability, ConnectedCapability<IDocumentRangeFormattingHandler> { }
}
6 changes: 4 additions & 2 deletions src/Lsp/Capabilities/Client/DocumentSymbolCapability.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
using OmniSharp.Extensions.LanguageServer.Protocol;

namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
{
public class DocumentSymbolCapability : DynamicCapability { }
public class DocumentSymbolCapability : DynamicCapability, ConnectedCapability<IDocumentSymbolHandler> { }
}
6 changes: 4 additions & 2 deletions src/Lsp/Capabilities/Client/ExecuteCommandCapability.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
using OmniSharp.Extensions.LanguageServer.Protocol;

namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
{
public class ExecuteCommandCapability : DynamicCapability { }
public class ExecuteCommandCapability : DynamicCapability, ConnectedCapability<IExecuteCommandHandler> { }
}
6 changes: 4 additions & 2 deletions src/Lsp/Capabilities/Client/HoverCapability.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
using OmniSharp.Extensions.LanguageServer.Protocol;

namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
{
public class HoverCapability : DynamicCapability { }
public class HoverCapability : DynamicCapability, ConnectedCapability<IHoverHandler> { }
}
6 changes: 4 additions & 2 deletions src/Lsp/Capabilities/Client/ReferencesCapability.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
using OmniSharp.Extensions.LanguageServer.Protocol;

namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
{
public class ReferencesCapability : DynamicCapability { }
public class ReferencesCapability : DynamicCapability, ConnectedCapability<IReferencesHandler> { }
}
6 changes: 4 additions & 2 deletions src/Lsp/Capabilities/Client/RenameCapability.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
using OmniSharp.Extensions.LanguageServer.Protocol;

namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
{
public class RenameCapability : DynamicCapability { }
public class RenameCapability : DynamicCapability, ConnectedCapability<IRenameHandler> { }
}
6 changes: 4 additions & 2 deletions src/Lsp/Capabilities/Client/SignatureHelpCapability.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
using OmniSharp.Extensions.LanguageServer.Protocol;

namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
{
public class SignatureHelpCapability : DynamicCapability { }
public class SignatureHelpCapability : DynamicCapability, ConnectedCapability<ISignatureHelpHandler> { }
}
6 changes: 4 additions & 2 deletions src/Lsp/Capabilities/Client/WorkspaceSymbolCapability.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
using OmniSharp.Extensions.LanguageServer.Protocol;

namespace OmniSharp.Extensions.LanguageServer.Capabilities.Client
{
public class WorkspaceSymbolCapability : DynamicCapability { }
public class WorkspaceSymbolCapability : DynamicCapability, ConnectedCapability<IWorkspaceSymbolsHandler> { }
}
73 changes: 73 additions & 0 deletions src/Lsp/ClientCapabilityProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
using System;
using System.Linq;
using System.Reflection;
using OmniSharp.Extensions.JsonRpc;
using OmniSharp.Extensions.LanguageServer.Abstractions;
using OmniSharp.Extensions.LanguageServer.Capabilities.Client;

namespace OmniSharp.Extensions.LanguageServer
{
internal class ClientCapabilityProvider
{
private readonly IHandlerCollection _collection;

public ClientCapabilityProvider(IHandlerCollection collection)
{
_collection = collection;
}

public bool HasHandler<T>(Supports<T> capability)
where T : DynamicCapability, ConnectedCapability<IJsonRpcHandler>
{
if (!capability.IsSupported) return false;
if (capability.Value == null) return false;
if (capability.Value.DynamicRegistration) return false;

var handlerType = typeof(T).GetTypeInfo().ImplementedInterfaces
.Single(x => x.GetTypeInfo().IsGenericType && x.GetTypeInfo().GetGenericTypeDefinition() == typeof(ConnectedCapability<>))
.GetTypeInfo().GetGenericArguments()[0].GetTypeInfo();
return !capability.Value.DynamicRegistration && _collection.Any(z => z.HandlerType.GetTypeInfo().IsAssignableFrom(handlerType));
}

public IOptionsGetter GetOptions<T>(Supports<T> capability)
where T : DynamicCapability, ConnectedCapability<IJsonRpcHandler>
{
return !HasHandler(capability) ? Null : new OptionsGetter(_collection);
}

private static readonly IOptionsGetter Null = new NullOptionsGetter();

public interface IOptionsGetter
{
TOptions Get<TInterface, TOptions>(Func<TInterface, TOptions> action)
where TOptions : class;
}

private class NullOptionsGetter : IOptionsGetter
{
public TOptions Get<TInterface, TOptions>(Func<TInterface, TOptions> action)
where TOptions : class
{
return null;
}
}

private class OptionsGetter : IOptionsGetter
{
private readonly IHandlerCollection _collection;

public OptionsGetter(IHandlerCollection collection)
{
_collection = collection;
}

public TOptions Get<TInterface, TOptions>(Func<TInterface, TOptions> action)
where TOptions : class
{
return _collection
.Select(x => x.Registration?.RegisterOptions is TInterface cl ? action(cl) : null)
.FirstOrDefault(x => x != null);
}
}
}
}
6 changes: 3 additions & 3 deletions src/Lsp/HandlerCollection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,10 @@ public IDisposable Add(params IJsonRpcHandler[] handlers)
var key = "default";
if (handler is IRegistration<TextDocumentRegistrationOptions>)
{
var options = GetTextDocumentRegistrationOptionsMethod
if (GetTextDocumentRegistrationOptionsMethod
.MakeGenericMethod(registration)
.Invoke(handler, new object[] { handler }) as TextDocumentRegistrationOptions;
key = options.DocumentSelector;
.Invoke(handler, new object[] { handler }) is TextDocumentRegistrationOptions options)
key = options.DocumentSelector;
}

var h = new HandlerDescriptor(
Expand Down
12 changes: 6 additions & 6 deletions src/Lsp/HandlerDescriptor.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.Reflection;
using OmniSharp.Extensions.JsonRpc;
using OmniSharp.Extensions.LanguageServer.Abstractions;
Expand Down Expand Up @@ -59,17 +59,17 @@ public Registration Registration

public void SetCapability(object instance)
{
if (instance is DynamicCapability dc)
{
AllowsDynamicRegistration = dc.DynamicRegistration;
}

// TODO: Cache this
GetType()
.GetTypeInfo()
.GetMethod(nameof(SetCapability), BindingFlags.NonPublic | BindingFlags.Static)
.MakeGenericMethod(CapabilityType)
.Invoke(this, new[] { Handler, instance });

if (instance is DynamicCapability dc)
{
AllowsDynamicRegistration = dc.DynamicRegistration;
}
}

public string Method { get; }
Expand Down
Loading