From 03591b42be39521116510b0fac5272790f79d1aa Mon Sep 17 00:00:00 2001 From: Bruno-Pier <50412835+BrunoB81HK@users.noreply.github.com> Date: Sat, 27 Apr 2024 00:19:12 -0400 Subject: [PATCH] Fix the c_cpp_properties configuration overwrite issue (#818) (#1287) Co-authored-by: Bruno-Pier Busque Co-authored-by: Lou Amadio --- src/ros/build-env-utils.ts | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/ros/build-env-utils.ts b/src/ros/build-env-utils.ts index 9b9f7ed8..78d16f65 100644 --- a/src/ros/build-env-utils.ts +++ b/src/ros/build-env-utils.ts @@ -77,11 +77,34 @@ async function updateCppPropertiesInternal(): Promise { version: 4, }; + const filename = path.join(vscode.workspace.rootPath, ".vscode", "c_cpp_properties.json"); + if (process.platform === "linux") { + // set the default configurations. cppProperties.configurations[0].intelliSenseMode = "gcc-" + process.arch cppProperties.configurations[0].compilerPath = "/usr/bin/gcc" cppProperties.configurations[0].cStandard = "gnu11" cppProperties.configurations[0].cppStandard = "c++14" + + // read the existing file + try { + let existing: any = JSON.parse(await pfs + .readFile(filename) + .then(buffer => buffer.toString())); + + // if the existing configurations are different from the defaults, use the existing values + if (existing.configurations && existing.configurations.length > 0) { + const existingConfig = existing.configurations[0]; + + cppProperties.configurations[0].intelliSenseMode = existingConfig.intelliSenseMode || cppProperties.configurations[0].intelliSenseMode; + cppProperties.configurations[0].compilerPath = existingConfig.compilerPath || cppProperties.configurations[0].compilerPath; + cppProperties.configurations[0].cStandard = existingConfig.cStandard || cppProperties.configurations[0].cStandard; + cppProperties.configurations[0].cppStandard = existingConfig.cppStandard || cppProperties.configurations[0].cppStandard; + } + } + catch (error) { + // ignore + } } // Ensure the ".vscode" directory exists then update the C++ path. @@ -91,7 +114,6 @@ async function updateCppPropertiesInternal(): Promise { await pfs.mkdir(dir); } - const filename = path.join(vscode.workspace.rootPath, ".vscode", "c_cpp_properties.json"); await pfs.writeFile(filename, JSON.stringify(cppProperties, undefined, 2)); } @@ -114,5 +136,5 @@ function updatePythonAutoCompletePathInternal() { * Updates the python analysis path to support ROS. */ function updatePythonAnalysisPathInternal() { - vscode.workspace.getConfiguration().update(PYTHON_ANALYSIS_PATHS, extension.env.PYTHONPATH.split(path.delimiter)); + vscode.workspace.getConfiguration().update(PYTHON_ANALYSIS_PATHS, extension.env.PYTHONPATH.split(path.delimiter)); }