Skip to content

Commit

Permalink
Add config setting which allows adding additional include paths to th…
Browse files Browse the repository at this point in the history
…e VFS.
  • Loading branch information
PrototypeNM1 committed Jan 8, 2025
1 parent 91fc0a2 commit 50aa72e
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 3 deletions.
2 changes: 2 additions & 0 deletions crates/project-model/src/cargo_workspace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ pub struct CargoConfig {
pub sysroot_src: Option<AbsPathBuf>,
/// rustc private crate source
pub rustc_source: Option<RustLibSource>,
/// Extra includes to add to the VFS.
pub extra_includes: Vec<AbsPathBuf>,
pub cfg_overrides: CfgOverrides,
/// Invoke `cargo check` through the RUSTC_WRAPPER.
pub wrap_rustc_in_build_scripts: bool,
Expand Down
32 changes: 29 additions & 3 deletions crates/project-model/src/workspace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ pub struct ProjectWorkspace {
pub target_layout: TargetLayoutLoadResult,
/// A set of cfg overrides for this workspace.
pub cfg_overrides: CfgOverrides,
/// Additional includes to add for the VFS.
pub extra_includes: Vec<AbsPathBuf>,
}

#[derive(Clone)]
Expand Down Expand Up @@ -104,7 +106,15 @@ pub enum ProjectWorkspaceKind {
impl fmt::Debug for ProjectWorkspace {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
// Make sure this isn't too verbose.
let Self { kind, sysroot, rustc_cfg, toolchain, target_layout, cfg_overrides } = self;
let Self {
kind,
sysroot,
rustc_cfg,
toolchain,
target_layout,
cfg_overrides,
extra_includes,
} = self;
match kind {
ProjectWorkspaceKind::Cargo { cargo, error: _, build_scripts, rustc, set_test } => f
.debug_struct("Cargo")
Expand All @@ -117,6 +127,7 @@ impl fmt::Debug for ProjectWorkspace {
)
.field("n_rustc_cfg", &rustc_cfg.len())
.field("n_cfg_overrides", &cfg_overrides.len())
.field("n_extra_includes", &extra_includes.len())
.field("toolchain", &toolchain)
.field("data_layout", &target_layout)
.field("set_test", set_test)
Expand All @@ -130,7 +141,8 @@ impl fmt::Debug for ProjectWorkspace {
.field("n_rustc_cfg", &rustc_cfg.len())
.field("toolchain", &toolchain)
.field("data_layout", &target_layout)
.field("n_cfg_overrides", &cfg_overrides.len());
.field("n_cfg_overrides", &cfg_overrides.len())
.field("n_extra_includes", &extra_includes.len());

debug_struct.finish()
}
Expand All @@ -144,6 +156,7 @@ impl fmt::Debug for ProjectWorkspace {
.field("toolchain", &toolchain)
.field("data_layout", &target_layout)
.field("n_cfg_overrides", &cfg_overrides.len())
.field("n_extra_includes", &extra_includes.len())
.field("set_test", set_test)
.finish(),
}
Expand Down Expand Up @@ -320,6 +333,7 @@ impl ProjectWorkspace {
cfg_overrides,
toolchain,
target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
extra_includes: config.extra_includes.clone(),
})
}

Expand All @@ -340,6 +354,7 @@ impl ProjectWorkspace {
toolchain,
target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
cfg_overrides: config.cfg_overrides.clone(),
extra_includes: config.extra_includes.clone(),
}
}

Expand Down Expand Up @@ -399,6 +414,7 @@ impl ProjectWorkspace {
toolchain,
target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
cfg_overrides: config.cfg_overrides.clone(),
extra_includes: config.extra_includes.clone(),
})
}

Expand Down Expand Up @@ -565,7 +581,13 @@ impl ProjectWorkspace {

PackageRoot {
is_local: krate.is_workspace_member,
include: krate.include.iter().cloned().chain(build_file).collect(),
include: krate
.include
.iter()
.cloned()
.chain(build_file)
.chain(self.extra_includes.iter().cloned())
.collect(),
exclude: krate.exclude.clone(),
}
})
Expand Down Expand Up @@ -603,6 +625,8 @@ impl ProjectWorkspace {

let mut exclude = vec![pkg_root.join(".git")];
if is_local {
include.extend(self.extra_includes.iter().cloned());

exclude.push(pkg_root.join("target"));
} else {
exclude.push(pkg_root.join("tests"));
Expand Down Expand Up @@ -661,6 +685,8 @@ impl ProjectWorkspace {

let mut exclude = vec![pkg_root.join(".git")];
if is_local {
include.extend(self.extra_includes.iter().cloned());

exclude.push(pkg_root.join("target"));
} else {
exclude.push(pkg_root.join("tests"));
Expand Down
1 change: 1 addition & 0 deletions crates/rust-analyzer/src/cli/rustc_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ impl Tester {
toolchain: None,
target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
cfg_overrides: Default::default(),
extra_includes: vec![],
};
let load_cargo_config = LoadCargoConfig {
load_out_dirs_from_check: false,
Expand Down
13 changes: 13 additions & 0 deletions crates/rust-analyzer/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -715,6 +715,11 @@ config_data! {
/// This option does not take effect until rust-analyzer is restarted.
rustc_source: Option<String> = None,

/// Additional paths to include in the VFS. Generally for code that is
/// generated or otherwise managed by a build system outside of Cargo,
/// though Cargo might be the eventual consumer.
vfs_extraIncludes: Vec<String> = vec![],

/// Additional arguments to `rustfmt`.
rustfmt_extraArgs: Vec<String> = vec![],
/// Advanced option, fully override the command rust-analyzer uses for
Expand Down Expand Up @@ -1926,6 +1931,13 @@ impl Config {
});
let sysroot_src =
self.cargo_sysrootSrc(source_root).as_ref().map(|sysroot| self.root_path.join(sysroot));
let extra_includes = self
.vfs_extraIncludes(source_root)
.iter()
.map(String::as_str)
.map(AbsPathBuf::try_from)
.filter_map(Result::ok)
.collect();

CargoConfig {
all_targets: *self.cargo_allTargets(source_root),
Expand All @@ -1940,6 +1952,7 @@ impl Config {
sysroot,
sysroot_src,
rustc_source,
extra_includes,
cfg_overrides: project_model::CfgOverrides {
global: CfgDiff::new(
self.cargo_cfgs(source_root)
Expand Down

0 comments on commit 50aa72e

Please sign in to comment.