about summary refs log tree commit diff
path: root/editors/code/src
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2021-05-26 20:58:07 +0000
committerGitHub <noreply@github.com>2021-05-26 20:58:07 +0000
commitb4015b6aaa0dd80f5c85c7ed03e83d0d16042264 (patch)
tree6e423f24d05092250af44cacf1cb1b881d471492 /editors/code/src
parent666fc1cec10a41f88db56dfb339785eb1e7dd521 (diff)
parenta05163db1429bfb8cf30dbea4b1aa86a24258d49 (diff)
downloadrust-b4015b6aaa0dd80f5c85c7ed03e83d0d16042264.tar.gz
rust-b4015b6aaa0dd80f5c85c7ed03e83d0d16042264.zip
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 <mail4score@gmail.com>
Diffstat (limited to 'editors/code/src')
-rw-r--r--editors/code/src/client.ts7
-rw-r--r--editors/code/src/ctx.ts1
-rw-r--r--editors/code/src/main.ts7
-rw-r--r--editors/code/src/tasks.ts27
4 files changed, 20 insertions, 22 deletions
diff --git a/editors/code/src/client.ts b/editors/code/src/client.ts
index 69dbe253537..f13ae07e148 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:
     const newEnv = Object.assign({}, process.env);
     Object.assign(newEnv, extraEnv);
 
-    let cwd = undefined;
-    if (workspace.kind === "Workspace Folder") {
-        cwd = workspace.folder.fsPath;
-    };
-
     const run: lc.Executable = {
         command: serverPath,
-        options: { cwd, env: newEnv },
+        options: { env: newEnv },
     };
     const serverOptions: lc.ServerOptions = {
         run,
diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts
index 22c5f62a1cb..cf67dd8cff4 100644
--- a/editors/code/src/ctx.ts
+++ b/editors/code/src/ctx.ts
@@ -10,7 +10,6 @@ import { ServerStatusParams } from './lsp_ext';
 export type Workspace =
     {
         kind: 'Workspace Folder';
-        folder: vscode.Uri;
     }
     | {
         kind: 'Detached Files';
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts
index b735186fe19..d26273246c9 100644
--- a/editors/code/src/main.ts
+++ b/editors/code/src/main.ts
@@ -45,8 +45,7 @@ async function tryActivate(context: vscode.ExtensionContext) {
         throw new Error(message);
     });
 
-    const workspaceFolder = vscode.workspace.workspaceFolders?.[0];
-    if (workspaceFolder === undefined) {
+    if (vscode.workspace.workspaceFolders?.length === 0) {
         const rustDocuments = vscode.workspace.textDocuments.filter(document => isRustDocument(document));
         if (rustDocuments.length > 0) {
             ctx = await Ctx.create(config, context, serverPath, { kind: 'Detached Files', files: rustDocuments });
@@ -58,8 +57,8 @@ async function tryActivate(context: vscode.ExtensionContext) {
         // registers its `onDidChangeDocument` handler before us.
         //
         // This a horribly, horribly wrong way to deal with this problem.
-        ctx = await Ctx.create(config, context, serverPath, { kind: "Workspace Folder", folder: workspaceFolder.uri });
-        ctx.pushCleanup(activateTaskProvider(workspaceFolder, ctx.config));
+        ctx = await Ctx.create(config, context, serverPath, { kind: "Workspace Folder" });
+        ctx.pushCleanup(activateTaskProvider(ctx.config));
     }
     await initCommonContext(context, ctx);
 
diff --git a/editors/code/src/tasks.ts b/editors/code/src/tasks.ts
index a3ff1510256..694ee1e4130 100644
--- a/editors/code/src/tasks.ts
+++ b/editors/code/src/tasks.ts
@@ -17,11 +17,9 @@ export interface CargoTaskDefinition extends vscode.TaskDefinition {
 }
 
 class CargoTaskProvider implements vscode.TaskProvider {
-    private readonly target: vscode.WorkspaceFolder;
     private readonly config: Config;
 
-    constructor(target: vscode.WorkspaceFolder, config: Config) {
-        this.target = target;
+    constructor(config: Config) {
         this.config = config;
     }
 
@@ -40,10 +38,12 @@ class CargoTaskProvider implements vscode.TaskProvider {
         ];
 
         const tasks: vscode.Task[] = [];
-        for (const def of defs) {
-            const vscodeTask = await buildCargoTask(this.target, { type: TASK_TYPE, command: def.command }, `cargo ${def.command}`, [def.command], this.config.cargoRunner);
-            vscodeTask.group = def.group;
-            tasks.push(vscodeTask);
+        for (const workspaceTarget of vscode.workspace.workspaceFolders || []) {
+            for (const def of defs) {
+                const vscodeTask = await buildCargoTask(workspaceTarget, { type: TASK_TYPE, command: def.command }, `cargo ${def.command}`, [def.command], this.config.cargoRunner);
+                vscodeTask.group = def.group;
+                tasks.push(vscodeTask);
+            }
         }
 
         return tasks;
@@ -58,14 +58,19 @@ class CargoTaskProvider implements vscode.TaskProvider {
 
         if (definition.type === TASK_TYPE && definition.command) {
             const args = [definition.command].concat(definition.args ?? []);
-
-            return await buildCargoTask(this.target, definition, task.name, args, this.config.cargoRunner);
+            if (isWorkspaceFolder(task.scope)) {
+                return await buildCargoTask(task.scope, definition, task.name, args, this.config.cargoRunner);
+            }
         }
 
         return undefined;
     }
 }
 
+function isWorkspaceFolder(scope?: any): scope is vscode.WorkspaceFolder {
+    return (scope as vscode.WorkspaceFolder).name !== undefined;
+}
+
 export async function buildCargoTask(
     target: vscode.WorkspaceFolder,
     definition: CargoTaskDefinition,
@@ -119,7 +124,7 @@ export async function buildCargoTask(
     );
 }
 
-export function activateTaskProvider(target: vscode.WorkspaceFolder, config: Config): vscode.Disposable {
-    const provider = new CargoTaskProvider(target, config);
+export function activateTaskProvider(config: Config): vscode.Disposable {
+    const provider = new CargoTaskProvider(config);
     return vscode.tasks.registerTaskProvider(TASK_TYPE, provider);
 }