diff --git a/docs/user/README.md b/docs/user/README.md index 439c4e6ae5..722a86c9bb 100644 --- a/docs/user/README.md +++ b/docs/user/README.md @@ -60,6 +60,7 @@ for details. * `rust-analyzer.enableCargoWatchOnStartup`: prompt to install & enable `cargo watch` for live error highlighting (note, this **does not** use rust-analyzer) * `rust-analyzer.trace.server`: enables internal logging +* `rust-analyzer.trace.cargo-watch`: enables cargo-watch logging ## Emacs diff --git a/editors/code/package.json b/editors/code/package.json index ba9c9433ab..cc364d4787 100644 --- a/editors/code/package.json +++ b/editors/code/package.json @@ -194,6 +194,17 @@ ], "default": "off", "description": "Trace requests to the ra_lsp_server" + }, + "rust-analyzer.trace.cargo-watch": { + "type": "string", + "scope": "window", + "enum": [ + "off", + "error", + "verbose" + ], + "default": "off", + "description": "Trace output of cargo-watch" } } }, diff --git a/editors/code/src/commands/cargo_watch.ts b/editors/code/src/commands/cargo_watch.ts index e51cac78a7..9864ce01ac 100644 --- a/editors/code/src/commands/cargo_watch.ts +++ b/editors/code/src/commands/cargo_watch.ts @@ -1,6 +1,7 @@ import * as child_process from 'child_process'; import * as path from 'path'; import * as vscode from 'vscode'; +import { Server } from '../server'; import { terminate } from '../utils/processes'; import { StatusDisplay } from './watch_status'; @@ -10,6 +11,7 @@ export class CargoWatchProvider { private cargoProcess?: child_process.ChildProcess; private outBuffer: string = ''; private statusDisplay?: StatusDisplay; + private outputChannel?: vscode.OutputChannel; public activate(subscriptions: vscode.Disposable[]) { subscriptions.push(this); @@ -18,7 +20,10 @@ export class CargoWatchProvider { ); this.statusDisplay = new StatusDisplay(subscriptions); - + this.outputChannel = vscode.window.createOutputChannel( + 'Cargo Watch Trace' + ); + // Start the cargo watch with json message this.cargoProcess = child_process.spawn( 'cargo', @@ -31,17 +36,23 @@ export class CargoWatchProvider { ); this.cargoProcess.stdout.on('data', (s: string) => { - this.processOutput(s); - console.log(s); + this.processOutput(s, (line) => { + this.logInfo(line); + this.parseLine(line); + }); }); this.cargoProcess.stderr.on('data', (s: string) => { - console.error('Error on cargo watch : ' + s); + this.processOutput(s, (line) => { + this.logError('Error on cargo-watch : {\n' + line + '}\n' ); + }); }); this.cargoProcess.on('error', (err: Error) => { - console.error('Error on spawn cargo process : ' + err); + this.logError('Error on cargo-watch process : {\n' + err.message + '}\n'); }); + + this.logInfo('cargo-watch started.'); } public dispose(): void { @@ -54,6 +65,22 @@ export class CargoWatchProvider { this.cargoProcess.kill(); terminate(this.cargoProcess); } + + if(this.outputChannel) { + this.outputChannel.dispose(); + } + } + + private logInfo(line: string) { + if (Server.config.cargoWatchOptions.trace === 'verbose') { + this.outputChannel!.append(line); + } + } + + private logError(line: string) { + if (Server.config.cargoWatchOptions.trace === 'error' || Server.config.cargoWatchOptions.trace === 'verbose' ) { + this.outputChannel!.append(line); + } } private parseLine(line: string) { @@ -124,14 +151,14 @@ export class CargoWatchProvider { } } - private processOutput(chunk: string) { + private processOutput(chunk: string, cb: (line: string) => void ) { // The stdout is not line based, convert it to line based for proceess. this.outBuffer += chunk; let eolIndex = this.outBuffer.indexOf('\n'); while (eolIndex >= 0) { // line includes the EOL const line = this.outBuffer.slice(0, eolIndex + 1); - this.parseLine(line); + cb(line); this.outBuffer = this.outBuffer.slice(eolIndex + 1); eolIndex = this.outBuffer.indexOf('\n'); diff --git a/editors/code/src/commands/runnables.ts b/editors/code/src/commands/runnables.ts index 7bba6f9cb2..3589edceec 100644 --- a/editors/code/src/commands/runnables.ts +++ b/editors/code/src/commands/runnables.ts @@ -137,11 +137,11 @@ export async function handleSingle(runnable: Runnable) { export async function interactivelyStartCargoWatch( context: vscode.ExtensionContext ) { - if (Server.config.enableCargoWatchOnStartup === 'disabled') { + if (Server.config.cargoWatchOptions.enableOnStartup === 'disabled') { return; } - if (Server.config.enableCargoWatchOnStartup === 'ask') { + if (Server.config.cargoWatchOptions.enableOnStartup === 'ask') { const watch = await vscode.window.showInformationMessage( 'Start watching changes with cargo? (Executes `cargo watch`, provides inline diagnostics)', 'yes', diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts index 4205890684..c95d138780 100644 --- a/editors/code/src/config.ts +++ b/editors/code/src/config.ts @@ -4,14 +4,20 @@ import { Server } from './server'; const RA_LSP_DEBUG = process.env.__RA_LSP_SERVER_DEBUG; -export type CargoWatchOptions = 'ask' | 'enabled' | 'disabled'; +export type CargoWatchStartupOptions = 'ask' | 'enabled' | 'disabled'; +export type CargoWatchTraceOptions = 'off' | 'error' | 'verbose'; + +export interface CargoWatchOptions { + enableOnStartup: CargoWatchStartupOptions, + trace: CargoWatchTraceOptions, +}; export class Config { public highlightingOn = true; public enableEnhancedTyping = true; public raLspServerPath = RA_LSP_DEBUG || 'ra_lsp_server'; public showWorkspaceLoadedNotification = true; - public enableCargoWatchOnStartup: CargoWatchOptions = 'ask'; + public cargoWatchOptions: CargoWatchOptions = { enableOnStartup: 'ask', trace: 'off' }; private prevEnhancedTyping: null | boolean = null; @@ -73,10 +79,17 @@ export class Config { } if (config.has('enableCargoWatchOnStartup')) { - this.enableCargoWatchOnStartup = config.get( - 'enableCargoWatchOnStartup', - 'ask' - ); + this.cargoWatchOptions.enableOnStartup = + config.get( + 'enableCargoWatchOnStartup', + 'ask' + ); + this.cargoWatchOptions.trace = + config.get( + 'trace.cargo-watch', + 'off' + ); + } } }