Skip to content

Commit 6142040

Browse files
committed
fix: initialisation setting issue
1 parent 7a57f5b commit 6142040

File tree

1 file changed

+85
-1
lines changed

1 file changed

+85
-1
lines changed

src/cm/lsp/clientManager.ts

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import type {
3636
ParsedUri,
3737
RootUriContext,
3838
TextEdit,
39+
Transport,
3940
TransportHandle,
4041
} from "./types";
4142
import 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+
64138
interface 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

Comments
 (0)