diff options
Diffstat (limited to 'editors/code/src')
-rw-r--r-- | editors/code/src/commands/runnables.ts | 82 |
1 files changed, 61 insertions, 21 deletions
diff --git a/editors/code/src/commands/runnables.ts b/editors/code/src/commands/runnables.ts index 5e88eeae0..b1d93fc34 100644 --- a/editors/code/src/commands/runnables.ts +++ b/editors/code/src/commands/runnables.ts | |||
@@ -5,7 +5,9 @@ import * as ra from '../rust-analyzer-api'; | |||
5 | import { Ctx, Cmd } from '../ctx'; | 5 | import { Ctx, Cmd } from '../ctx'; |
6 | import { startDebugSession, getDebugConfiguration } from '../debug'; | 6 | import { startDebugSession, getDebugConfiguration } from '../debug'; |
7 | 7 | ||
8 | async function selectRunnable(ctx: Ctx, prevRunnable: RunnableQuickPick | undefined): Promise<RunnableQuickPick | undefined> { | 8 | const quickPickButtons = [{ iconPath: new vscode.ThemeIcon("save"), tooltip: "Save as a launch.json configurtation." }]; |
9 | |||
10 | async function selectRunnable(ctx: Ctx, prevRunnable?: RunnableQuickPick, showButtons: boolean = true): Promise<RunnableQuickPick | undefined> { | ||
9 | const editor = ctx.activeRustEditor; | 11 | const editor = ctx.activeRustEditor; |
10 | const client = ctx.client; | 12 | const client = ctx.client; |
11 | if (!editor || !client) return; | 13 | if (!editor || !client) return; |
@@ -33,7 +35,41 @@ async function selectRunnable(ctx: Ctx, prevRunnable: RunnableQuickPick | undefi | |||
33 | } | 35 | } |
34 | items.push(new RunnableQuickPick(r)); | 36 | items.push(new RunnableQuickPick(r)); |
35 | } | 37 | } |
36 | return await vscode.window.showQuickPick(items); | 38 | |
39 | return await new Promise((resolve) => { | ||
40 | const disposables: vscode.Disposable[] = []; | ||
41 | const close = (result?: RunnableQuickPick) => { | ||
42 | resolve(result); | ||
43 | disposables.forEach(d => d.dispose()); | ||
44 | }; | ||
45 | |||
46 | const quickPick = vscode.window.createQuickPick<RunnableQuickPick>(); | ||
47 | quickPick.items = items; | ||
48 | quickPick.title = "Select Runnable"; | ||
49 | if (showButtons) { | ||
50 | quickPick.buttons = quickPickButtons; | ||
51 | } | ||
52 | disposables.push( | ||
53 | quickPick.onDidHide(() => close()), | ||
54 | quickPick.onDidAccept(() => close(quickPick.selectedItems[0])), | ||
55 | quickPick.onDidTriggerButton((_button) => { | ||
56 | (async () => await makeDebugConfig(ctx, quickPick.activeItems[0]))(); | ||
57 | close(); | ||
58 | }), | ||
59 | quickPick.onDidChangeActive((active) => { | ||
60 | if (showButtons && active.length > 0) { | ||
61 | if (active[0].label.startsWith('cargo')) { | ||
62 | // save button makes no sense for `cargo test` or `cargo check` | ||
63 | quickPick.buttons = []; | ||
64 | } else if (quickPick.buttons.length === 0) { | ||
65 | quickPick.buttons = quickPickButtons; | ||
66 | } | ||
67 | } | ||
68 | }), | ||
69 | quickPick | ||
70 | ); | ||
71 | quickPick.show(); | ||
72 | }); | ||
37 | } | 73 | } |
38 | 74 | ||
39 | export function run(ctx: Ctx): Cmd { | 75 | export function run(ctx: Ctx): Cmd { |
@@ -86,31 +122,35 @@ export function debugSingle(ctx: Ctx): Cmd { | |||
86 | }; | 122 | }; |
87 | } | 123 | } |
88 | 124 | ||
89 | export function newDebugConfig(ctx: Ctx): Cmd { | 125 | async function makeDebugConfig(ctx: Ctx, item: RunnableQuickPick): Promise<void> { |
90 | return async () => { | 126 | const scope = ctx.activeRustEditor?.document.uri; |
91 | const scope = ctx.activeRustEditor?.document.uri; | 127 | if (!scope) return; |
92 | if (!scope) return; | ||
93 | 128 | ||
94 | const item = await selectRunnable(ctx, undefined); | 129 | const debugConfig = await getDebugConfiguration(ctx, item.runnable); |
95 | if (!item) return; | 130 | if (!debugConfig) return; |
96 | 131 | ||
97 | const debugConfig = await getDebugConfiguration(ctx, item.runnable); | 132 | const wsLaunchSection = vscode.workspace.getConfiguration("launch", scope); |
98 | if (!debugConfig) return; | 133 | const configurations = wsLaunchSection.get<any[]>("configurations") || []; |
99 | 134 | ||
100 | const wsLaunchSection = vscode.workspace.getConfiguration("launch", scope); | 135 | const index = configurations.findIndex(c => c.name === debugConfig.name); |
101 | const configurations = wsLaunchSection.get<any[]>("configurations") || []; | 136 | if (index !== -1) { |
137 | const answer = await vscode.window.showErrorMessage(`Launch configuration '${debugConfig.name}' already exists!`, 'Cancel', 'Update'); | ||
138 | if (answer === "Cancel") return; | ||
102 | 139 | ||
103 | const index = configurations.findIndex(c => c.name === debugConfig.name); | 140 | configurations[index] = debugConfig; |
104 | if (index !== -1) { | 141 | } else { |
105 | const answer = await vscode.window.showErrorMessage(`Launch configuration '${debugConfig.name}' already exists!`, 'Cancel', 'Update'); | 142 | configurations.push(debugConfig); |
106 | if (answer === "Cancel") return; | 143 | } |
107 | 144 | ||
108 | configurations[index] = debugConfig; | 145 | await wsLaunchSection.update("configurations", configurations); |
109 | } else { | 146 | } |
110 | configurations.push(debugConfig); | 147 | |
111 | } | 148 | export function newDebugConfig(ctx: Ctx): Cmd { |
149 | return async () => { | ||
150 | const item = await selectRunnable(ctx, undefined, false); | ||
151 | if (!item) return; | ||
112 | 152 | ||
113 | await wsLaunchSection.update("configurations", configurations); | 153 | await makeDebugConfig(ctx, item); |
114 | }; | 154 | }; |
115 | } | 155 | } |
116 | 156 | ||