Skip to content

Commit e172440

Browse files
authored
Fix cl.exe being excluded for .c files and c/cpp caching. (#9544)
* Fix cl.exe being excluded for .c files and c/cpp caching.
1 parent 996453b commit e172440

File tree

2 files changed

+53
-6
lines changed

2 files changed

+53
-6
lines changed

Extension/src/Debugger/configurationProvider.ts

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv
3838
private assetProvider: IConfigurationAssetProvider;
3939
// Keep a list of tasks detected by cppBuildTaskProvider.
4040
private static detectedBuildTasks: CppBuildTask[] = [];
41+
private static detectedCppBuildTasks: CppBuildTask[] = [];
42+
private static detectedCBuildTasks: CppBuildTask[] = [];
4143
protected static recentBuildTaskLabel: string;
4244

4345
public constructor(assetProvider: IConfigurationAssetProvider, type: DebuggerType) {
@@ -449,8 +451,44 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv
449451
}
450452

451453
private async loadDetectedTasks(): Promise<void> {
452-
if (!DebugConfigurationProvider.detectedBuildTasks || DebugConfigurationProvider.detectedBuildTasks.length === 0) {
453-
DebugConfigurationProvider.detectedBuildTasks = await cppBuildTaskProvider.getTasks(true);
454+
const editor: vscode.TextEditor | undefined = vscode.window.activeTextEditor;
455+
const emptyTasks: CppBuildTask[] = [];
456+
if (!editor) {
457+
DebugConfigurationProvider.detectedBuildTasks = emptyTasks;
458+
return;
459+
}
460+
461+
const fileExt: string = path.extname(editor.document.fileName);
462+
if (!fileExt) {
463+
DebugConfigurationProvider.detectedBuildTasks = emptyTasks;
464+
return;
465+
}
466+
467+
// Don't offer tasks for header files.
468+
const isHeader: boolean = util.isHeaderFile (editor.document.uri);
469+
if (isHeader) {
470+
DebugConfigurationProvider.detectedBuildTasks = emptyTasks;
471+
return;
472+
}
473+
474+
// Don't offer tasks if the active file's extension is not a recognized C/C++ extension.
475+
const fileIsCpp: boolean = util.isCppFile(editor.document.uri);
476+
const fileIsC: boolean = util.isCFile(editor.document.uri);
477+
if (!(fileIsCpp || fileIsC)) {
478+
DebugConfigurationProvider.detectedBuildTasks = emptyTasks;
479+
return;
480+
}
481+
482+
if (fileIsCpp) {
483+
if (!DebugConfigurationProvider.detectedCppBuildTasks || DebugConfigurationProvider.detectedCppBuildTasks.length === 0) {
484+
DebugConfigurationProvider.detectedCppBuildTasks = await cppBuildTaskProvider.getTasks(true);
485+
}
486+
DebugConfigurationProvider.detectedBuildTasks = DebugConfigurationProvider.detectedCppBuildTasks;
487+
} else {
488+
if (!DebugConfigurationProvider.detectedCBuildTasks || DebugConfigurationProvider.detectedCBuildTasks.length === 0) {
489+
DebugConfigurationProvider.detectedCBuildTasks = await cppBuildTaskProvider.getTasks(true);
490+
}
491+
DebugConfigurationProvider.detectedBuildTasks = DebugConfigurationProvider.detectedCBuildTasks;
454492
}
455493
}
456494

Extension/src/LanguageServer/cppBuildTaskProvider.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,19 @@ export class CppBuildTaskProvider implements TaskProvider {
122122
const knownCompilerPathsSet: Set<string> = new Set();
123123
let knownCompilers: configs.KnownCompiler[] | undefined = await activeClient.getKnownCompilers();
124124
if (knownCompilers) {
125-
const compiler_condition: (info: configs.KnownCompiler) => boolean = info => ((fileIsCpp && !info.isC) || (fileIsC && info.isC)) &&
126-
(!isCompilerValid || (!!userCompilerPathAndArgs &&
127-
(path.basename(info.path) !== userCompilerPathAndArgs.compilerName))) &&
128-
(!isWindows || !info.path.startsWith("/")); // TODO: Add WSL compiler support.
125+
const compiler_condition: (info: configs.KnownCompiler) => boolean = info =>
126+
(
127+
// Filter out c compilers for cpp files and vice versa, except for cl.exe, which handles both.
128+
path.basename(info.path) === "cl.exe" ||
129+
(fileIsCpp && !info.isC) || (fileIsC && info.isC)
130+
) &&
131+
(
132+
!isCompilerValid || (!!userCompilerPathAndArgs &&
133+
(path.basename(info.path) !== userCompilerPathAndArgs.compilerName))
134+
) &&
135+
(
136+
!isWindows || !info.path.startsWith("/")
137+
); // TODO: Add WSL compiler support.
129138
const cl_to_add: configs.KnownCompiler | undefined = userCompilerIsCl ? undefined : knownCompilers.find(info =>
130139
((path.basename(info.path) === "cl.exe") && compiler_condition(info)));
131140
knownCompilers = knownCompilers.filter(info =>

0 commit comments

Comments
 (0)