diff --git a/src/Server/ClientCapabilityProvider.cs b/src/Server/ClientCapabilityProvider.cs index 49da27b84..010d418e7 100644 --- a/src/Server/ClientCapabilityProvider.cs +++ b/src/Server/ClientCapabilityProvider.cs @@ -25,10 +25,11 @@ public bool HasStaticHandler(Supports capability) if (capability.Value == null) return false; if (capability.Value.DynamicRegistration == true) 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 == true && _collection.ContainsHandler(handlerType); + var handlerTypes = typeof(T).GetTypeInfo().ImplementedInterfaces + .Where(x => x.GetTypeInfo().IsGenericType && x.GetTypeInfo().GetGenericTypeDefinition() == typeof(ConnectedCapability<>)) + .Select(x => x.GetTypeInfo().GetGenericArguments()[0].GetTypeInfo()); + + return handlerTypes.All(_collection.ContainsHandler); } public IOptionsGetter GetStaticOptions(Supports capability) diff --git a/test/Lsp.Tests/ClientCapabilityProviderTests.cs b/test/Lsp.Tests/ClientCapabilityProviderTests.cs index f4f8dcbd2..534443538 100644 --- a/test/Lsp.Tests/ClientCapabilityProviderTests.cs +++ b/test/Lsp.Tests/ClientCapabilityProviderTests.cs @@ -18,24 +18,9 @@ namespace Lsp.Tests { public class ClientCapabilityProviderTests { - private static readonly Type[] Capabilities = { - typeof(CompletionCapability), - typeof(HoverCapability), - typeof(SignatureHelpCapability), - typeof(ReferencesCapability), - typeof(DocumentHighlightCapability), - typeof(DocumentSymbolCapability), - typeof(DocumentFormattingCapability), - typeof(DocumentRangeFormattingCapability), - typeof(DocumentOnTypeFormattingCapability), - typeof(DefinitionCapability), - typeof(CodeActionCapability), - typeof(CodeLensCapability), - typeof(DocumentLinkCapability), - typeof(RenameCapability), - typeof(WorkspaceSymbolCapability), - typeof(ExecuteCommandCapability), - }; + private static readonly Type[] Capabilities = typeof(ClientCapabilities).Assembly.GetTypes() + .Where(x => x.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(ConnectedCapability<>))) + .ToArray(); [Theory, MemberData(nameof(AllowSupportedCapabilities))] public void Should_AllowSupportedCapabilities(IJsonRpcHandler handler, object instance) @@ -51,8 +36,8 @@ public void Should_AllowSupportedCapabilities(IJsonRpcHandler handler, object in public static IEnumerable AllowSupportedCapabilities() { return GetItems(Capabilities, type => { - var handlerType = GetHandlerType(type); - var handler = Substitute.For(new Type[] { handlerType }, new object[0]); + var handlerTypes = GetHandlerTypes(type); + var handler = Substitute.For(handlerTypes.ToArray(), new object[0]); return new[] { handler, Activator.CreateInstance(typeof(Supports<>).MakeGenericType(type), true, Activator.CreateInstance(type)) }; }); } @@ -99,8 +84,8 @@ public void Should_Invoke_Reduce_Delegate() public static IEnumerable DisallowUnsupportedCapabilities() { return GetItems(Capabilities, type => { - var handlerType = GetHandlerType(type); - var handler = Substitute.For(new Type[] { handlerType }, new object[0]); + var handlerTypes = GetHandlerTypes(type); + var handler = Substitute.For(handlerTypes.ToArray(), new object[0]); return new[] { handler, Activator.CreateInstance(typeof(Supports<>).MakeGenericType(type), false) }; }); } @@ -119,8 +104,8 @@ public void Should_DisallowNullSupportedCapabilities(IJsonRpcHandler handler, ob public static IEnumerable DisallowNullSupportsCapabilities() { return GetItems(Capabilities, type => { - var handlerType = GetHandlerType(type); - var handler = Substitute.For(new Type[] { handlerType }, new object[0]); + var handlerTypes = GetHandlerTypes(type); + var handler = Substitute.For(handlerTypes.ToArray(), new object[0]); return new[] { handler, Activator.CreateInstance(typeof(Supports<>).MakeGenericType(type), true) }; }); } @@ -150,11 +135,11 @@ private static IEnumerable GetItems(IEnumerable types, Func func(x).ToArray()); } - private static Type GetHandlerType(Type type) + private static IEnumerable GetHandlerTypes(Type type) { return type.GetTypeInfo().ImplementedInterfaces - .Single(x => x.GetTypeInfo().IsGenericType && x.GetTypeInfo().GetGenericTypeDefinition() == typeof(ConnectedCapability<>)) - .GetTypeInfo().GetGenericArguments()[0]; + .Where(x => x.GetTypeInfo().IsGenericType && x.GetTypeInfo().GetGenericTypeDefinition() == typeof(ConnectedCapability<>)) + .Select(x => x.GetTypeInfo().GetGenericArguments()[0]); } } }