aboutsummaryrefslogtreecommitdiff
path: root/editors/code/src/utils
diff options
context:
space:
mode:
authorbors[bot] <bors[bot]@users.noreply.github.com>2019-04-02 11:10:26 +0100
committerbors[bot] <bors[bot]@users.noreply.github.com>2019-04-02 11:10:26 +0100
commitbb3b159fb7d377f667732ade715cbe019da84d71 (patch)
tree2cfb500a2eec37f1689ec9448babbbfedc28fba0 /editors/code/src/utils
parentb0d244719323d68905986857844f56d1fa38cac4 (diff)
parentb60e2f779b28f654dbd5a2657c668de8452933c6 (diff)
Merge #1079
1079: Improve cargo-watch usage in vscode plugin r=matklad a=edwin0cheng *This PR try to improve current cargo-watch usage in VSCode :* 1. Add Multi-lines error support : ![multilines-error](https://i.imgur.com/gbLEwMG.gif) 2. Add cargo-watch status animation : ![cargo-watch-status](https://i.imgur.com/GbHwzjj.gif) *Implementation Details* * Current VSCode `ProblemMatcher` still do not support multiple line parsing. * However we can, spawn a cargo watch process instead of using vscode.Task to allow more control. * Use `cargo-check --message-format json` to get json format of compiler-message. * Use `vscode.DiagnosticCollection` to manage the problems directly, which allow multiple lines diagnostic. However, * VSCode use non mono-space font for problems, at this moment i cannot find a good solution about it. * I am not so good in typescript, please let me know if anything is bad in this PR. Co-authored-by: Edwin Cheng <[email protected]> Co-authored-by: Edwin Cheng <[email protected]>
Diffstat (limited to 'editors/code/src/utils')
-rw-r--r--editors/code/src/utils/processes.ts51
-rw-r--r--editors/code/src/utils/terminateProcess.sh12
2 files changed, 63 insertions, 0 deletions
diff --git a/editors/code/src/utils/processes.ts b/editors/code/src/utils/processes.ts
new file mode 100644
index 000000000..da8be9eb1
--- /dev/null
+++ b/editors/code/src/utils/processes.ts
@@ -0,0 +1,51 @@
1'use strict';
2
3import * as cp from 'child_process';
4import ChildProcess = cp.ChildProcess;
5
6import { join } from 'path';
7
8const isWindows = process.platform === 'win32';
9const isMacintosh = process.platform === 'darwin';
10const isLinux = process.platform === 'linux';
11
12// this is very complex, but is basically copy-pased from VSCode implementation here:
13// https://github.com/Microsoft/vscode-languageserver-node/blob/dbfd37e35953ad0ee14c4eeced8cfbc41697b47e/client/src/utils/processes.ts#L15
14
15// And see discussion at
16// https://github.com/rust-analyzer/rust-analyzer/pull/1079#issuecomment-478908109
17
18export function terminate(process: ChildProcess, cwd?: string): boolean {
19 if (isWindows) {
20 try {
21 // This we run in Atom execFileSync is available.
22 // Ignore stderr since this is otherwise piped to parent.stderr
23 // which might be already closed.
24 const options: any = {
25 stdio: ['pipe', 'pipe', 'ignore']
26 };
27 if (cwd) {
28 options.cwd = cwd;
29 }
30 cp.execFileSync(
31 'taskkill',
32 ['/T', '/F', '/PID', process.pid.toString()],
33 options
34 );
35 return true;
36 } catch (err) {
37 return false;
38 }
39 } else if (isLinux || isMacintosh) {
40 try {
41 const cmd = join(__dirname, 'terminateProcess.sh');
42 const result = cp.spawnSync(cmd, [process.pid.toString()]);
43 return result.error ? false : true;
44 } catch (err) {
45 return false;
46 }
47 } else {
48 process.kill('SIGKILL');
49 return true;
50 }
51}
diff --git a/editors/code/src/utils/terminateProcess.sh b/editors/code/src/utils/terminateProcess.sh
new file mode 100644
index 000000000..2ec9e1c2e
--- /dev/null
+++ b/editors/code/src/utils/terminateProcess.sh
@@ -0,0 +1,12 @@
1#!/bin/bash
2
3terminateTree() {
4 for cpid in $(pgrep -P $1); do
5 terminateTree $cpid
6 done
7 kill -9 $1 > /dev/null 2>&1
8}
9
10for pid in $*; do
11 terminateTree $pid
12done \ No newline at end of file