diff --git a/package.json b/package.json index 1a1b2f5..a0b6a27 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,9 @@ "activationEvents": [ "onLanguage:ino", "onCommand:arduino.debug.start", - "onCommand:arduino.languageserver.start" + "onCommand:arduino.languageserver.start", + "onCommand:arduino.languageserver.stop", + "onCommand:arduino.languageserver.restart" ], "contributes": { "languages": [ @@ -105,6 +107,16 @@ "title": "Start Language Server", "category": "Arduino" }, + { + "command": "arduino.languageserver.stop", + "title": "Stop Language Server", + "category": "Arduino" + }, + { + "command": "arduino.languageserver.restart", + "title": "Restart Language Server", + "category": "Arduino" + }, { "command": "arduino.debug.start", "title": "Start Debug", diff --git a/src/extension.ts b/src/extension.ts index 0e78922..36ddf20 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -66,10 +66,28 @@ export function activate(context: ExtensionContext) { const started = await startLanguageServer(context, config); languageServerIsRunning = started; return languageServerIsRunning ? config.board.fqbn : undefined; + } catch (e) { + console.log(e); + languageServerIsRunning = false; + throw e; } finally { unlock(); } }), + vscode.commands.registerCommand('arduino.languageserver.stop', async () => { + const unlock = await languageServerStartMutex.acquire(); + try { + await stopLanguageServer(context); + languageServerIsRunning = false; + } finally { + unlock(); + } + }), + vscode.commands.registerCommand('arduino.languageserver.restart', async () => { + if (latestConfig) { + return vscode.commands.executeCommand('arduino.languageserver.start', latestConfig); + } + }), vscode.commands.registerCommand('arduino.debug.start', (config: DebugConfig) => startDebug(context, config)) ); } @@ -141,7 +159,7 @@ async function startDebug(_: ExtensionContext, config: DebugConfig): Promise { +async function stopLanguageServer(context: ExtensionContext): Promise { if (languageClient) { if (languageClient.diagnostics) { languageClient.diagnostics.clear(); @@ -151,6 +169,10 @@ async function startLanguageServer(context: ExtensionContext, config: LanguageSe languageServerDisposable.dispose(); } } +} + +async function startLanguageServer(context: ExtensionContext, config: LanguageServerConfig): Promise { + await stopLanguageServer(context); if (!languageClient || !deepEqual(latestConfig, config)) { latestConfig = config; languageClient = await buildLanguageClient(config);