From dbe8cf4ee9af597033cf87b5dd31bda2cd841ca0 Mon Sep 17 00:00:00 2001 From: Colen Garoutte-Carson Date: Mon, 30 Mar 2026 13:15:49 -0700 Subject: [PATCH 1/2] Changes for DB population unification work --- Extension/{ => bin}/cpp.hint | 0 Extension/c_cpp_properties.schema.json | 11 ----- Extension/src/LanguageServer/client.ts | 15 ++++++ .../src/LanguageServer/configurations.ts | 11 ----- Extension/src/LanguageServer/settings.ts | 1 - Extension/src/LanguageServer/settingsPanel.ts | 7 --- Extension/src/nativeStrings.json | 46 ++++++++++++++++++- Extension/ui/settings.ts | 2 - 8 files changed, 60 insertions(+), 33 deletions(-) rename Extension/{ => bin}/cpp.hint (100%) diff --git a/Extension/cpp.hint b/Extension/bin/cpp.hint similarity index 100% rename from Extension/cpp.hint rename to Extension/bin/cpp.hint diff --git a/Extension/c_cpp_properties.schema.json b/Extension/c_cpp_properties.schema.json index 1760634e9..999706ffe 100644 --- a/Extension/c_cpp_properties.schema.json +++ b/Extension/c_cpp_properties.schema.json @@ -213,17 +213,6 @@ "recursiveIncludes": { "type": "object", "properties": { - "reduce": { - "markdownDescription": "Set to `always` to always reduce the number of recursive include paths provided to IntelliSense to only those paths currently referenced by #include statements. This requires first parsing files to determine which headers are included. Set to `never` to provide all recursive include paths to IntelliSense. Reducing the number of recursive include paths may improve IntelliSense performance when a very large number of recursive include paths are involved. Not reducing the number of recursive include paths can improve IntelliSense performance by avoiding the need to parse files to determine which include paths to provide. The `default` value is currently to reduce the number of recursive include paths provided to IntelliSense.", - "descriptionHint": "Markdown text between `` should not be translated or localized (they represent literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered.", - "type": "string", - "enum": [ - "always", - "never", - "default", - "${default}" - ] - }, "priority": { "markdownDescription": "The priority of recursive include paths. If set to `beforeSystemIncludes`, the recursive include paths will be searched before system include paths. If set to `afterSystemIncludes`, the recursive include paths will be searched after system include paths. `beforeSystemIncludes` would more closely reflect the search order of a compiler, while `afterSystemIncludes` may result in improved performance.", "descriptionHint": "Markdown text between `` should not be translated or localized (they represent literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered.", diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 9fd268013..04f153b22 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -1746,6 +1746,21 @@ export class DefaultClient implements Client { // TODO: should I set the output channel? Does this sort output between servers? }; + // Reset all UI state to default, in case this is a restart after a crash. + this.model.isIndexingWorkspace.Value = false; + this.model.isParsingWorkspace.Value = false; + this.model.isParsingWorkspacePaused.Value = false; + this.model.isParsingFiles.Value = false; + this.model.isUpdatingIntelliSense.Value = false; + this.model.isRunningCodeAnalysis.Value = false; + this.model.isCodeAnalysisPaused.Value = false; + this.model.codeAnalysisProcessed.Value = 0; + this.model.codeAnalysisTotal.Value = 0; + this.model.parsingWorkspaceStatus.Value = ""; + + // Refresh initializing state in UI. + this.model.isInitializingWorkspace.Value = true; + // Create the language client languageClient = new LanguageClient(`cpptools`, serverOptions, clientOptions); languageClient.onNotification(DebugProtocolNotification, logDebugProtocol); diff --git a/Extension/src/LanguageServer/configurations.ts b/Extension/src/LanguageServer/configurations.ts index ce2fd780a..b4686505c 100644 --- a/Extension/src/LanguageServer/configurations.ts +++ b/Extension/src/LanguageServer/configurations.ts @@ -88,7 +88,6 @@ export interface Configuration { browse?: Browse; recursiveIncludes?: RecursiveIncludes; customConfigurationVariables?: { [key: string]: string }; - recursiveIncludesReduceIsExplicit?: boolean; recursiveIncludesPriorityIsExplicit?: boolean; recursiveIncludesOrderIsExplicit?: boolean; } @@ -978,8 +977,6 @@ export class CppProperties { if (!configuration.recursiveIncludes) { configuration.recursiveIncludes = {}; } - configuration.recursiveIncludes.reduce = this.updateConfigurationString(configuration.recursiveIncludes.reduce, settings.defaultRecursiveIncludesReduce); - configuration.recursiveIncludesReduceIsExplicit = configuration.recursiveIncludesReduceIsExplicit || settings.defaultRecursiveIncludesReduce !== ""; configuration.recursiveIncludes.priority = this.updateConfigurationString(configuration.recursiveIncludes.priority, settings.defaultRecursiveIncludesPriority); configuration.recursiveIncludesPriorityIsExplicit = configuration.recursiveIncludesPriorityIsExplicit || settings.defaultRecursiveIncludesPriority !== ""; configuration.recursiveIncludes.order = this.updateConfigurationString(configuration.recursiveIncludes.order, settings.defaultRecursiveIncludesOrder); @@ -1560,7 +1557,6 @@ export class CppProperties { || (this.configurationJson.configurations[i].cStandardIsExplicit !== undefined) || (this.configurationJson.configurations[i].cppStandardIsExplicit !== undefined) || (this.configurationJson.configurations[i].intelliSenseModeIsExplicit !== undefined) - || (this.configurationJson.configurations[i].recursiveIncludesReduceIsExplicit !== undefined) || (this.configurationJson.configurations[i].recursiveIncludesPriorityIsExplicit !== undefined) || (this.configurationJson.configurations[i].recursiveIncludesOrderIsExplicit !== undefined)) { dirty = true; @@ -1583,7 +1579,6 @@ export class CppProperties { e.cStandardIsExplicit = e.cStandard !== undefined; e.cppStandardIsExplicit = e.cppStandard !== undefined; e.intelliSenseModeIsExplicit = e.intelliSenseMode !== undefined; - e.recursiveIncludesReduceIsExplicit = e.recursiveIncludes?.reduce !== undefined; e.recursiveIncludesPriorityIsExplicit = e.recursiveIncludes?.priority !== undefined; e.recursiveIncludesOrderIsExplicit = e.recursiveIncludes?.order !== undefined; }); @@ -2408,7 +2403,6 @@ export class CppProperties { const savedCStandardIsExplicit: boolean[] = []; const savedCppStandardIsExplicit: boolean[] = []; const savedIntelliSenseModeIsExplicit: boolean[] = []; - const savedRecursiveIncludesReduceIsExplicit: boolean[] = []; const savedRecursiveIncludesPriorityIsExplicit: boolean[] = []; const savedRecursiveIncludesOrderIsExplicit: boolean[] = []; @@ -2430,10 +2424,6 @@ export class CppProperties { if (e.intelliSenseModeIsExplicit !== undefined) { delete e.intelliSenseModeIsExplicit; } - savedRecursiveIncludesReduceIsExplicit.push(!!e.recursiveIncludesReduceIsExplicit); - if (e.recursiveIncludesReduceIsExplicit !== undefined) { - delete e.recursiveIncludesReduceIsExplicit; - } savedRecursiveIncludesPriorityIsExplicit.push(!!e.recursiveIncludesPriorityIsExplicit); if (e.recursiveIncludesPriorityIsExplicit !== undefined) { delete e.recursiveIncludesPriorityIsExplicit; @@ -2456,7 +2446,6 @@ export class CppProperties { this.configurationJson.configurations[i].cStandardIsExplicit = savedCStandardIsExplicit[i]; this.configurationJson.configurations[i].cppStandardIsExplicit = savedCppStandardIsExplicit[i]; this.configurationJson.configurations[i].intelliSenseModeIsExplicit = savedIntelliSenseModeIsExplicit[i]; - this.configurationJson.configurations[i].recursiveIncludesReduceIsExplicit = savedRecursiveIncludesReduceIsExplicit[i]; this.configurationJson.configurations[i].recursiveIncludesPriorityIsExplicit = savedRecursiveIncludesPriorityIsExplicit[i]; this.configurationJson.configurations[i].recursiveIncludesOrderIsExplicit = savedRecursiveIncludesOrderIsExplicit[i]; } diff --git a/Extension/src/LanguageServer/settings.ts b/Extension/src/LanguageServer/settings.ts index 881423789..3912012e3 100644 --- a/Extension/src/LanguageServer/settings.ts +++ b/Extension/src/LanguageServer/settings.ts @@ -452,7 +452,6 @@ export class CppSettings extends Settings { public get defaultBrowsePath(): string[] | undefined { return this.getArrayOfStringsWithUndefinedDefault("default.browse.path"); } public get defaultDatabaseFilename(): string | undefined { return changeBlankStringToUndefined(this.getAsStringOrUndefined("default.browse.databaseFilename")); } public get defaultLimitSymbolsToIncludedHeaders(): boolean { return this.getAsBoolean("default.browse.limitSymbolsToIncludedHeaders"); } - public get defaultRecursiveIncludesReduce(): string | undefined { return this.getAsStringOrUndefined("default.recursiveIncludes.reduce"); } public get defaultRecursiveIncludesPriority(): string | undefined { return this.getAsStringOrUndefined("default.recursiveIncludes.priority"); } public get defaultRecursiveIncludesOrder(): string | undefined { return this.getAsStringOrUndefined("default.recursiveIncludes.order"); } public get defaultSystemIncludePath(): string[] | undefined { return this.getArrayOfStringsWithUndefinedDefault("default.systemIncludePath"); } diff --git a/Extension/src/LanguageServer/settingsPanel.ts b/Extension/src/LanguageServer/settingsPanel.ts index 00105925b..efaafc987 100644 --- a/Extension/src/LanguageServer/settingsPanel.ts +++ b/Extension/src/LanguageServer/settingsPanel.ts @@ -52,7 +52,6 @@ const elementId: { [key: string]: string } = { mergeConfigurations: "mergeConfigurations", configurationProvider: "configurationProvider", forcedInclude: "forcedInclude", - recursiveIncludesReduce: "recursiveIncludes.reduce", recursiveIncludesPriority: "recursiveIncludes.priority", recursiveIncludesOrder: "recursiveIncludes.order", @@ -355,12 +354,6 @@ export class SettingsPanel { case elementId.forcedInclude: this.configValues.forcedInclude = splitEntries(message.value); break; - case elementId.recursiveIncludesReduce: - if (!this.configValues.recursiveIncludes) { - this.configValues.recursiveIncludes = {}; - } - this.configValues.recursiveIncludes.reduce = message.value; - break; case elementId.recursiveIncludesPriority: if (!this.configValues.recursiveIncludes) { this.configValues.recursiveIncludes = {}; diff --git a/Extension/src/nativeStrings.json b/Extension/src/nativeStrings.json index 75306f325..3c8555ad7 100644 --- a/Extension/src/nativeStrings.json +++ b/Extension/src/nativeStrings.json @@ -485,5 +485,49 @@ "license_terms": { "text": "The C/C++ extension may be used only with Microsoft Visual Studio, Visual Studio for Mac, Visual Studio Code, Azure DevOps, Team Foundation Server, and successor Microsoft products and services to develop and test your applications.", "hint": "{Locked=\"C/C++\"} {Locked=\"Visual Studio\"} {Locked=\"Mac\"} {Locked=\"Visual Studio Code\"} {Locked=\"Azure DevOps\"} {Locked=\"Team Foundation Server\"}" - } + }, + "status_initializing": "Initializing", + "status_initializing_with_n_of_m": "Initializing ({0} of {1})", + "status_initializing_with_n_of_m_and_text": "Initializing ({0} of {1}): {2}", + "status_initializing_with_text": "Initializing {0}", + "status_initializing_projects": "Initializing projects", + "status_initializing_projects_with_n_of_m": "Initializing projects ({0} of {1})", + "status_initializing_projects_with_n_of_m_and_text": "Initializing projects ({0} of {1}): {2}", + "status_initializing_projects_with_text": "Initializing projects {0}", + "status_checking_for_outdated_files": "Checking for out of date files", + "status_checking_for_outdated_files_with_n_of_m": "Checking for out of date files ({0} of {1})", + "status_checking_for_outdated_files_with_n_of_m_and_text": "Checking for out of date files ({0} of {1}): {2}", + "status_checking_for_outdated_files_with_text": "Checking for out of date files {0}", + "status_parsing_files": "Parsing files", + "status_parsing_files_with_n_of_m": "Parsing files ({0} of {1})", + "status_parsing_files_with_n_of_m_and_text": "Parsing files ({0} of {1}): {2}", + "status_parsing_files_with_text": "Parsing files {0}", + "status_parsing_includes": "Parsing included files", + "status_parsing_includes_with_n_of_m": "Parsing included files ({0} of {1})", + "status_parsing_includes_with_n_of_m_and_text": "Parsing included files ({0} of {1}): {2}", + "status_parsing_includes_with_text": "Parsing included files {0}", + "status_scanning_includes": "Scanning #includes for more files", + "status_scanning_includes_with_n_of_m": "Scanning #includes for more files ({0} of {1})", + "status_scanning_includes_with_n_of_m_and_text": "Scanning #includes for more files ({0} of {1}): {2}", + "status_scanning_includes_with_text": "Scanning #includes for more files {0} {1}", + "status_updating_external_dependencies": "Ready (Updating external dependencies)", + "status_updating_external_dependencies_with_n_of_m": "Ready (Updating external dependencies) ({0} of {1})", + "status_updating_external_dependencies_with_n_of_m_and_text": "Ready (Updating external dependencies) ({0} of {1}): {2}", + "status_updating_external_dependencies_with_text": "Ready (Updating external dependencies) {0}", + "status_optimizing_database": "Ready (Optimizing database)", + "status_optimizing_database_with_n_of_m": "Ready (Optimizing database) ({0} of {1})", + "status_optimizing_database_with_n_of_m_and_text": "Ready (Optimizing database) ({0} of {1}): {2}", + "status_optimizing_database_with_text": "Ready (Optimizing database) {0}", + "status_creating_indexes": "Creating Indexes", + "status_creating_indexes_with_n_of_m": "Creating Indexes ({0} of {1})", + "status_creating_indexes_with_n_of_m_and_text": "Creating Indexes ({0} of {1}): {2}", + "status_creating_indexes_with_text": "Creating Indexes {0}", + "status_evaluating_file": "Evaluating", + "status_evaluating_file_with_n_of_m": "Evaluating ({0} of {1})", + "status_evaluating_file_with_n_of_m_and_text": "Evaluating ({0} of {1}): {2}", + "status_evaluating_file_with_text": "Evaluating {0}", + "status_indexing_files": "Indexing files", + "status_indexing_files_with_n_of_m": "Indexing files ({0} of {1})", + "status_indexing_files_with_n_of_m_and_text": "Indexing files ({0} of {1}): {2}", + "status_indexing_files_with_text": "Indexing files {0}" } \ No newline at end of file diff --git a/Extension/ui/settings.ts b/Extension/ui/settings.ts index 4223ddf7e..c7ea9a780 100644 --- a/Extension/ui/settings.ts +++ b/Extension/ui/settings.ts @@ -42,7 +42,6 @@ const elementId: { [key: string]: string } = { mergeConfigurations: "mergeConfigurations", dotConfig: "dotConfig", dotConfigInvalid: "dotConfigInvalid", - recursiveIncludesReduce: "recursiveIncludes.reduce", recursiveIncludesPriority: "recursiveIncludes.priority", recursiveIncludesOrder: "recursiveIncludes.order", @@ -304,7 +303,6 @@ class SettingsApp { (document.getElementById(elementId.forcedInclude)).value = joinEntries(config.forcedInclude); (document.getElementById(elementId.dotConfig)).value = config.dotConfig ?? ""; if (config.recursiveIncludes) { - (document.getElementById(elementId.recursiveIncludesReduce)).value = config.recursiveIncludes.reduce ?? "${default}"; (document.getElementById(elementId.recursiveIncludesPriority)).value = config.recursiveIncludes.priority ?? "${default}"; (document.getElementById(elementId.recursiveIncludesOrder)).value = config.recursiveIncludes.order ?? "${default}"; } From ad67f3bcafcf0afa6adf9875d09462b05769888d Mon Sep 17 00:00:00 2001 From: Colen Garoutte-Carson Date: Fri, 1 May 2026 15:18:57 -0700 Subject: [PATCH 2/2] Make ChangeCppProperties a notification, add -srv2 process name --- Extension/src/LanguageServer/client.ts | 4 ++-- Extension/src/main.ts | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index f72af4e5d..b6c00ab44 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -625,12 +625,12 @@ const CreateDeclarationOrDefinitionRequest: RequestType = new RequestType('cpptools/extractToFunction'); const GoToDirectiveInGroupRequest: RequestType = new RequestType('cpptools/goToDirectiveInGroup'); const GenerateDoxygenCommentRequest: RequestType = new RequestType('cpptools/generateDoxygenComment'); -const ChangeCppPropertiesRequest: RequestType = new RequestType('cpptools/didChangeCppProperties'); const IncludesRequest: RequestType = new RequestType('cpptools/getIncludes'); const CppContextRequest: RequestType = new RequestType('cpptools/getChatContext'); const CopilotCompletionContextRequest: RequestType = new RequestType('cpptools/getCompletionContext'); // Notifications to the server +const ChangeCppPropertiesNotification: NotificationType = new NotificationType('cpptools/didChangeCppProperties'); const DidOpenNotification: NotificationType = new NotificationType('textDocument/didOpen'); const FileCreatedNotification: NotificationType = new NotificationType('cpptools/fileCreated'); const FileChangedNotification: NotificationType = new NotificationType('cpptools/fileChanged'); @@ -3306,7 +3306,7 @@ export class DefaultClient implements Client { params.configurations.push(modifiedConfig); }); - await this.languageClient.sendRequest(ChangeCppPropertiesRequest, params); + await this.languageClient.sendNotification(ChangeCppPropertiesNotification, params); if (!!this.lastCustomBrowseConfigurationProviderId && !!this.lastCustomBrowseConfiguration && !!this.lastCustomBrowseConfigurationProviderVersion) { if (!this.doneInitialCustomBrowseConfigurationCheck) { // Send the last custom browse configuration we received from this provider. diff --git a/Extension/src/main.ts b/Extension/src/main.ts index fed7e019f..45c1ef903 100644 --- a/Extension/src/main.ts +++ b/Extension/src/main.ts @@ -191,6 +191,7 @@ async function makeBinariesExecutable(): Promise { const commonBinaries: string[] = [ "./bin/cpptools", "./bin/cpptools-srv", + "./bin/cpptools-srv2", "./bin/cpptools-wordexp", "./LLVM/bin/clang-format", "./LLVM/bin/clang-tidy",