diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-05-26 21:58:07 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2021-05-26 21:58:07 +0100 |
commit | b4015b6aaa0dd80f5c85c7ed03e83d0d16042264 (patch) | |
tree | 6e423f24d05092250af44cacf1cb1b881d471492 /editors/code | |
parent | 666fc1cec10a41f88db56dfb339785eb1e7dd521 (diff) | |
parent | a05163db1429bfb8cf30dbea4b1aa86a24258d49 (diff) |
Merge #8995
8995: fix: Create tasks for all workspaces r=matklad a=SomeoneToIgnore
Follow-up of https://github.com/rust-analyzer/rust-analyzer/pull/8955#discussion_r637897170
Before:
<img width="593" alt="image" src="https://user-images.githubusercontent.com/2690773/119575267-712b5300-bdbf-11eb-833c-f688f7a7dd0f.png">
After:
<img width="643" alt="image" src="https://user-images.githubusercontent.com/2690773/119575273-74264380-bdbf-11eb-8283-a78bbcb7346e.png">
This is the first time I've used multiple workspaces feature in VSCode, but so far looks like
* opening detached files works
* run and debug lens work
* Rust Analyzer: Run action works
* run task works and now shows tasks for all workspaces
* there are no platform-specific changes involved
Co-authored-by: Kirill Bulatov <[email protected]>
Diffstat (limited to 'editors/code')
-rw-r--r-- | editors/code/src/client.ts | 7 | ||||
-rw-r--r-- | editors/code/src/ctx.ts | 1 | ||||
-rw-r--r-- | editors/code/src/main.ts | 7 | ||||
-rw-r--r-- | editors/code/src/tasks.ts | 27 |
4 files changed, 20 insertions, 22 deletions
diff --git a/editors/code/src/client.ts b/editors/code/src/client.ts index 69dbe2535..f13ae07e1 100644 --- a/editors/code/src/client.ts +++ b/editors/code/src/client.ts | |||
@@ -32,14 +32,9 @@ export function createClient(serverPath: string, workspace: Workspace, extraEnv: | |||
32 | const newEnv = Object.assign({}, process.env); | 32 | const newEnv = Object.assign({}, process.env); |
33 | Object.assign(newEnv, extraEnv); | 33 | Object.assign(newEnv, extraEnv); |
34 | 34 | ||
35 | let cwd = undefined; | ||
36 | if (workspace.kind === "Workspace Folder") { | ||
37 | cwd = workspace.folder.fsPath; | ||
38 | }; | ||
39 | |||
40 | const run: lc.Executable = { | 35 | const run: lc.Executable = { |
41 | command: serverPath, | 36 | command: serverPath, |
42 | options: { cwd, env: newEnv }, | 37 | options: { env: newEnv }, |
43 | }; | 38 | }; |
44 | const serverOptions: lc.ServerOptions = { | 39 | const serverOptions: lc.ServerOptions = { |
45 | run, | 40 | run, |
diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts index 22c5f62a1..cf67dd8cf 100644 --- a/editors/code/src/ctx.ts +++ b/editors/code/src/ctx.ts | |||
@@ -10,7 +10,6 @@ import { ServerStatusParams } from './lsp_ext'; | |||
10 | export type Workspace = | 10 | export type Workspace = |
11 | { | 11 | { |
12 | kind: 'Workspace Folder'; | 12 | kind: 'Workspace Folder'; |
13 | folder: vscode.Uri; | ||
14 | } | 13 | } |
15 | | { | 14 | | { |
16 | kind: 'Detached Files'; | 15 | kind: 'Detached Files'; |
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts index b735186fe..d26273246 100644 --- a/editors/code/src/main.ts +++ b/editors/code/src/main.ts | |||
@@ -45,8 +45,7 @@ async function tryActivate(context: vscode.ExtensionContext) { | |||
45 | throw new Error(message); | 45 | throw new Error(message); |
46 | }); | 46 | }); |
47 | 47 | ||
48 | const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; | 48 | if (vscode.workspace.workspaceFolders?.length === 0) { |
49 | if (workspaceFolder === undefined) { | ||
50 | const rustDocuments = vscode.workspace.textDocuments.filter(document => isRustDocument(document)); | 49 | const rustDocuments = vscode.workspace.textDocuments.filter(document => isRustDocument(document)); |
51 | if (rustDocuments.length > 0) { | 50 | if (rustDocuments.length > 0) { |
52 | ctx = await Ctx.create(config, context, serverPath, { kind: 'Detached Files', files: rustDocuments }); | 51 | ctx = await Ctx.create(config, context, serverPath, { kind: 'Detached Files', files: rustDocuments }); |
@@ -58,8 +57,8 @@ async function tryActivate(context: vscode.ExtensionContext) { | |||
58 | // registers its `onDidChangeDocument` handler before us. | 57 | // registers its `onDidChangeDocument` handler before us. |
59 | // | 58 | // |
60 | // This a horribly, horribly wrong way to deal with this problem. | 59 | // This a horribly, horribly wrong way to deal with this problem. |
61 | ctx = await Ctx.create(config, context, serverPath, { kind: "Workspace Folder", folder: workspaceFolder.uri }); | 60 | ctx = await Ctx.create(config, context, serverPath, { kind: "Workspace Folder" }); |
62 | ctx.pushCleanup(activateTaskProvider(workspaceFolder, ctx.config)); | 61 | ctx.pushCleanup(activateTaskProvider(ctx.config)); |
63 | } | 62 | } |
64 | await initCommonContext(context, ctx); | 63 | await initCommonContext(context, ctx); |
65 | 64 | ||
diff --git a/editors/code/src/tasks.ts b/editors/code/src/tasks.ts index a3ff15102..694ee1e41 100644 --- a/editors/code/src/tasks.ts +++ b/editors/code/src/tasks.ts | |||
@@ -17,11 +17,9 @@ export interface CargoTaskDefinition extends vscode.TaskDefinition { | |||
17 | } | 17 | } |
18 | 18 | ||
19 | class CargoTaskProvider implements vscode.TaskProvider { | 19 | class CargoTaskProvider implements vscode.TaskProvider { |
20 | private readonly target: vscode.WorkspaceFolder; | ||
21 | private readonly config: Config; | 20 | private readonly config: Config; |
22 | 21 | ||
23 | constructor(target: vscode.WorkspaceFolder, config: Config) { | 22 | constructor(config: Config) { |
24 | this.target = target; | ||
25 | this.config = config; | 23 | this.config = config; |
26 | } | 24 | } |
27 | 25 | ||
@@ -40,10 +38,12 @@ class CargoTaskProvider implements vscode.TaskProvider { | |||
40 | ]; | 38 | ]; |
41 | 39 | ||
42 | const tasks: vscode.Task[] = []; | 40 | const tasks: vscode.Task[] = []; |
43 | for (const def of defs) { | 41 | for (const workspaceTarget of vscode.workspace.workspaceFolders || []) { |
44 | const vscodeTask = await buildCargoTask(this.target, { type: TASK_TYPE, command: def.command }, `cargo ${def.command}`, [def.command], this.config.cargoRunner); | 42 | for (const def of defs) { |
45 | vscodeTask.group = def.group; | 43 | const vscodeTask = await buildCargoTask(workspaceTarget, { type: TASK_TYPE, command: def.command }, `cargo ${def.command}`, [def.command], this.config.cargoRunner); |
46 | tasks.push(vscodeTask); | 44 | vscodeTask.group = def.group; |
45 | tasks.push(vscodeTask); | ||
46 | } | ||
47 | } | 47 | } |
48 | 48 | ||
49 | return tasks; | 49 | return tasks; |
@@ -58,14 +58,19 @@ class CargoTaskProvider implements vscode.TaskProvider { | |||
58 | 58 | ||
59 | if (definition.type === TASK_TYPE && definition.command) { | 59 | if (definition.type === TASK_TYPE && definition.command) { |
60 | const args = [definition.command].concat(definition.args ?? []); | 60 | const args = [definition.command].concat(definition.args ?? []); |
61 | 61 | if (isWorkspaceFolder(task.scope)) { | |
62 | return await buildCargoTask(this.target, definition, task.name, args, this.config.cargoRunner); | 62 | return await buildCargoTask(task.scope, definition, task.name, args, this.config.cargoRunner); |
63 | } | ||
63 | } | 64 | } |
64 | 65 | ||
65 | return undefined; | 66 | return undefined; |
66 | } | 67 | } |
67 | } | 68 | } |
68 | 69 | ||
70 | function isWorkspaceFolder(scope?: any): scope is vscode.WorkspaceFolder { | ||
71 | return (scope as vscode.WorkspaceFolder).name !== undefined; | ||
72 | } | ||
73 | |||
69 | export async function buildCargoTask( | 74 | export async function buildCargoTask( |
70 | target: vscode.WorkspaceFolder, | 75 | target: vscode.WorkspaceFolder, |
71 | definition: CargoTaskDefinition, | 76 | definition: CargoTaskDefinition, |
@@ -119,7 +124,7 @@ export async function buildCargoTask( | |||
119 | ); | 124 | ); |
120 | } | 125 | } |
121 | 126 | ||
122 | export function activateTaskProvider(target: vscode.WorkspaceFolder, config: Config): vscode.Disposable { | 127 | export function activateTaskProvider(config: Config): vscode.Disposable { |
123 | const provider = new CargoTaskProvider(target, config); | 128 | const provider = new CargoTaskProvider(config); |
124 | return vscode.tasks.registerTaskProvider(TASK_TYPE, provider); | 129 | return vscode.tasks.registerTaskProvider(TASK_TYPE, provider); |
125 | } | 130 | } |