diff --git a/Extension/package.json b/Extension/package.json index cdfa82d47..73388edfc 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -3379,6 +3379,17 @@ "default": "default", "markdownDescription": "%c_cpp.configuration.copilotHover.markdownDescription%", "scope": "window" + }, + "C_Cpp.windowsErrorReportingMode": { + "type": "string", + "enum": [ + "default", + "enabled", + "disabled" + ], + "default": "default", + "markdownDescription": "%c_cpp.configuration.windowsErrorReportingMode.markdownDescription%", + "scope": "window" } } } diff --git a/Extension/package.nls.json b/Extension/package.nls.json index 34295589f..c6bc95490 100644 --- a/Extension/package.nls.json +++ b/Extension/package.nls.json @@ -790,6 +790,12 @@ "{Locked=\"`disabled`\"} {Locked=\"Copilot\"}" ] }, + "c_cpp.configuration.windowsErrorReportingMode.markdownDescription": { + "message": "If `disabled`, Windows Error Reporting will be disabled. If `default`, Windows Error Reporting will be enabled, but it becomes disabled after the first crash in the current session. Changing the setting doesn't affect currently running IntelliSense processes.", + "comment": [ + "{Locked=\"`disabled`\"} {Locked=\"`default`\"} {Locked=\"`IntelliSense`\"}" + ] + }, "c_cpp.configuration.renameRequiresIdentifier.markdownDescription": { "message": "If `true`, 'Rename Symbol' will require a valid C/C++ identifier.", "comment": [ @@ -1084,4 +1090,4 @@ "c_cpp.configuration.refactoring.includeHeader.never.description": "Never include the header file.", "c_cpp.languageModelTools.configuration.displayName": "C/C++ configuration", "c_cpp.languageModelTools.configuration.userDescription": "Configuration of the active C or C++ file, like language standard version and target platform." -} +} \ No newline at end of file diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index d26655b0e..40611c728 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -90,6 +90,7 @@ export function hasTrustedCompilerPaths(): boolean { // Data shared by all clients. let languageClient: LanguageClient; let firstClientStarted: Promise<{ wasShutdown: boolean }>; +let languageClientHasCrashed: boolean = false; let languageClientCrashedNeedsRestart: boolean = false; const languageClientCrashTimes: number[] = []; let compilerDefaults: configs.CompilerDefaults | undefined; @@ -1600,6 +1601,7 @@ export class DefaultClient implements Client { codeAnalysisMaxMemory: workspaceSettings.codeAnalysisMaxMemory, codeAnalysisUpdateDelay: workspaceSettings.codeAnalysisUpdateDelay, copilotHover: workspaceSettings.copilotHover, + windowsErrorReportingMode: workspaceSettings.windowsErrorReportingMode, workspaceFolderSettings: workspaceFolderSettingsParams }; } @@ -1688,6 +1690,7 @@ export class DefaultClient implements Client { errorHandler: { error: (_error, _message, _count) => ({ action: ErrorAction.Continue }), closed: () => { + languageClientHasCrashed = true; languageClientCrashTimes.push(Date.now()); languageClientCrashedNeedsRestart = true; let restart: boolean = true; @@ -1752,6 +1755,12 @@ export class DefaultClient implements Client { if (usesCrashHandler()) { watchForCrashes(await languageClient.sendRequest(PreInitializationRequest, null)); + } else if (os.platform() === "win32") { + const settings: CppSettings = new CppSettings(); + if ((settings.windowsErrorReportingMode === "default" && !languageClientHasCrashed) || + settings.windowsErrorReportingMode === "enabled") { + await languageClient.sendRequest(PreInitializationRequest, null); + } } // Move initialization to a separate message, so we can see log output from it. diff --git a/Extension/src/LanguageServer/settings.ts b/Extension/src/LanguageServer/settings.ts index 0f35cc315..6e199cd64 100644 --- a/Extension/src/LanguageServer/settings.ts +++ b/Extension/src/LanguageServer/settings.ts @@ -164,6 +164,7 @@ export interface SettingsParams { codeAnalysisUpdateDelay: number; workspaceFolderSettings: WorkspaceFolderSettingsParams[]; copilotHover: string; + windowsErrorReportingMode: string; } function getTarget(): vscode.ConfigurationTarget { @@ -478,6 +479,7 @@ export class CppSettings extends Settings { } return this.getAsString("copilotHover"); } + public get windowsErrorReportingMode(): string { return this.getAsString("windowsErrorReportingMode"); } public get cppContextProviderParams(): string | undefined { const value = super.Section.get("copilotContextProviderParams"); if (isString(value)) {