@@ -35,7 +35,12 @@ import { LSPConnection } from '../connection';
3535import { DocumentConnectionManager } from '../connection_manager' ;
3636import { SERVER_EXTENSION_404 } from '../errors' ;
3737import { LanguageServerManager } from '../manager' ;
38- import { ILSPAdapterManager , ILanguageServerManager } from '../tokens' ;
38+ import {
39+ ILSPAdapterManager ,
40+ ILanguageServerManager ,
41+ TSessionMap ,
42+ TLanguageServerId
43+ } from '../tokens' ;
3944import { VirtualDocument , collect_documents } from '../virtual/document' ;
4045
4146import { codeCheckIcon , codeClockIcon , codeWarningIcon } from './icons' ;
@@ -464,34 +469,44 @@ export namespace LSPStatus {
464469 } , this ) ;
465470 }
466471
467- get available_servers ( ) : Array < SCHEMA . LanguageServerSession > {
468- return Array . from ( this . language_server_manager . sessions . values ( ) ) ;
472+ get available_servers ( ) : TSessionMap {
473+ return this . language_server_manager . sessions ;
469474 }
470475
471476 get supported_languages ( ) : Set < string > {
472477 const languages = new Set < string > ( ) ;
473- for ( let server of this . available_servers ) {
478+ for ( let server of this . available_servers . values ( ) ) {
474479 for ( let language of server . spec . languages ) {
475480 languages . add ( language . toLocaleLowerCase ( ) ) ;
476481 }
477482 }
478483 return languages ;
479484 }
480485
481- private is_server_running ( server : SCHEMA . LanguageServerSession ) : boolean {
482- for ( let language of server . spec . languages ) {
483- if ( this . detected_languages . has ( language . toLocaleLowerCase ( ) ) ) {
486+ private is_server_running (
487+ id : TLanguageServerId ,
488+ server : SCHEMA . LanguageServerSession
489+ ) : boolean {
490+ for ( const language of this . detected_languages ) {
491+ const matchedServers = this . language_server_manager . getMatchingServers ( {
492+ language
493+ } ) ;
494+ // TODO server.status === "started" ?
495+ // TODO update once multiple servers are allowed
496+ if ( matchedServers . length && matchedServers [ 0 ] === id ) {
484497 return true ;
485498 }
486499 }
487- return false ;
488500 }
489501
490502 get documents_by_server ( ) : Map <
491503 SCHEMA . LanguageServerSession ,
492504 Map < string , VirtualDocument [ ] >
493505 > {
494- let data = new Map ( ) ;
506+ let data = new Map <
507+ SCHEMA . LanguageServerSession ,
508+ Map < string , VirtualDocument [ ] >
509+ > ( ) ;
495510 if ( ! this . adapter ?. virtual_editor ) {
496511 return data ;
497512 }
@@ -501,19 +516,17 @@ export namespace LSPStatus {
501516
502517 for ( let document of documents . values ( ) ) {
503518 let language = document . language . toLocaleLowerCase ( ) ;
504- let servers = this . available_servers . filter (
505- server => server . spec . languages . indexOf ( language ) !== - 1
519+ let server_ids = this . _connection_manager . language_server_manager . getMatchingServers (
520+ { language : document . language }
506521 ) ;
507- if ( servers . length > 1 ) {
508- console . warn ( 'More than one server per language for' , language ) ;
509- }
510- if ( servers . length === 0 ) {
522+ if ( server_ids . length === 0 ) {
511523 continue ;
512524 }
513- let server = servers [ 0 ] ;
525+ // For now only use the server with the highest priority
526+ let server = this . language_server_manager . sessions . get ( server_ids [ 0 ] ) ;
514527
515528 if ( ! data . has ( server ) ) {
516- data . set ( server , new Map < string , VirtualDocument > ( ) ) ;
529+ data . set ( server , new Map < string , VirtualDocument [ ] > ( ) ) ;
517530 }
518531
519532 let documents_map = data . get ( server ) ;
@@ -529,9 +542,9 @@ export namespace LSPStatus {
529542 }
530543
531544 get servers_available_not_in_use ( ) : Array < SCHEMA . LanguageServerSession > {
532- return this . available_servers . filter (
533- server => ! this . is_server_running ( server )
534- ) ;
545+ return [ ... this . available_servers . entries ( ) ]
546+ . filter ( ( [ id , server ] ) => ! this . is_server_running ( id , server ) )
547+ . map ( ( [ id , server ] ) => server ) ;
535548 }
536549
537550 get detected_languages ( ) : Set < string > {
@@ -577,10 +590,11 @@ export namespace LSPStatus {
577590
578591 detected_documents . forEach ( ( document , uri ) => {
579592 let connection = this . _connection_manager . connections . get ( uri ) ;
580- let server_id = this . _connection_manager . language_server_manager . getServerId (
593+ let server_ids = this . _connection_manager . language_server_manager . getMatchingServers (
581594 { language : document . language }
582595 ) ;
583- if ( server_id !== null ) {
596+
597+ if ( server_ids . length !== 0 ) {
584598 documents_with_known_servers . add ( document ) ;
585599 }
586600 if ( ! connection ) {
0 commit comments