diff options
Diffstat (limited to 'editors/code/src/run.ts')
-rw-r--r-- | editors/code/src/run.ts | 96 |
1 files changed, 19 insertions, 77 deletions
diff --git a/editors/code/src/run.ts b/editors/code/src/run.ts index 8e1ba83ed..5c790741f 100644 --- a/editors/code/src/run.ts +++ b/editors/code/src/run.ts | |||
@@ -1,9 +1,10 @@ | |||
1 | import * as vscode from 'vscode'; | 1 | import * as vscode from 'vscode'; |
2 | import * as lc from 'vscode-languageclient'; | 2 | import * as lc from 'vscode-languageclient'; |
3 | import * as ra from './lsp_ext'; | 3 | import * as ra from './lsp_ext'; |
4 | import * as toolchain from "./toolchain"; | ||
4 | 5 | ||
5 | import { Ctx, Cmd } from './ctx'; | 6 | import { Ctx } from './ctx'; |
6 | import { startDebugSession, getDebugConfiguration } from './debug'; | 7 | import { makeDebugConfig } from './debug'; |
7 | 8 | ||
8 | const quickPickButtons = [{ iconPath: new vscode.ThemeIcon("save"), tooltip: "Save as a launch.json configurtation." }]; | 9 | const quickPickButtons = [{ iconPath: new vscode.ThemeIcon("save"), tooltip: "Save as a launch.json configurtation." }]; |
9 | 10 | ||
@@ -64,7 +65,7 @@ export async function selectRunnable(ctx: Ctx, prevRunnable?: RunnableQuickPick, | |||
64 | quickPick.onDidHide(() => close()), | 65 | quickPick.onDidHide(() => close()), |
65 | quickPick.onDidAccept(() => close(quickPick.selectedItems[0])), | 66 | quickPick.onDidAccept(() => close(quickPick.selectedItems[0])), |
66 | quickPick.onDidTriggerButton((_button) => { | 67 | quickPick.onDidTriggerButton((_button) => { |
67 | (async () => await makeDebugConfig(ctx, quickPick.activeItems[0]))(); | 68 | (async () => await makeDebugConfig(ctx, quickPick.activeItems[0].runnable))(); |
68 | close(); | 69 | close(); |
69 | }), | 70 | }), |
70 | quickPick.onDidChangeActive((active) => { | 71 | quickPick.onDidChangeActive((active) => { |
@@ -83,74 +84,6 @@ export async function selectRunnable(ctx: Ctx, prevRunnable?: RunnableQuickPick, | |||
83 | }); | 84 | }); |
84 | } | 85 | } |
85 | 86 | ||
86 | export function runSingle(ctx: Ctx): Cmd { | ||
87 | return async (runnable: ra.Runnable) => { | ||
88 | const editor = ctx.activeRustEditor; | ||
89 | if (!editor) return; | ||
90 | |||
91 | const task = createTask(runnable); | ||
92 | task.group = vscode.TaskGroup.Build; | ||
93 | task.presentationOptions = { | ||
94 | reveal: vscode.TaskRevealKind.Always, | ||
95 | panel: vscode.TaskPanelKind.Dedicated, | ||
96 | clear: true, | ||
97 | }; | ||
98 | |||
99 | return vscode.tasks.executeTask(task); | ||
100 | }; | ||
101 | } | ||
102 | |||
103 | export function debug(ctx: Ctx): Cmd { | ||
104 | let prevDebuggee: RunnableQuickPick | undefined; | ||
105 | |||
106 | return async () => { | ||
107 | const item = await selectRunnable(ctx, prevDebuggee, true); | ||
108 | if (!item) return; | ||
109 | |||
110 | item.detail = 'restart'; | ||
111 | prevDebuggee = item; | ||
112 | return await startDebugSession(ctx, item.runnable); | ||
113 | }; | ||
114 | } | ||
115 | |||
116 | export function debugSingle(ctx: Ctx): Cmd { | ||
117 | return async (config: ra.Runnable) => { | ||
118 | await startDebugSession(ctx, config); | ||
119 | }; | ||
120 | } | ||
121 | |||
122 | async function makeDebugConfig(ctx: Ctx, item: RunnableQuickPick): Promise<void> { | ||
123 | const scope = ctx.activeRustEditor?.document.uri; | ||
124 | if (!scope) return; | ||
125 | |||
126 | const debugConfig = await getDebugConfiguration(ctx, item.runnable); | ||
127 | if (!debugConfig) return; | ||
128 | |||
129 | const wsLaunchSection = vscode.workspace.getConfiguration("launch", scope); | ||
130 | const configurations = wsLaunchSection.get<any[]>("configurations") || []; | ||
131 | |||
132 | const index = configurations.findIndex(c => c.name === debugConfig.name); | ||
133 | if (index !== -1) { | ||
134 | const answer = await vscode.window.showErrorMessage(`Launch configuration '${debugConfig.name}' already exists!`, 'Cancel', 'Update'); | ||
135 | if (answer === "Cancel") return; | ||
136 | |||
137 | configurations[index] = debugConfig; | ||
138 | } else { | ||
139 | configurations.push(debugConfig); | ||
140 | } | ||
141 | |||
142 | await wsLaunchSection.update("configurations", configurations); | ||
143 | } | ||
144 | |||
145 | export function newDebugConfig(ctx: Ctx): Cmd { | ||
146 | return async () => { | ||
147 | const item = await selectRunnable(ctx, undefined, true, false); | ||
148 | if (!item) return; | ||
149 | |||
150 | await makeDebugConfig(ctx, item); | ||
151 | }; | ||
152 | } | ||
153 | |||
154 | export class RunnableQuickPick implements vscode.QuickPickItem { | 87 | export class RunnableQuickPick implements vscode.QuickPickItem { |
155 | public label: string; | 88 | public label: string; |
156 | public description?: string | undefined; | 89 | public description?: string | undefined; |
@@ -170,18 +103,27 @@ interface CargoTaskDefinition extends vscode.TaskDefinition { | |||
170 | env?: { [key: string]: string }; | 103 | env?: { [key: string]: string }; |
171 | } | 104 | } |
172 | 105 | ||
173 | export function createTask(spec: ra.Runnable): vscode.Task { | 106 | export function createTask(runnable: ra.Runnable): vscode.Task { |
174 | const TASK_SOURCE = 'Rust'; | 107 | const TASK_SOURCE = 'Rust'; |
108 | |||
109 | let command; | ||
110 | switch (runnable.kind) { | ||
111 | case "cargo": command = toolchain.getPathForExecutable("cargo"); | ||
112 | } | ||
113 | const args = runnable.args.cargoArgs; | ||
114 | if (runnable.args.executableArgs.length > 0) { | ||
115 | args.push('--', ...runnable.args.executableArgs); | ||
116 | } | ||
175 | const definition: CargoTaskDefinition = { | 117 | const definition: CargoTaskDefinition = { |
176 | type: 'cargo', | 118 | type: 'cargo', |
177 | label: spec.label, | 119 | label: runnable.label, |
178 | command: spec.bin, | 120 | command, |
179 | args: spec.extraArgs ? [...spec.args, '--', ...spec.extraArgs] : spec.args, | 121 | args, |
180 | env: Object.assign({}, process.env, spec.env), | 122 | env: Object.assign({}, process.env as { [key: string]: string }, { "RUST_BACKTRACE": "short" }), |
181 | }; | 123 | }; |
182 | 124 | ||
183 | const execOption: vscode.ShellExecutionOptions = { | 125 | const execOption: vscode.ShellExecutionOptions = { |
184 | cwd: spec.cwd || '.', | 126 | cwd: runnable.args.workspaceRoot || '.', |
185 | env: definition.env, | 127 | env: definition.env, |
186 | }; | 128 | }; |
187 | const exec = new vscode.ShellExecution( | 129 | const exec = new vscode.ShellExecution( |