diff mbox series

[05/20] devtool: ide-sdk: configure Rust Analyzer for Cargo

Message ID 20261026-devtool-ide-sdk-cargo-v1-5-d4504e124d07@savoirfairelinux.com
State New
Headers show
Series devtool: ide-sdk: add support for Rust recipes | expand

Commit Message

Enguerrand de Ribaucourt Oct. 26, 2026, 8:55 a.m. UTC
Point Rust Analyzer at the generated Cargo config and target, while keeping
its process environment limited to the recipe PATH. Verify the workspace
config path and target in the Cargo selftest.

AI-Generated: Uses GitHub Copilot
Signed-off-by: Enguerrand de Ribaucourt <enguerrand.de-ribaucourt@savoirfairelinux.com>
---
 meta/lib/oeqa/selftest/cases/devtool.py     | 12 +++++++++++-
 scripts/lib/devtool/ide_plugins/ide_code.py | 11 +++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/meta/lib/oeqa/selftest/cases/devtool.py b/meta/lib/oeqa/selftest/cases/devtool.py
index 941f54e36b..d1e15d0180 100644
--- a/meta/lib/oeqa/selftest/cases/devtool.py
+++ b/meta/lib/oeqa/selftest/cases/devtool.py
@@ -4341,7 +4341,7 @@  class DevtoolIdeSdkGccTests(DevtoolIdeSdkTests):
 
 class DevtoolIdeSdkRustTests(DevtoolIdeSdkTests):
 
-    def test_code_cargo_rust_analyzer_recommendation(self):
+    def test_code_cargo_rust_analyzer_configuration(self):
         recipe_name = "cargo-example"
         self._check_workspace()
         self._write_bb_config()
@@ -4349,8 +4349,18 @@  class DevtoolIdeSdkRustTests(DevtoolIdeSdkTests):
         runCmd('devtool ide-sdk %s oe-selftest-image --ide=code' % recipe_name,
                output_log=self._cmd_logger)
 
+        with open(os.path.join(tempdir, '.vscode', 'settings.json')) as settings_file:
+            settings = json.load(settings_file)
         with open(os.path.join(tempdir, '.vscode', 'extensions.json')) as extensions_file:
             extensions = json.load(extensions_file)
+        cargo_config = os.path.join(
+            self.workspacedir, 'ide-sdk', recipe_name, 'cargo-config.toml')
+        self.assertExists(cargo_config, 'Cargo config was not generated')
+        self.assertEqual(settings['rust-analyzer.cargo.configPath'], cargo_config)
+        self.assertEqual(
+            settings['rust-analyzer.cargo.target'],
+            get_bb_var('RUST_HOST_SYS', recipe_name))
+        self.assertNotIn('rust-analyzer.cargo.extraEnv', settings)
         self.assertIn('rust-lang.rust-analyzer', extensions['recommendations'])
 
 class DevtoolIdeSdkKernelTests(DevtoolIdeSdkTests):
diff --git a/scripts/lib/devtool/ide_plugins/ide_code.py b/scripts/lib/devtool/ide_plugins/ide_code.py
index cf7f81293c..85f286335f 100644
--- a/scripts/lib/devtool/ide_plugins/ide_code.py
+++ b/scripts/lib/devtool/ide_plugins/ide_code.py
@@ -228,6 +228,16 @@  class IdeVSCode(IdeBase):
             }
         ]
 
+    def __vscode_settings_cargo(self, settings_dict, modified_recipe):
+        if modified_recipe.build_tool is not BuildTool.CARGO:
+            return
+        cargo_config = modified_recipe.update_cargo_config()
+        settings_dict["rust-analyzer.server.extraEnv"] = {
+            "PATH": modified_recipe.path
+        }
+        settings_dict["rust-analyzer.cargo.target"] = modified_recipe.cargo_target
+        settings_dict["rust-analyzer.cargo.configPath"] = cargo_config
+
     def __vscode_settings_clangd(self, settings_dict, modified_recipe):
         if not (modified_recipe.ide_sdk_intellisense == 'clangd' and modified_recipe.build_tool.is_c_cpp):
             return
@@ -294,6 +304,7 @@  class IdeVSCode(IdeBase):
         self.__vscode_settings_cmake(settings_dict, modified_recipe)
         self.__vscode_settings_meson(settings_dict, modified_recipe)
         self.__vscode_settings_kernel_module(settings_dict, modified_recipe)
+        self.__vscode_settings_cargo(settings_dict, modified_recipe)
         self.__vscode_settings_clangd(settings_dict, modified_recipe)
         self.__vscode_settings_format(settings_dict, modified_recipe)