Exemple #1
0
        internal LanguageServerTarget(
            AbstractRequestDispatcherFactory requestDispatcherFactory,
            JsonRpc jsonRpc,
            ICapabilitiesProvider capabilitiesProvider,
            ILspWorkspaceRegistrationService workspaceRegistrationService,
            IGlobalOptionService globalOptions,
            IAsynchronousOperationListenerProvider listenerProvider,
            ILspLogger logger,
            ImmutableArray <string> supportedLanguages,
            string?clientName,
            string userVisibleServerName,
            string telemetryServerTypeName)
        {
            GlobalOptions     = globalOptions;
            RequestDispatcher = requestDispatcherFactory.CreateRequestDispatcher(supportedLanguages);

            _capabilitiesProvider        = capabilitiesProvider;
            WorkspaceRegistrationService = workspaceRegistrationService;
            Logger = logger;

            JsonRpc = jsonRpc;
            JsonRpc.AddLocalRpcTarget(this);
            JsonRpc.Disconnected += JsonRpc_Disconnected;

            Listener   = listenerProvider.GetListener(FeatureAttribute.LanguageServer);
            ClientName = clientName;

            _userVisibleServerName = userVisibleServerName;
            TelemetryServerName    = telemetryServerTypeName;

            Queue = new RequestExecutionQueue(logger, workspaceRegistrationService, globalOptions, supportedLanguages, userVisibleServerName, TelemetryServerName);
            Queue.RequestServerShutdown += RequestExecutionQueue_Errored;
        }
        internal VisualStudioInProcLanguageServer(
            AbstractRequestDispatcherFactory requestDispatcherFactory,
            JsonRpc jsonRpc,
            ICapabilitiesProvider capabilitiesProvider,
            LspWorkspaceRegistrationService workspaceRegistrationService,
            IGlobalOptionService globalOptions,
            IAsynchronousOperationListenerProvider listenerProvider,
            ILspLogger logger,
            IDiagnosticService?diagnosticService,
            ImmutableArray <string> supportedLanguages,
            string?clientName,
            string userVisibleServerName,
            string telemetryServerTypeName)
            : base(requestDispatcherFactory, jsonRpc, capabilitiesProvider, workspaceRegistrationService, lspMiscellaneousFilesWorkspace: null, globalOptions, listenerProvider, logger, supportedLanguages, clientName, userVisibleServerName, telemetryServerTypeName)
        {
            _supportedLanguages = supportedLanguages;
            _diagnosticService  = diagnosticService;

            // Dedupe on DocumentId.  If we hear about the same document multiple times, we only need to process that id once.
            _diagnosticsWorkQueue = new AsyncBatchingWorkQueue <DocumentId>(
                TimeSpan.FromMilliseconds(250),
                (ids, ct) => ProcessDiagnosticUpdatedBatchAsync(_diagnosticService, ids, ct),
                EqualityComparer <DocumentId> .Default,
                Listener,
                Queue.CancellationToken);

            if (_diagnosticService != null)
            {
                _diagnosticService.DiagnosticsUpdated += DiagnosticService_DiagnosticsUpdated;
            }
        }
Exemple #3
0
        internal LanguageServerTarget(
            AbstractRequestDispatcherFactory requestDispatcherFactory,
            JsonRpc jsonRpc,
            ICapabilitiesProvider capabilitiesProvider,
            LspWorkspaceRegistrationService workspaceRegistrationService,
            LspMiscellaneousFilesWorkspace?lspMiscellaneousFilesWorkspace,
            IGlobalOptionService globalOptions,
            IAsynchronousOperationListenerProvider listenerProvider,
            ILspLogger logger,
            ImmutableArray <string> supportedLanguages,
            string?clientName,
            WellKnownLspServerKinds serverKind)
        {
            _requestDispatcher = requestDispatcherFactory.CreateRequestDispatcher(serverKind);

            _capabilitiesProvider = capabilitiesProvider;
            _logger = logger;

            _jsonRpc = jsonRpc;
            _jsonRpc.AddLocalRpcTarget(this);
            _jsonRpc.Disconnected += JsonRpc_Disconnected;

            _listener   = listenerProvider.GetListener(FeatureAttribute.LanguageServer);
            _clientName = clientName;

            _queue = new RequestExecutionQueue(
                logger,
                workspaceRegistrationService,
                lspMiscellaneousFilesWorkspace,
                globalOptions,
                supportedLanguages,
                serverKind);
            _queue.RequestServerShutdown += RequestExecutionQueue_Errored;

            var entryPointMethod = typeof(DelegatingEntryPoint).GetMethod(nameof(DelegatingEntryPoint.EntryPointAsync));

            Contract.ThrowIfNull(entryPointMethod, $"{typeof(DelegatingEntryPoint).FullName} is missing method {nameof(DelegatingEntryPoint.EntryPointAsync)}");

            foreach (var metadata in _requestDispatcher.GetRegisteredMethods())
            {
                // Instead of concretely defining methods for each LSP method, we instead dynamically construct
                // the generic method info from the exported handler types.  This allows us to define multiple handlers for the same method
                // but different type parameters.  This is a key functionality to support TS external access as we do not want to couple
                // our LSP protocol version dll to theirs.
                //
                // We also do not use the StreamJsonRpc support for JToken as the rpc method parameters because we want
                // StreamJsonRpc to do the deserialization to handle streaming requests using IProgress<T>.
                var delegatingEntryPoint = new DelegatingEntryPoint(metadata.MethodName, this);

                var genericEntryPointMethod = entryPointMethod.MakeGenericMethod(metadata.RequestType, metadata.ResponseType);

                _jsonRpc.AddLocalRpcMethod(genericEntryPointMethod, delegatingEntryPoint, new JsonRpcMethodAttribute(metadata.MethodName)
                {
                    UseSingleObjectParameterDeserialization = true
                });
            }
        }
