Skip to content
25 changes: 24 additions & 1 deletion Extension/src/Debugger/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ import { SshTargetsProvider, getActiveSshTarget, initializeSshTargets, selectSsh
import { TargetLeafNode, setActiveSshTarget } from '../SSH/TargetsView/targetNodes';
import { sshCommandToConfig } from '../SSH/sshCommandToConfig';
import { getSshConfiguration, getSshConfigurationFiles, parseFailures, writeSshConfiguration } from '../SSH/sshHosts';
import { documentSelector, pathAccessible } from '../common';
import { documentSelector, isCpp, isCppOrCFile, pathAccessible } from '../common';
import { instrument } from '../instrumentation';
import { getSshChannel } from '../logger';
import { SessionState } from '../sessionState';
import { AttachItemsProvider, AttachPicker, RemoteAttachPicker } from './attachToProcess';
import { ConfigurationAssetProviderFactory, ConfigurationSnippetProvider, DebugConfigurationProvider, IConfigurationAssetProvider } from './configurationProvider';
import { DebuggerType } from './configurations';
Expand Down Expand Up @@ -129,6 +130,28 @@ export async function initialize(context: vscode.ExtensionContext): Promise<void
}
}
}));

// Track active editor changes so "Run and Debug" button session state is kept up to date
// even if the language server (IntelliSense) is disabled.
updateBuildAndDebugSessionState(vscode.window.activeTextEditor);
disposables.push(vscode.window.onDidChangeActiveTextEditor(editor => updateBuildAndDebugSessionState(editor)));
disposables.push(vscode.workspace.onDidOpenTextDocument(document => {
const activeEditor: vscode.TextEditor | undefined = vscode.window.activeTextEditor;
if (activeEditor?.document.uri.toString() === document.uri.toString()) {
updateBuildAndDebugSessionState(activeEditor);
}
}));
disposables.push(vscode.workspace.onDidChangeWorkspaceFolders(() => updateBuildAndDebugSessionState(vscode.window.activeTextEditor)));
}

export function updateBuildAndDebugSessionState(editor?: vscode.TextEditor): void {
if (editor && isCpp(editor.document)) {
void SessionState.buildAndDebugIsFolderOpen.set(vscode.workspace.getWorkspaceFolder(editor.document.uri) !== undefined);
void SessionState.buildAndDebugIsSourceFile.set(isCppOrCFile(editor.document.uri, editor.document.languageId));
} else {
void SessionState.buildAndDebugIsFolderOpen.set(vscode.workspace.workspaceFolders !== undefined);
void SessionState.buildAndDebugIsSourceFile.set(false);
}
}

export function dispose(): void {
Expand Down
Comment thread
sean-mcmanus marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */

import * as assert from 'assert';
import { suite, test } from 'mocha';
import * as vscode from 'vscode';
import { updateBuildAndDebugSessionState } from '../../../../src/Debugger/extension';
import { SessionState } from '../../../../src/sessionState';

suite("BuildAndDebug SessionState Tests", () => {
test("updateBuildAndDebugSessionState sets false when editor is undefined", () => {
updateBuildAndDebugSessionState(undefined);
assert.strictEqual(SessionState.buildAndDebugIsSourceFile.get(), false);
assert.strictEqual(SessionState.buildAndDebugIsFolderOpen.get(), true);
});

test("updateBuildAndDebugSessionState sets false for non-C/C++ editor", () => {
const mockEditor: any = {
document: {
uri: vscode.Uri.file("test.txt"),
languageId: "plaintext"
}
};
updateBuildAndDebugSessionState(mockEditor);
assert.strictEqual(SessionState.buildAndDebugIsSourceFile.get(), false);
assert.strictEqual(SessionState.buildAndDebugIsFolderOpen.get(), true);
});

test("updateBuildAndDebugSessionState sets true for C/C++ source file", () => {
const workspaceFolder = vscode.workspace.workspaceFolders?.[0] ?? assert.fail("No workspace folder available");
const mockEditor: any = {
document: {
uri: vscode.Uri.joinPath(workspaceFolder.uri, "main.cpp"),
languageId: "cpp"
}
};
updateBuildAndDebugSessionState(mockEditor);
assert.strictEqual(SessionState.buildAndDebugIsSourceFile.get(), true);
assert.strictEqual(SessionState.buildAndDebugIsFolderOpen.get(), true);
});

test("updateBuildAndDebugSessionState sets false for C/C++ header file", () => {
const workspaceFolder = vscode.workspace.workspaceFolders?.[0] ?? assert.fail("No workspace folder available");
const mockEditor: any = {
document: {
uri: vscode.Uri.joinPath(workspaceFolder.uri, "header.h"),
languageId: "cpp"
}
};
updateBuildAndDebugSessionState(mockEditor);
assert.strictEqual(SessionState.buildAndDebugIsSourceFile.get(), false);
assert.strictEqual(SessionState.buildAndDebugIsFolderOpen.get(), true);
});
});
Loading