From 21ba4aba3c6c427ce9bc6a43c33fc4cd09762d9b Mon Sep 17 00:00:00 2001 From: David Driscoll Date: Thu, 15 Feb 2018 17:03:45 -0500 Subject: [PATCH 1/2] Added preprocessing for notifications --- src/Server/LspRequestRouter.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Server/LspRequestRouter.cs b/src/Server/LspRequestRouter.cs index 44b4c2c28..3dcf4bbf9 100644 --- a/src/Server/LspRequestRouter.cs +++ b/src/Server/LspRequestRouter.cs @@ -93,6 +93,15 @@ public async Task RouteNotification(IHandlerDescriptor descriptor, Notification { _logger.LogDebug("Converting params for Notification {Method} to {Type}", notification.Method, descriptor.Params.FullName); var @params = notification.Params.ToObject(descriptor.Params, _serializer.JsonSerializer); + + var lspDescriptor = descriptor as ILspHandlerDescriptor; + + foreach (var preProcessor in _routeMatchers.ForHandlerPreProcessorMatcher() + .SelectMany(strat => strat.FindPreProcessor(lspDescriptor, @params))) + { + @params = preProcessor.Process(lspDescriptor, @params); + } + await ReflectionRequestHandlers.HandleNotification(descriptor, @params); } } @@ -138,6 +147,7 @@ public async Task RouteRequest(IHandlerDescriptor descriptor, Req _logger.LogError(new EventId(-32602), cannotDeserializeRequestParams, "Failed to deserialise request parameters."); return new InvalidParams(request.Id); } + var lspDescriptor = descriptor as ILspHandlerDescriptor; foreach (var preProcessor in _routeMatchers.ForHandlerPreProcessorMatcher() From 88584d988da318d0aba7b245a4ac0e2f7701aa7d Mon Sep 17 00:00:00 2001 From: David Driscoll Date: Thu, 15 Feb 2018 17:32:02 -0500 Subject: [PATCH 2/2] fixed goof --- src/Server/Matchers/ResolveCommandMatcher.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Server/Matchers/ResolveCommandMatcher.cs b/src/Server/Matchers/ResolveCommandMatcher.cs index 14b51fa98..7b903474d 100644 --- a/src/Server/Matchers/ResolveCommandMatcher.cs +++ b/src/Server/Matchers/ResolveCommandMatcher.cs @@ -9,7 +9,7 @@ namespace OmniSharp.Extensions.LanguageServer.Server.Matchers { - public class ResolveCommandMatcher : IHandlerMatcher, IHandlerPostProcessorMatcher, IHandlerPreProcessor, IHandlerPostProcessor + public class ResolveCommandMatcher : IHandlerMatcher, IHandlerPreProcessorMatcher, IHandlerPostProcessorMatcher, IHandlerPreProcessor, IHandlerPostProcessor { private readonly ILogger _logger; internal static string PrivateHandlerTypeName = "$$___handlerType___$$"; @@ -79,6 +79,17 @@ private static bool CanResolve(ICanBeResolvedHandler handler, T value) return handler.CanResolve(value); } + public IEnumerable FindPreProcessor(ILspHandlerDescriptor descriptor, object parameters) + { + if (parameters is ICanBeResolved canBeResolved) + { + _logger.LogTrace("Using handler {Method}:{Handler}", + descriptor.Method, + descriptor.Handler.GetType().FullName); + yield return this; + } + } + public IEnumerable FindPostProcessor(ILspHandlerDescriptor descriptor, object parameters, object response) { if (descriptor.Method == DocumentNames.CodeLens || descriptor.Method == DocumentNames.Completion)