From a35aa111e0e1b67171abc270f4f3276a3b942cf3 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Tue, 26 Jul 2022 11:27:07 +0200 Subject: [PATCH] Can start the LS without an Output channel. Ref: arduino/arduino-ide#714 Signed-off-by: Akos Kitta --- package.json | 2 +- src/extension.ts | 86 +++++++++++++++++++++++++++++------------------- 2 files changed, 53 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index 58f3116..0ddc3d9 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vscode-arduino-tools", "private": true, - "version": "0.0.2-beta.4", + "version": "0.0.2-beta.5", "publisher": "arduino", "license": "Apache-2.0", "author": "Arduino SA", diff --git a/src/extension.ts b/src/extension.ts index 38fb3fa..a718ec8 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -5,8 +5,8 @@ import deepEqual from 'deep-equal'; import WebRequest from 'web-request'; import deepmerge from 'deepmerge'; import { Mutex } from 'async-mutex'; -import vscode, { ExtensionContext } from 'vscode'; -import { LanguageClient, CloseAction, ErrorAction, InitializeError, Message, RevealOutputChannelOn } from 'vscode-languageclient'; +import vscode, { ExtensionContext, OutputChannel } from 'vscode'; +import { LanguageClient, CloseAction, ErrorAction, InitializeError, Message, RevealOutputChannelOn, LanguageClientOptions } from 'vscode-languageclient'; import { DidCompleteBuildNotification, DidCompleteBuildParams } from './protocol'; interface LanguageServerConfig { @@ -28,6 +28,7 @@ interface LanguageServerConfig { readonly env?: any; readonly flags?: string[]; readonly realTimeDiagnostics?: boolean; + readonly silentOutput?: boolean; } interface DebugConfig { @@ -224,43 +225,48 @@ async function buildLanguageClient(config: LanguageServerConfig): Promise (uri.scheme ? uri : uri.with({ scheme: 'file' })).toString(), + protocol2Code: (uri: string) => vscode.Uri.parse(uri) }, - { - initializationOptions: {}, - documentSelector: ['ino', 'c', 'cpp', 'h', 'hpp', 'pde'], - uriConverters: { - code2Protocol: (uri: vscode.Uri): string => (uri.scheme ? uri : uri.with({ scheme: 'file' })).toString(), - protocol2Code: (uri: string) => vscode.Uri.parse(uri) - }, - revealOutputChannelOn: RevealOutputChannelOn.Never, - initializationFailedHandler: (error: WebRequest.ResponseError): boolean => { - vscode.window.showErrorMessage(`The language server is not able to serve any features. Initialization failed: ${error}.`); - return false; + revealOutputChannelOn: RevealOutputChannelOn.Never, + initializationFailedHandler: (error: WebRequest.ResponseError): boolean => { + vscode.window.showErrorMessage(`The language server is not able to serve any features. Initialization failed: ${error}.`); + return false; + }, + errorHandler: { + error: (error: Error, message: Message, count: number): ErrorAction => { + vscode.window.showErrorMessage(`Error communicating with the language server: ${error}: ${message}.`); + if (count < 5) { + return ErrorAction.Continue; + } + return ErrorAction.Shutdown; }, - errorHandler: { - error: (error: Error, message: Message, count: number): ErrorAction => { - vscode.window.showErrorMessage(`Error communicating with the language server: ${error}: ${message}.`); - if (count < 5) { - return ErrorAction.Continue; - } - return ErrorAction.Shutdown; - }, - closed: (): CloseAction => { - crashCount++; - if (crashCount < 5) { - return CloseAction.Restart; - } - return CloseAction.DoNotRestart; + closed: (): CloseAction => { + crashCount++; + if (crashCount < 5) { + return CloseAction.Restart; } + return CloseAction.DoNotRestart; } } + } as LanguageClientOptions; + if (!!config.silentOutput) { + clientOptions.outputChannel = noopOutputChannel('Arduino Language Server'); + } + const serverOptions = { + command, + args, + options: { env }, + }; + return new LanguageClient( + 'ino', + 'Arduino Language Server', + serverOptions, + clientOptions ); } @@ -282,3 +288,15 @@ async function updateLaunchConfig(debugConfig: DebugConfig, launchConfig: object await configuration.update('launch', launchConfig, false); } } + +function noopOutputChannel(name: string): OutputChannel { + return { + append: () => {}, + appendLine: () => {}, + clear: () => {}, + dispose: () => {}, + hide: () => {}, + show: () => {}, + name + }; +}