@@ -36,6 +36,7 @@ import type {
3636 ParsedUri ,
3737 RootUriContext ,
3838 TextEdit ,
39+ Transport ,
3940 TransportHandle ,
4041} from "./types" ;
4142import AcodeWorkspace from "./workspace" ;
@@ -61,6 +62,79 @@ function safeString(value: unknown): string {
6162 return value != null ? String ( value ) : "" ;
6263}
6364
65+ function isPlainObject ( value : unknown ) : value is Record < string , unknown > {
66+ return ! ! value && typeof value === "object" && ! Array . isArray ( value ) ;
67+ }
68+
69+ function resolveInitializationOptions (
70+ server : LspServerDefinition ,
71+ clientConfig : Record < string , unknown > ,
72+ ) : Record < string , unknown > | undefined {
73+ const serverOptions = isPlainObject ( server . initializationOptions )
74+ ? server . initializationOptions
75+ : null ;
76+ const clientOptions = isPlainObject ( clientConfig . initializationOptions )
77+ ? clientConfig . initializationOptions
78+ : null ;
79+
80+ if ( serverOptions && clientOptions ) {
81+ return {
82+ ...serverOptions ,
83+ ...clientOptions ,
84+ } ;
85+ }
86+
87+ return serverOptions || clientOptions || undefined ;
88+ }
89+
90+ interface InternalLSPRequest < Result > {
91+ promise : Promise < Result > ;
92+ }
93+
94+ type RequestInnerFn = < Params , Result > (
95+ method : string ,
96+ params : Params ,
97+ mapped ?: boolean ,
98+ ) => InternalLSPRequest < Result > ;
99+
100+ function connectClient (
101+ client : ExtendedLSPClient ,
102+ transport : Transport ,
103+ initializationOptions ?: Record < string , unknown > ,
104+ ) : void {
105+ if ( ! initializationOptions || ! Object . keys ( initializationOptions ) . length ) {
106+ client . connect ( transport ) ;
107+ return ;
108+ }
109+
110+ const patchedClient = client as unknown as {
111+ requestInner : RequestInnerFn ;
112+ } ;
113+ const originalRequestInner = patchedClient . requestInner . bind (
114+ patchedClient ,
115+ ) as RequestInnerFn ;
116+
117+ patchedClient . requestInner = function patchedRequestInner < Params , Result > (
118+ method : string ,
119+ params : Params ,
120+ mapped ?: boolean ,
121+ ) : InternalLSPRequest < Result > {
122+ if ( method === "initialize" && isPlainObject ( params ) ) {
123+ params = {
124+ ...params ,
125+ initializationOptions,
126+ } as Params ;
127+ }
128+ return originalRequestInner < Params , Result > ( method , params , mapped ) ;
129+ } ;
130+
131+ try {
132+ client . connect ( transport ) ;
133+ } finally {
134+ patchedClient . requestInner = originalRequestInner ;
135+ }
136+ }
137+
64138interface BuiltinExtensionsResult {
65139 extensions : Extension [ ] ;
66140 diagnosticsExtension : Extension | LSPClientExtension | null ;
@@ -431,6 +505,10 @@ export class LspClientManager {
431505 } ;
432506
433507 const clientConfig = { ...( server . clientConfig ?? { } ) } ;
508+ const initializationOptions = resolveInitializationOptions (
509+ server ,
510+ clientConfig as Record < string , unknown > ,
511+ ) ;
434512 const builtinConfig = clientConfig . builtinExtensions ?? { } ;
435513 const useDefaultExtensions = clientConfig . useDefaultExtensions !== false ;
436514 const { extensions : defaultExtensions , diagnosticsExtension } =
@@ -695,7 +773,7 @@ export class LspClientManager {
695773 } ) ;
696774 await transportHandle . ready ;
697775 client = new LSPClient ( clientConfig ) as ExtendedLSPClient ;
698- client . connect ( transportHandle . transport ) ;
776+ connectClient ( client , transportHandle . transport , initializationOptions ) ;
699777 await client . initializing ;
700778 if ( ! client . __acodeLoggedInfo ) {
701779 // Log root URI info to console
@@ -710,6 +788,12 @@ export class LspClientManager {
710788 } else if ( originalRootUri ) {
711789 console . info ( `[LSP:${ server . id } ] root ignored` , originalRootUri ) ;
712790 }
791+ if ( initializationOptions ) {
792+ console . info (
793+ `[LSP:${ server . id } ] initializationOptions keys` ,
794+ Object . keys ( initializationOptions ) ,
795+ ) ;
796+ }
713797 console . info ( `[LSP:${ server . id } ] initialized` ) ;
714798 client . __acodeLoggedInfo = true ;
715799 }
0 commit comments