diff --git a/Extension/package.json b/Extension/package.json index 8727b00ebc..e5d15681e1 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -587,6 +587,11 @@ "command": "C_Cpp.TakeSurvey", "title": "%c_cpp.command.takeSurvey.title%", "category": "C/C++" + }, + { + "command": "C_Cpp.BuildAndDebugActiveFile", + "title": "%c_cpp.command.buildAndDebugActiveFile.title%", + "category": "C/C++" } ], "keybindings": [ @@ -1393,6 +1398,16 @@ "when": "editorLangId == cpp", "command": "workbench.action.showAllSymbols", "group": "other@4" + }, + { + "when": "editorLangId == cpp", + "command": "C_Cpp.BuildAndDebugActiveFile", + "group": "other@5" + }, + { + "when": "editorLangId == c", + "command": "C_Cpp.BuildAndDebugActiveFile", + "group": "other@5" } ] }, diff --git a/Extension/src/Debugger/configurationProvider.ts b/Extension/src/Debugger/configurationProvider.ts index 7723bccdf1..6c5941595e 100644 --- a/Extension/src/Debugger/configurationProvider.ts +++ b/Extension/src/Debugger/configurationProvider.ts @@ -7,10 +7,9 @@ import * as debugUtils from './utils'; import * as os from 'os'; import * as path from 'path'; import * as vscode from 'vscode'; -import { /*getBuildTasks,*/ BuildTaskDefinition } from '../LanguageServer/extension'; +import { getBuildTasks, BuildTaskDefinition } from '../LanguageServer/extension'; import * as util from '../common'; import * as fs from 'fs'; -//import * as assert from 'assert'; import * as Telemetry from '../telemetry'; import { buildAndDebugActiveFileStr } from './extension'; @@ -55,24 +54,20 @@ export class QuickPickConfigurationProvider implements vscode.DebugConfiguration return menuItem; }); - return vscode.window.showQuickPick(items, {placeHolder: "Select a configuration"}).then(async selection => { - // Wrap in new Promise to make sure task kicks off before VS Code switches the active document to launch.json - return new Promise(async resolve => { - if (!selection) { - return resolve([defaultConfig]); // User canceled it. Choose the default config? - } - if (selection.label.indexOf(buildAndDebugActiveFileStr()) !== -1 && selection.configuration.preLaunchTask) { - try { - await util.ensureBuildTaskExists(selection.configuration.preLaunchTask); - await vscode.debug.startDebugging(folder, selection.configuration); - Telemetry.logDebuggerEvent("buildAndDebug", { "success": "true" }); - } catch (e) { - Telemetry.logDebuggerEvent("buildAndDebug", { "success": "false" }); - } - } - return resolve([selection.configuration]); - }); - }); + const selection: MenuItem = await vscode.window.showQuickPick(items, {placeHolder: "Select a configuration"}); + if (!selection) { + throw new Error(); // User canceled it. + } + if (selection.label.indexOf(buildAndDebugActiveFileStr()) !== -1 && selection.configuration.preLaunchTask) { + try { + await util.ensureBuildTaskExists(selection.configuration.preLaunchTask); + await vscode.debug.startDebugging(folder, selection.configuration); + Telemetry.logDebuggerEvent("buildAndDebug", { "success": "true" }); + } catch (e) { + Telemetry.logDebuggerEvent("buildAndDebug", { "success": "false" }); + } + } + return [selection.configuration]; } resolveDebugConfiguration(folder: vscode.WorkspaceFolder | undefined, config: vscode.DebugConfiguration, token?: vscode.CancellationToken): vscode.ProviderResult { @@ -93,8 +88,8 @@ class CppConfigurationProvider implements vscode.DebugConfigurationProvider { * Returns a list of initial debug configurations based on contextual information, e.g. package.json or folder. */ async provideDebugConfigurations(folder: vscode.WorkspaceFolder | undefined, token?: vscode.CancellationToken): Promise { - let buildTasks: vscode.Task[]; // = await getBuildTasks(); // TODO - if (!buildTasks || buildTasks.length === 0) { + let buildTasks: vscode.Task[] = await getBuildTasks(); + if (buildTasks.length === 0 || this.type === DebuggerType.cppvsdbg) { return Promise.resolve(this.provider.getInitialConfigurations(this.type)); } const defaultConfig: vscode.DebugConfiguration = this.provider.getInitialConfigurations(this.type).find(config => { @@ -130,6 +125,10 @@ class CppConfigurationProvider implements vscode.DebugConfigurationProvider { debuggerName = "gdb"; } + if (platform === "win32") { + debuggerName += ".exe"; + } + const debuggerPath: string = path.join(compilerDirname, debuggerName); return new Promise(resolve => { fs.stat(debuggerPath, (err, stats: fs.Stats) => { @@ -137,7 +136,7 @@ class CppConfigurationProvider implements vscode.DebugConfigurationProvider { newConfig.miDebuggerPath = debuggerPath; } else { // TODO should probably resolve a missing debugger in a more graceful fashion for win32. - newConfig.miDebuggerPath = path.join("/usr", "bin", debuggerName); + newConfig.miDebuggerPath = (platform === "darwin" ? undefined : path.join("/usr", "bin", debuggerName)); } return resolve(newConfig); diff --git a/Extension/src/Debugger/extension.ts b/Extension/src/Debugger/extension.ts index 35497a5aef..c49b82c2af 100644 --- a/Extension/src/Debugger/extension.ts +++ b/Extension/src/Debugger/extension.ts @@ -7,7 +7,7 @@ import * as vscode from 'vscode'; import * as os from 'os'; import { AttachPicker, RemoteAttachPicker, AttachItemsProvider } from './attachToProcess'; import { NativeAttachItemsProviderFactory } from './nativeAttach'; -import { /*QuickPickConfigurationProvider,*/ ConfigurationAssetProviderFactory, CppVsDbgConfigurationProvider, CppDbgConfigurationProvider, ConfigurationSnippetProvider, IConfigurationAssetProvider } from './configurationProvider'; +import { QuickPickConfigurationProvider, ConfigurationAssetProviderFactory, CppVsDbgConfigurationProvider, CppDbgConfigurationProvider, ConfigurationSnippetProvider, IConfigurationAssetProvider } from './configurationProvider'; import { CppdbgDebugAdapterDescriptorFactory, CppvsdbgDebugAdapterDescriptorFactory } from './debugAdapterDescriptorFactory'; import * as util from '../common'; import * as Telemetry from '../telemetry'; @@ -35,7 +35,7 @@ export function initialize(context: vscode.ExtensionContext): void { disposables.push(vscode.debug.registerDebugConfigurationProvider('cppvsdbg', new CppVsDbgConfigurationProvider(configurationProvider))); } const provider: CppDbgConfigurationProvider = new CppDbgConfigurationProvider(configurationProvider); - disposables.push(vscode.debug.registerDebugConfigurationProvider('cppdbg', provider)); //new QuickPickConfigurationProvider(provider))); // TODO + disposables.push(vscode.debug.registerDebugConfigurationProvider('cppdbg', new QuickPickConfigurationProvider(provider))); disposables.push(vscode.commands.registerTextEditorCommand("C_Cpp.BuildAndDebugActiveFile", async (textEditor: vscode.TextEditor, edit: vscode.TextEditorEdit, ...args: any[]) => { const folder: vscode.WorkspaceFolder = vscode.workspace.getWorkspaceFolder(textEditor.document.uri); diff --git a/Extension/src/common.ts b/Extension/src/common.ts index 10f57c03c9..c47bf3e062 100644 --- a/Extension/src/common.ts +++ b/Extension/src/common.ts @@ -83,6 +83,8 @@ export async function ensureBuildTaskExists(taskName: string): Promise { delete definition.compilerPath; } + rawTasksJson.version = "2.0.0"; + if (!rawTasksJson.tasks.find(task => { return task.label === selectedTask.definition.label; })) { rawTasksJson.tasks.push(selectedTask.definition); } diff --git a/Extension/src/main.ts b/Extension/src/main.ts index fa28ffb376..ea519b3b61 100644 --- a/Extension/src/main.ts +++ b/Extension/src/main.ts @@ -329,7 +329,7 @@ function rewriteManifest(): Promise { "onLanguage:c", "onCommand:extension.pickNativeProcess", "onCommand:extension.pickRemoteNativeProcess", - //"onCommand:C_Cpp.BuildAndDebugActiveFile", // TODO + "onCommand:C_Cpp.BuildAndDebugActiveFile", "onCommand:C_Cpp.ConfigurationEdit", "onCommand:C_Cpp.ConfigurationSelect", "onCommand:C_Cpp.ConfigurationProviderSelect",