Exemple #4
0
        internal LanguageServerTarget(
            AbstractLspServiceProvider lspServiceProvider,
            JsonRpc jsonRpc,
            ICapabilitiesProvider capabilitiesProvider,
            IAsynchronousOperationListenerProvider listenerProvider,
            ILspLogger logger,
            ImmutableArray <string> supportedLanguages,
            WellKnownLspServerKinds serverKind)
        {
            _capabilitiesProvider = capabilitiesProvider;
            _logger = logger;

            _jsonRpc = jsonRpc;
            _jsonRpc.AddLocalRpcTarget(this);
            _jsonRpc.Disconnected += JsonRpc_Disconnected;

            _listener = listenerProvider.GetListener(FeatureAttribute.LanguageServer);

            // Add services that require base dependencies (jsonrpc) or are more complex to create to the set manually.
            _lspServices = lspServiceProvider.CreateServices(serverKind, ImmutableArray.Create(
                                                                 CreateLspServiceInstance <ILanguageServerNotificationManager>(new LanguageServerNotificationManager(_jsonRpc)),
                                                                 CreateLspServiceInstance(logger),
                                                                 CreateLspServiceInstance <IClientCapabilitiesProvider>(this)));

            _queue = new RequestExecutionQueue(
                supportedLanguages,
                serverKind,
                _lspServices);
            _queue.RequestServerShutdown += RequestExecutionQueue_Errored;

            _requestDispatcher = _lspServices.GetRequiredService <RequestDispatcher>();

            var entryPointMethod = typeof(DelegatingEntryPoint).GetMethod(nameof(DelegatingEntryPoint.EntryPointAsync));

            Contract.ThrowIfNull(entryPointMethod, $"{typeof(DelegatingEntryPoint).FullName} is missing method {nameof(DelegatingEntryPoint.EntryPointAsync)}");

            foreach (var metadata in _requestDispatcher.GetRegisteredMethods())
            {
                // Instead of concretely defining methods for each LSP method, we instead dynamically construct the
                // generic method info from the exported handler types.  This allows us to define multiple handlers for
                // the same method but different type parameters.  This is a key functionality to support TS external
                // access as we do not want to couple our LSP protocol version dll to theirs.
                //
                // We also do not use the StreamJsonRpc support for JToken as the rpc method parameters because we want
                // StreamJsonRpc to do the deserialization to handle streaming requests using IProgress<T>.
                var delegatingEntryPoint = new DelegatingEntryPoint(metadata.MethodName, this);

                var genericEntryPointMethod = entryPointMethod.MakeGenericMethod(metadata.RequestType, metadata.ResponseType);

                _jsonRpc.AddLocalRpcMethod(genericEntryPointMethod, delegatingEntryPoint, new JsonRpcMethodAttribute(metadata.MethodName)
                {
                    UseSingleObjectParameterDeserialization = true
                });
            }
 public ILanguageServerTarget Create(
     JsonRpc jsonRpc,
     ICapabilitiesProvider capabilitiesProvider,
     ILspLogger logger)
 {
     return(new LanguageServerTarget(
                _lspServiceProvider, jsonRpc,
                capabilitiesProvider,
                _listenerProvider,
                logger,
                ProtocolConstants.RoslynLspLanguages,
                WellKnownLspServerKinds.CSharpVisualBasicLspServer));
 }
Exemple #6
0
 public MACapabilities GetCapabilitiesEx(KeyedCollection <string, ConfigParameter> configParameters)
 {
     try
     {
         Logging.SetupLogger(configParameters);
         ICapabilitiesProvider provider = InterfaceManager.GetProviderOrThrow <ICapabilitiesProvider>();
         return(provider.GetCapabilitiesEx(configParameters));
     }
     catch (Exception ex)
     {
         logger.Error(ex.UnwrapIfSingleAggregateException(), "Could not get capabilities");
         throw;
     }
 }
Exemple #7
0
 public ILanguageServerTarget Create(
     JsonRpc jsonRpc,
     ICapabilitiesProvider capabilitiesProvider,
     ILspLogger logger)
 {
     return(new LanguageServerTarget(
                _lspServiceProvider,
                jsonRpc,
                capabilitiesProvider,
                _listenerProvider,
                logger,
                SupportedLanguages,
                ServerKind));
 }
Exemple #8
0
 internal VisualStudioInProcLanguageServer(
     AbstractRequestDispatcherFactory requestDispatcherFactory,
     JsonRpc jsonRpc,
     ICapabilitiesProvider capabilitiesProvider,
     LspWorkspaceRegistrationService workspaceRegistrationService,
     IGlobalOptionService globalOptions,
     IAsynchronousOperationListenerProvider listenerProvider,
     ILspLogger logger,
     ImmutableArray <string> supportedLanguages,
     string?clientName,
     WellKnownLspServerKinds serverKind)
     : base(requestDispatcherFactory, jsonRpc, capabilitiesProvider, workspaceRegistrationService, lspMiscellaneousFilesWorkspace: null, globalOptions, listenerProvider, logger, supportedLanguages, clientName, serverKind)
 {
     _supportedLanguages = supportedLanguages;
 }
Exemple #9
0
 public ILanguageServerTarget Create(
     JsonRpc jsonRpc,
     ICapabilitiesProvider capabilitiesProvider,
     ILspLogger logger)
 {
     return(new VisualStudioInProcLanguageServer(
                _requestDispatcherFactory,
                jsonRpc,
                capabilitiesProvider,
                _lspWorkspaceRegistrationService,
                GlobalOptions,
                _listenerProvider,
                logger,
                SupportedLanguages,
                clientName: _diagnosticsClientName,
                ServerKind));
 }
 public ILanguageServerTarget Create(
     JsonRpc jsonRpc,
     ICapabilitiesProvider capabilitiesProvider,
     ILspWorkspaceRegistrationService workspaceRegistrationService,
     ILspLogger logger)
 {
     return(new LanguageServerTarget(
                _dispatcherFactory,
                jsonRpc,
                capabilitiesProvider,
                workspaceRegistrationService,
                _listenerProvider,
                logger,
                clientName: null,
                userVisibleServerName: UserVisibleName,
                telemetryServerTypeName: this.GetType().Name));
 }
 public ILanguageServerTarget Create(
     JsonRpc jsonRpc,
     ICapabilitiesProvider capabilitiesProvider,
     ILspLogger logger)
 {
     return(new LanguageServerTarget(
                _requestDispatcherFactory,
                jsonRpc,
                capabilitiesProvider,
                _lspWorkspaceRegistrationService,
                lspMiscellaneousFilesWorkspace: null,
                GlobalOptions,
                _listenerProvider,
                logger,
                SupportedLanguages,
                ServerKind));
 }
 public ILanguageServerTarget Create(
     JsonRpc jsonRpc,
     ICapabilitiesProvider capabilitiesProvider,
     ILspWorkspaceRegistrationService workspaceRegistrationService,
     ILspLogger logger)
 {
     return(new VisualStudioInProcLanguageServer(
                _requestDispatcherFactory,
                jsonRpc,
                capabilitiesProvider,
                workspaceRegistrationService,
                _listenerProvider,
                logger,
                _diagnosticService,
                clientName: _diagnosticsClientName,
                userVisibleServerName: this.Name,
                telemetryServerTypeName: this.GetType().Name));
 }
Exemple #13
0
        public ILanguageServerTarget Create(
            JsonRpc jsonRpc,
            ICapabilitiesProvider capabilitiesProvider,
            ILspLogger logger)
        {
            var lspMiscellaneousFilesWorkspace = new LspMiscellaneousFilesWorkspace(logger);

            return(new LanguageServerTarget(
                       _dispatcherFactory,
                       jsonRpc,
                       capabilitiesProvider,
                       _lspWorkspaceRegistrationService,
                       lspMiscellaneousFilesWorkspace,
                       _globalOptions,
                       _listenerProvider,
                       logger,
                       ProtocolConstants.RoslynLspLanguages,
                       WellKnownLspServerKinds.CSharpVisualBasicLspServer));
        }
        public ILanguageServerTarget Create(
            JsonRpc jsonRpc,
            ICapabilitiesProvider capabilitiesProvider,
            ILspLogger logger)
        {
            var lspMiscellaneousFilesWorkspace = new LspMiscellaneousFilesWorkspace(logger);

            return(new LanguageServerTarget(
                       _dispatcherFactory,
                       jsonRpc,
                       capabilitiesProvider,
                       _lspWorkspaceRegistrationService,
                       lspMiscellaneousFilesWorkspace,
                       _globalOptions,
                       _listenerProvider,
                       logger,
                       ProtocolConstants.RoslynLspLanguages,
                       clientName: null,
                       userVisibleServerName: UserVisibleName,
                       telemetryServerTypeName: this.GetType().Name));
        }