diff --git a/Extension/src/Debugger/extension.ts b/Extension/src/Debugger/extension.ts index 780fa121b..64a62c401 100644 --- a/Extension/src/Debugger/extension.ts +++ b/Extension/src/Debugger/extension.ts @@ -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, isFolderOpen, 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'; @@ -129,6 +130,20 @@ export async function initialize(context: vscode.ExtensionContext): Promise updateBuildAndDebugSessionState(editor))); +} + +export function updateBuildAndDebugSessionState(editor?: vscode.TextEditor): void { + if (editor && isCpp(editor.document)) { + void SessionState.buildAndDebugIsSourceFile.set(isCppOrCFile(editor.document.uri, editor.document.languageId)); + void SessionState.buildAndDebugIsFolderOpen.set(isFolderOpen(editor.document.uri)); + } else { + void SessionState.buildAndDebugIsSourceFile.set(false); + } } export function dispose(): void { diff --git a/Extension/test/scenarios/SingleRootProject/tests/buildAndDebug.test.ts b/Extension/test/scenarios/SingleRootProject/tests/buildAndDebug.test.ts new file mode 100644 index 000000000..5802e8b68 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/tests/buildAndDebug.test.ts @@ -0,0 +1,50 @@ +/* -------------------------------------------------------------------------------------------- + * 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); + }); + + 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); + }); + + test("updateBuildAndDebugSessionState sets true for C/C++ source file", () => { + const mockEditor: any = { + document: { + uri: vscode.Uri.file("main.cpp"), + languageId: "cpp" + } + }; + updateBuildAndDebugSessionState(mockEditor); + assert.strictEqual(SessionState.buildAndDebugIsSourceFile.get(), true); + }); + + test("updateBuildAndDebugSessionState sets false for C/C++ header file", () => { + const mockEditor: any = { + document: { + uri: vscode.Uri.file("header.h"), + languageId: "cpp" + } + }; + updateBuildAndDebugSessionState(mockEditor); + assert.strictEqual(SessionState.buildAndDebugIsSourceFile.get(), false); + }); +});