예제 #1
0
        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();
        }
예제 #2
0
        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;
        }
예제 #3
0
        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;
            }
        }
예제 #4
0
        public LspHandlerDescriptorDisposable Add(string method, IJsonRpcHandler handler)
        {
            var descriptor = GetDescriptor(method, handler.GetType(), handler);

            _handlers.Add(descriptor);
            return(new LspHandlerDescriptorDisposable(descriptor));
        }
예제 #5
0
        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);
        }
예제 #7
0
 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;
 }
예제 #8
0
        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 <>));
        }
예제 #11
0
        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);
        }
예제 #12
0
        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 });
            }
        }
예제 #13
0
        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);
        }
예제 #14
0
 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));
 }