-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
3777: Add basic task support r=matklad a=Timmmm This adds basic support for running `cargo build`, `cargo run`, etc. Fixes #1935 I have tested this and it seems to work. There are two things I'm not sure about: 1. The workspace folder handling seems wrong - just get the first workspace folder? Is this just a TODO item? I don't know if it is right to lift `workspaceFolder` up to `activate()` but I couldn't see another way. 2. If you manually add an entry to `tasks.json` like this: ``` { "type": "cargo", "command": "build", "problemMatcher": [ "$rustc" ], "group": "build" } ``` then VSCode somehow magically knows to run `cargo build`. The documentation for `resolveTask` *sounds* like I should have to implement that for it to work: ``` * Resolves a task that has no [`execution`](#Task.execution) set. Tasks are * often created from information found in the `tasks.json`-file. Such tasks miss * the information on how to execute them and a task provider must fill in * the missing information in the `resolveTask`-method. ``` But then it also says this: ``` * This method will not be * called for tasks returned from the above `provideTasks` method since those * tasks are always fully resolved. A valid default implementation for the * `resolveTask` method is to return `undefined`. ``` Either way, it works without implementing it so the only thing I can think is that it is doing some kind of crazy pattern matching of the tasks returned by `provideTasks()` and the ones found in `tasks.json`. 3784: Ignore createProgress request in tests r=matklad a=matklad closes #3783 bors r+ 🤖 Co-authored-by: Tim <[email protected]> Co-authored-by: Aleksey Kladov <[email protected]>
- Loading branch information
Showing
6 changed files
with
80 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
import * as vscode from 'vscode'; | ||
|
||
// This ends up as the `type` key in tasks.json. RLS also uses `cargo` and | ||
// our configuration should be compatible with it so use the same key. | ||
const TASK_TYPE = 'cargo'; | ||
|
||
export function activateTaskProvider(target: vscode.WorkspaceFolder): vscode.Disposable { | ||
const provider: vscode.TaskProvider = { | ||
// Detect Rust tasks. Currently we do not do any actual detection | ||
// of tasks (e.g. aliases in .cargo/config) and just return a fixed | ||
// set of tasks that always exist. These tasks cannot be removed in | ||
// tasks.json - only tweaked. | ||
provideTasks: () => getStandardCargoTasks(target), | ||
|
||
// We don't need to implement this. | ||
resolveTask: () => undefined, | ||
}; | ||
|
||
return vscode.tasks.registerTaskProvider(TASK_TYPE, provider); | ||
} | ||
|
||
function getStandardCargoTasks(target: vscode.WorkspaceFolder): vscode.Task[] { | ||
return [ | ||
{ command: 'build', group: vscode.TaskGroup.Build }, | ||
{ command: 'check', group: vscode.TaskGroup.Build }, | ||
{ command: 'test', group: vscode.TaskGroup.Test }, | ||
{ command: 'clean', group: vscode.TaskGroup.Clean }, | ||
{ command: 'run', group: undefined }, | ||
] | ||
.map(({ command, group }) => { | ||
const vscodeTask = new vscode.Task( | ||
// The contents of this object end up in the tasks.json entries. | ||
{ | ||
type: TASK_TYPE, | ||
command, | ||
}, | ||
// The scope of the task - workspace or specific folder (global | ||
// is not supported). | ||
target, | ||
// The task name, and task source. These are shown in the UI as | ||
// `${source}: ${name}`, e.g. `rust: cargo build`. | ||
`cargo ${command}`, | ||
'rust', | ||
// What to do when this command is executed. | ||
new vscode.ShellExecution('cargo', [command]), | ||
// Problem matchers. | ||
['$rustc'], | ||
); | ||
vscodeTask.group = group; | ||
return vscodeTask; | ||
}); | ||
} |