(server: LSPServer.Info, root: string, key: string)
| 161 | const result: LSPClient.Info[] = [] |
| 162 | |
| 163 | async function schedule(server: LSPServer.Info, root: string, key: string) { |
| 164 | const handle = await server |
| 165 | .spawn(root) |
| 166 | .then((value) => { |
| 167 | if (!value) s.broken.add(key) |
| 168 | return value |
| 169 | }) |
| 170 | .catch((err) => { |
| 171 | s.broken.add(key) |
| 172 | log.error(`Failed to spawn LSP server ${server.id}`, { error: err }) |
| 173 | return undefined |
| 174 | }) |
| 175 | |
| 176 | if (!handle) return undefined |
| 177 | log.info("spawned lsp server", { serverID: server.id }) |
| 178 | |
| 179 | const client = await LSPClient.create({ |
| 180 | serverID: server.id, |
| 181 | server: handle, |
| 182 | root, |
| 183 | }).catch((err) => { |
| 184 | s.broken.add(key) |
| 185 | handle.process.kill() |
| 186 | log.error(`Failed to initialize LSP client ${server.id}`, { error: err }) |
| 187 | return undefined |
| 188 | }) |
| 189 | |
| 190 | if (!client) { |
| 191 | handle.process.kill() |
| 192 | return undefined |
| 193 | } |
| 194 | |
| 195 | const existing = s.clients.find((x) => x.root === root && x.serverID === server.id) |
| 196 | if (existing) { |
| 197 | handle.process.kill() |
| 198 | return existing |
| 199 | } |
| 200 | |
| 201 | s.clients.push(client) |
| 202 | return client |
| 203 | } |
| 204 | |
| 205 | for (const server of Object.values(s.servers)) { |
| 206 | if (server.extensions.length && !server.extensions.includes(extension)) continue |
no test coverage detected