public LspHandlerDescriptor( int index, string method, string key, IJsonRpcHandler handler, Type handlerType, Type? @params, Type?registrationType, string registrationMethod, object?registrationOptions, Type?capabilityType, RequestProcessType?requestProcessType, Action disposeAction, ILspHandlerTypeDescriptor?typeDescriptor, Guid?id ) { _disposeAction = disposeAction; Id = id.HasValue ? id.Value : handler is ICanBeIdentifiedHandler h && h.Id != Guid.Empty ? h.Id : Guid.NewGuid(); Method = method; Key = key; ImplementationType = handler.GetType(); Handler = handler; HandlerType = handlerType; Params = @params; RegistrationType = registrationType; RegistrationMethod = registrationMethod; RegistrationOptions = registrationOptions; CapabilityType = capabilityType; Response = @params?.GetInterfaces() .Where(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IRequest <>)) .Select(x => x.GetGenericArguments()[0]) .OrderBy(x => x == typeof(Unit)) .FirstOrDefault() ?? typeDescriptor?.ResponseType ?? typeof(Unit); // If multiple are implemented this behavior is unknown CanBeResolvedHandlerType = handler.GetType().GetTypeInfo() ?.ImplementedInterfaces ?.FirstOrDefault(x => typeof(ICanBeResolvedHandler).IsAssignableFrom(x)); HasReturnType = Response != null && Response != typeof(Unit); IsDelegatingHandler = @params?.IsGenericType == true && ( typeof(DelegatingRequest <>).IsAssignableFrom(@params.GetGenericTypeDefinition()) || typeof(DelegatingNotification <>).IsAssignableFrom(@params.GetGenericTypeDefinition()) ); IsNotification = handlerType.GetInterfaces() .Any(z => z.IsGenericType && typeof(IJsonRpcNotificationHandler <>).IsAssignableFrom(z.GetGenericTypeDefinition())); IsRequest = !IsNotification; RequestProcessType = requestProcessType; TypeDescriptor = typeDescriptor; Index = index; IsBuiltIn = handler.GetType().GetCustomAttributes <BuiltInAttribute>().Any(); }
public LspHandlerDescriptor( string method, string key, IJsonRpcHandler handler, Type handlerType, Type @params, Type registrationType, object registrationOptions, Func <bool> allowsDynamicRegistration, Type capabilityType, RequestProcessType?requestProcessType, Action disposeAction, ILspHandlerTypeDescriptor typeDescriptor ) { _disposeAction = disposeAction; Id = Guid.NewGuid(); Method = method; Key = key; ImplementationType = handler.GetType(); Handler = handler; HandlerType = handlerType; Params = @params; RegistrationType = registrationType; RegistrationOptions = registrationOptions; _allowsDynamicRegistration = allowsDynamicRegistration; CapabilityType = capabilityType; Response = typeDescriptor?.ResponseType ?? @params?.GetInterfaces() .FirstOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IRequest <>))? .GetGenericArguments()[0] ?? typeof(Unit); // If multiple are implemented this behavior is unknown CanBeResolvedHandlerType = handler.GetType().GetTypeInfo() .ImplementedInterfaces .FirstOrDefault(x => typeof(ICanBeResolvedHandler).IsAssignableFrom(x)); HasReturnType = Response != null && Response != typeof(Unit); IsDelegatingHandler = @params?.IsGenericType == true && ( typeof(DelegatingRequest <>).IsAssignableFrom(@params.GetGenericTypeDefinition()) || typeof(DelegatingNotification <>).IsAssignableFrom(@params.GetGenericTypeDefinition()) ); IsNotification = typeof(IJsonRpcNotificationHandler).IsAssignableFrom(handlerType) || handlerType .GetInterfaces().Any( z => z.IsGenericType && typeof(IJsonRpcNotificationHandler <>).IsAssignableFrom( z.GetGenericTypeDefinition() ) ); IsRequest = !IsNotification; RequestProcessType = requestProcessType; TypeDescriptor = typeDescriptor; }
public HandlerDescriptor( string method, string key, IJsonRpcHandler handler, Type handlerType, Type @params, Type registrationType, object registrationOptions, bool allowsDynamicRegistration, Type capabilityType, Action disposeAction) { _disposeAction = disposeAction; Id = Guid.NewGuid(); Method = method; Key = key; ImplementationType = handler.GetType(); Handler = handler; HandlerType = handlerType; Params = @params; Response = Response; RegistrationType = registrationType; RegistrationOptions = registrationOptions; AllowsDynamicRegistration = allowsDynamicRegistration; CapabilityType = capabilityType; var requestInterface = @params?.GetInterfaces() .FirstOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IRequest <>)); if (requestInterface != null) { Response = requestInterface.GetGenericArguments()[0]; } // If multiple are implemented this behavior is unknown CanBeResolvedHandlerType = handler.GetType().GetTypeInfo() .ImplementedInterfaces .FirstOrDefault(x => x.GetTypeInfo().IsGenericType&& x.GetTypeInfo().GetGenericTypeDefinition() == typeof(ICanBeResolvedHandler <>)); HasReturnType = HandlerType.GetInterfaces().Any(@interface => @interface.IsGenericType && typeof(IRequestHandler <,>).IsAssignableFrom(@interface.GetGenericTypeDefinition()) ); IsDelegatingHandler = @params?.IsGenericType == true && ( typeof(DelegatingRequest <>).IsAssignableFrom(@params.GetGenericTypeDefinition()) || typeof(DelegatingNotification <>).IsAssignableFrom(@params.GetGenericTypeDefinition()) ); if (handler is IOnStarted started) { StartedDelegate = started.OnStarted; } }
public LspHandlerDescriptorDisposable Add(string method, IJsonRpcHandler handler) { var descriptor = GetDescriptor(method, handler.GetType(), handler); _handlers.Add(descriptor); return(new LspHandlerDescriptorDisposable(descriptor)); }
public HandlerInstance( string method, IJsonRpcHandler handler, Type handlerInterface, Type? @params, Type?response, RequestProcessType?requestProcessType, Action disposeAction ) { _disposeAction = disposeAction; Handler = handler; ImplementationType = handler.GetType(); Method = method; HandlerType = handlerInterface; Params = @params; Response = response; HasReturnType = HandlerType.GetInterfaces().Any( @interface => @interface.IsGenericType && typeof(IRequestHandler <,>).IsAssignableFrom(@interface.GetGenericTypeDefinition()) ); IsDelegatingHandler = @params?.IsGenericType == true && ( typeof(DelegatingRequest <>).IsAssignableFrom(@params.GetGenericTypeDefinition()) || typeof(DelegatingNotification <>).IsAssignableFrom(@params.GetGenericTypeDefinition()) ); IsNotification = handlerInterface.GetInterfaces().Any( z => z.IsGenericType && typeof(IJsonRpcNotificationHandler <>).IsAssignableFrom(z.GetGenericTypeDefinition()) ); IsRequest = !IsNotification; RequestProcessType = requestProcessType; }
public IDisposable Add(string method, IJsonRpcHandler handler, JsonRpcHandlerOptions options) { var type = handler.GetType(); var @interface = HandlerTypeDescriptorHelper.GetHandlerInterface(type); Type @params = null; Type response = null; if (@interface.GetTypeInfo().IsGenericType) { @params = @interface.GetTypeInfo().GetGenericArguments()[0]; var requestInterface = @params.GetInterfaces() .FirstOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IRequest <>)); if (requestInterface != null) { response = requestInterface.GetGenericArguments()[0]; } } var requestProcessType = options?.RequestProcessType ?? _handlerTypeDescriptorProvider.GetHandlerTypeDescriptor(type)?.RequestProcessType ?? type.GetCustomAttributes(true) .Concat(@interface.GetCustomAttributes(true)) .OfType <ProcessAttribute>() .FirstOrDefault()?.Type; var descriptor = new HandlerInstance(method, handler, @interface, @params, response, requestProcessType, () => Remove(handler)); ImmutableInterlocked.InterlockedExchange(ref _descriptors, _descriptors.Add(descriptor)); return(descriptor); }
public HandlerInstance(string method, IJsonRpcHandler handler, Type handlerInterface, Type @params, Type response, Action disposeAction) { _disposeAction = disposeAction; Handler = handler; ImplementationType = handler.GetType(); Method = method; HandlerType = handlerInterface; Params = @params; Response = response; }
public LspHandlerDescriptorDisposable Add(string method, IJsonRpcHandler handler) { var descriptor = GetDescriptor(method, handler.GetType(), handler); _handlers.Add(descriptor); var cd = new CompositeDisposable(); if (descriptor.Handler is ITextDocumentIdentifier textDocumentIdentifier) { cd.Add(_textDocumentIdentifiers.Add(textDocumentIdentifier)); } return(new LspHandlerDescriptorDisposable(new[] { descriptor }, cd)); }
public HandlerDescriptor( string method, string key, IJsonRpcHandler handler, Type handlerType, Type @params, Type registrationType, Registration registration, Type capabilityType, Action disposeAction) { _disposeAction = disposeAction; Method = method; Key = key; ImplementationType = handler.GetType(); Handler = handler; HandlerType = handlerType; Params = @params; Response = Response; RegistrationType = registrationType; Registration = registration; CapabilityType = capabilityType; var requestInterface = @params?.GetInterfaces() .FirstOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IRequest <>)); if (requestInterface != null) { Response = requestInterface.GetGenericArguments()[0]; } // If multiple are implemented this behavior is unknown CanBeResolvedHandlerType = handler.GetType().GetTypeInfo() .ImplementedInterfaces .FirstOrDefault(x => x.GetTypeInfo().IsGenericType&& x.GetTypeInfo().GetGenericTypeDefinition() == typeof(ICanBeResolvedHandler <>)); }
public HandlerDescriptor(string method, string key, IJsonRpcHandler handler, Type handlerType, Type @params, Type registrationType, Type capabilityType, Action disposeAction) { _disposeAction = disposeAction; Handler = handler; Method = method; Key = key; HandlerType = handlerType; Params = @params; RegistrationType = registrationType; CapabilityType = capabilityType; // If multiple are implemented this behavior is unknown CanBeResolvedHandlerType = handler.GetType().GetTypeInfo() .ImplementedInterfaces .FirstOrDefault(x => x.GetTypeInfo().IsGenericType&& x.GetTypeInfo().GetGenericTypeDefinition() == typeof(ICanBeResolvedHandler <>)); }
public IDisposable Add(string method, IJsonRpcHandler handler) { var type = handler.GetType(); var @interface = GetHandlerInterface(type); Type @params = null; if (@interface.GetTypeInfo().IsGenericType) { @params = @interface.GetTypeInfo().GetGenericArguments()[0]; } var h = new HandlerInstance(method, handler, @interface, @params, () => Remove(handler)); _handlers.Add(h); return(h); }
public void SetCapability(ILspHandlerDescriptor descriptor, IJsonRpcHandler handler) { if (!descriptor.HasCapability) { return; } if (descriptor.CapabilityType == null || !handler.GetType().IsInstanceOfType(descriptor.CapabilityType)) { return; } if (_supports.TryGetValue(descriptor.CapabilityType, out var capability)) { SetCapabilityInnerMethod .MakeGenericMethod(descriptor.CapabilityType) .Invoke(null, new[] { handler, capability }); } }
public IDisposable Add(string method, IJsonRpcHandler handler) { var type = handler.GetType(); var @interface = GetHandlerInterface(type); Type @params = null; Type response = null; if (@interface.GetTypeInfo().IsGenericType) { @params = @interface.GetTypeInfo().GetGenericArguments()[0]; var requestInterface = @params.GetInterfaces() .FirstOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IRequest <>)); if (requestInterface != null) { response = requestInterface.GetGenericArguments()[0]; } } var h = new HandlerInstance(method, handler, @interface, @params, response, () => Remove(handler)); _handlers.Add(h); return(h); }
public IDisposable Add(IJsonRpcHandler handler) { return(Add(GetMethodName(handler.GetType()), handler)); }
public IDisposable Add(IJsonRpcHandler handler, JsonRpcHandlerOptions options) => Add(_handlerTypeDescriptorProvider.GetMethodName(handler.GetType()), handler, options);
public IDisposable Add(IJsonRpcHandler handler, JsonRpcHandlerOptions options) { return(Add(GetMethodName(handler.GetType()), handler, options)); }