From 3602f07bbee5b13dcd799cbc79381e9428808048 Mon Sep 17 00:00:00 2001 From: Veetaha Date: Sun, 5 Jul 2020 17:42:52 +0300 Subject: Improve client logging (use output channel and more log levels) --- editors/code/src/util.ts | 51 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 10 deletions(-) (limited to 'editors/code/src/util.ts') diff --git a/editors/code/src/util.ts b/editors/code/src/util.ts index fec4c3295..78fe6f5da 100644 --- a/editors/code/src/util.ts +++ b/editors/code/src/util.ts @@ -1,7 +1,9 @@ import * as lc from "vscode-languageclient"; +import * as fs from "fs"; import * as vscode from "vscode"; import { strict as nativeAssert } from "assert"; import { spawnSync } from "child_process"; +import { inspect } from "util"; export function assert(condition: boolean, explanation: string): asserts condition { try { @@ -14,21 +16,46 @@ export function assert(condition: boolean, explanation: string): asserts conditi export const log = new class { private enabled = true; + private readonly output = vscode.window.createOutputChannel("Rust Analyzer Client"); setEnabled(yes: boolean): void { log.enabled = yes; } - debug(message?: any, ...optionalParams: any[]): void { + // Hint: the type [T, ...T[]] means a non-empty array + debug(...msg: [unknown, ...unknown[]]): void { if (!log.enabled) return; - // eslint-disable-next-line no-console - console.log(message, ...optionalParams); + log.write("DEBUG", ...msg); + log.output.toString(); } - error(message?: any, ...optionalParams: any[]): void { + info(...msg: [unknown, ...unknown[]]): void { + log.write("INFO", ...msg); + } + + warn(...msg: [unknown, ...unknown[]]): void { + debugger; + log.write("WARN", ...msg); + } + + error(...msg: [unknown, ...unknown[]]): void { debugger; - // eslint-disable-next-line no-console - console.error(message, ...optionalParams); + log.write("ERROR", ...msg); + log.output.show(true); + } + + private write(label: string, ...messageParts: unknown[]): void { + const message = messageParts.map(log.stringify).join(" "); + const dateTime = new Date().toLocaleString(); + log.output.appendLine(`${label} [${dateTime}]: ${message}`); + } + + private stringify(val: unknown): string { + if (typeof val === "string") return val; + return inspect(val, { + colors: false, + depth: 6, // heuristic + }); } }; @@ -46,7 +73,7 @@ export async function sendRequestWithRetry( ); } catch (error) { if (delay === null) { - log.error("LSP request timed out", { method: reqType.method, param, error }); + log.warn("LSP request timed out", { method: reqType.method, param, error }); throw error; } @@ -55,7 +82,7 @@ export async function sendRequestWithRetry( } if (error.code !== lc.ErrorCodes.ContentModified) { - log.error("LSP request failed", { method: reqType.method, param, error }); + log.warn("LSP request failed", { method: reqType.method, param, error }); throw error; } @@ -87,11 +114,15 @@ export function isRustEditor(editor: vscode.TextEditor): editor is RustEditor { export function isValidExecutable(path: string): boolean { log.debug("Checking availability of a binary at", path); + if (!fs.existsSync(path)) return false; + const res = spawnSync(path, ["--version"], { encoding: 'utf8' }); - log.debug(res, "--version output:", res.output); + const isSuccess = res.status === 0; + const printOutput = isSuccess ? log.debug : log.warn; + printOutput(path, "--version:", res); - return res.status === 0; + return isSuccess; } /** Sets ['when'](https://code.visualstudio.com/docs/getstarted/keybindings#_when-clause-contexts) clause contexts */ -- cgit v1.2.3 From 13872543e074adc153b440660beda441fd562f53 Mon Sep 17 00:00:00 2001 From: Veetaha Date: Sun, 5 Jul 2020 21:05:38 +0300 Subject: Dispose logger on extension deactivation --- editors/code/src/util.ts | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'editors/code/src/util.ts') diff --git a/editors/code/src/util.ts b/editors/code/src/util.ts index 78fe6f5da..6b07d448b 100644 --- a/editors/code/src/util.ts +++ b/editors/code/src/util.ts @@ -18,6 +18,10 @@ export const log = new class { private enabled = true; private readonly output = vscode.window.createOutputChannel("Rust Analyzer Client"); + dispose() { + log.output.dispose(); + } + setEnabled(yes: boolean): void { log.enabled = yes; } -- cgit v1.2.3 From 46163acf62a94ec603be444294e119933c953a84 Mon Sep 17 00:00:00 2001 From: Veetaha Date: Sun, 5 Jul 2020 21:10:31 +0300 Subject: Revert "Dispose logger on extension deactivation" This reverts commit 13872543e074adc153b440660beda441fd562f53. That commit was wrong because we use-after-free the logger --- editors/code/src/util.ts | 4 ---- 1 file changed, 4 deletions(-) (limited to 'editors/code/src/util.ts') diff --git a/editors/code/src/util.ts b/editors/code/src/util.ts index 6b07d448b..78fe6f5da 100644 --- a/editors/code/src/util.ts +++ b/editors/code/src/util.ts @@ -18,10 +18,6 @@ export const log = new class { private enabled = true; private readonly output = vscode.window.createOutputChannel("Rust Analyzer Client"); - dispose() { - log.output.dispose(); - } - setEnabled(yes: boolean): void { log.enabled = yes; } -- cgit v1.2.3 From ef223b9e6439c228e0be49861efd2067c0b22af4 Mon Sep 17 00:00:00 2001 From: Veetaha Date: Mon, 6 Jul 2020 13:39:08 +0300 Subject: Fix: allow for binaries from $PATH to pass validity check --- editors/code/src/util.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'editors/code/src/util.ts') diff --git a/editors/code/src/util.ts b/editors/code/src/util.ts index 78fe6f5da..970fedb37 100644 --- a/editors/code/src/util.ts +++ b/editors/code/src/util.ts @@ -1,5 +1,4 @@ import * as lc from "vscode-languageclient"; -import * as fs from "fs"; import * as vscode from "vscode"; import { strict as nativeAssert } from "assert"; import { spawnSync } from "child_process"; @@ -114,15 +113,12 @@ export function isRustEditor(editor: vscode.TextEditor): editor is RustEditor { export function isValidExecutable(path: string): boolean { log.debug("Checking availability of a binary at", path); - if (!fs.existsSync(path)) return false; - const res = spawnSync(path, ["--version"], { encoding: 'utf8' }); - const isSuccess = res.status === 0; - const printOutput = isSuccess ? log.debug : log.warn; + const printOutput = res.error && (res.error as any).code !== 'ENOENT' ? log.warn : log.debug; printOutput(path, "--version:", res); - return isSuccess; + return res.status === 0; } /** Sets ['when'](https://code.visualstudio.com/docs/getstarted/keybindings#_when-clause-contexts) clause contexts */ -- cgit v1.2.3