Support disabling rustc build scripts

This commit is contained in:
Daniel McNab 2021-03-08 09:05:19 +00:00
parent 877f745551
commit ddce6bb282
10 changed files with 61 additions and 12 deletions

View file

@ -56,6 +56,7 @@ impl fmt::Debug for ProjectWorkspace {
match self { match self {
ProjectWorkspace::Cargo { cargo, sysroot, rustc, rustc_cfg } => f ProjectWorkspace::Cargo { cargo, sysroot, rustc, rustc_cfg } => f
.debug_struct("Cargo") .debug_struct("Cargo")
.field("root", &cargo.workspace_root())
.field("n_packages", &cargo.packages().len()) .field("n_packages", &cargo.packages().len())
.field("n_sysroot_crates", &sysroot.crates().len()) .field("n_sysroot_crates", &sysroot.crates().len())
.field( .field(
@ -273,12 +274,19 @@ impl ProjectWorkspace {
crate_graph crate_graph
} }
pub fn collect_build_data_configs(&self, collector: &mut BuildDataCollector) { pub fn collect_build_data_configs(
&self,
collector: &mut BuildDataCollector,
for_private: bool,
) {
match self { match self {
ProjectWorkspace::Cargo { cargo, rustc, .. } => { ProjectWorkspace::Cargo { cargo, rustc, .. } => {
collector.add_config(&cargo.workspace_root(), cargo.build_data_config().clone()); collector.add_config(&cargo.workspace_root(), cargo.build_data_config().clone());
if for_private {
if let Some(rustc) = rustc { if let Some(rustc) = rustc {
collector.add_config(rustc.workspace_root(), rustc.build_data_config().clone()); collector
.add_config(rustc.workspace_root(), rustc.build_data_config().clone());
}
} }
} }
_ => {} _ => {}

View file

@ -68,6 +68,9 @@ impl BenchCmd {
let load_cargo_config = LoadCargoConfig { let load_cargo_config = LoadCargoConfig {
load_out_dirs_from_check: self.load_output_dirs, load_out_dirs_from_check: self.load_output_dirs,
with_proc_macro: self.with_proc_macro, with_proc_macro: self.with_proc_macro,
// This will currently never have rustcSource set, however if in
// future it does this will handle that case
run_rustc_build_scripts: true,
}; };
let (mut host, vfs, _proc_macro) = let (mut host, vfs, _proc_macro) =
load_workspace_at(&self.path, &cargo_config, &load_cargo_config, &|_| {})?; load_workspace_at(&self.path, &cargo_config, &load_cargo_config, &|_| {})?;

View file

@ -63,6 +63,9 @@ impl AnalysisStatsCmd {
let load_cargo_config = LoadCargoConfig { let load_cargo_config = LoadCargoConfig {
load_out_dirs_from_check: self.load_output_dirs, load_out_dirs_from_check: self.load_output_dirs,
with_proc_macro: self.with_proc_macro, with_proc_macro: self.with_proc_macro,
// This will currently never have rustcSource set, however if in
// future it does this will handle that case
run_rustc_build_scripts: true,
}; };
let (host, vfs, _proc_macro) = let (host, vfs, _proc_macro) =
load_workspace_at(&self.path, &cargo_config, &load_cargo_config, &|_| {})?; load_workspace_at(&self.path, &cargo_config, &load_cargo_config, &|_| {})?;

View file

@ -34,7 +34,13 @@ pub fn diagnostics(
with_proc_macro: bool, with_proc_macro: bool,
) -> Result<()> { ) -> Result<()> {
let cargo_config = Default::default(); let cargo_config = Default::default();
let load_cargo_config = LoadCargoConfig { load_out_dirs_from_check, with_proc_macro }; let load_cargo_config = LoadCargoConfig {
load_out_dirs_from_check,
with_proc_macro,
// This will currently never have rustcSource set, however if in
// future it does this will handle that case
run_rustc_build_scripts: true,
};
let (host, _vfs, _proc_macro) = let (host, _vfs, _proc_macro) =
load_workspace_at(path, &cargo_config, &load_cargo_config, &|_| {})?; load_workspace_at(path, &cargo_config, &load_cargo_config, &|_| {})?;
let db = host.raw_database(); let db = host.raw_database();

View file

@ -14,6 +14,7 @@ use vfs::{loader::Handle, AbsPath, AbsPathBuf};
use crate::reload::{ProjectFolders, SourceRootConfig}; use crate::reload::{ProjectFolders, SourceRootConfig};
pub struct LoadCargoConfig { pub struct LoadCargoConfig {
pub run_rustc_build_scripts: bool,
pub load_out_dirs_from_check: bool, pub load_out_dirs_from_check: bool,
pub with_proc_macro: bool, pub with_proc_macro: bool,
} }
@ -53,7 +54,7 @@ pub fn load_workspace(
let build_data = if config.load_out_dirs_from_check { let build_data = if config.load_out_dirs_from_check {
let mut collector = BuildDataCollector::default(); let mut collector = BuildDataCollector::default();
ws.collect_build_data_configs(&mut collector); ws.collect_build_data_configs(&mut collector, config.run_rustc_build_scripts);
Some(collector.collect(progress)?) Some(collector.collect(progress)?)
} else { } else {
None None
@ -136,8 +137,11 @@ mod tests {
fn test_loading_rust_analyzer() -> Result<()> { fn test_loading_rust_analyzer() -> Result<()> {
let path = Path::new(env!("CARGO_MANIFEST_DIR")).parent().unwrap().parent().unwrap(); let path = Path::new(env!("CARGO_MANIFEST_DIR")).parent().unwrap().parent().unwrap();
let cargo_config = Default::default(); let cargo_config = Default::default();
let load_cargo_config = let load_cargo_config = LoadCargoConfig {
LoadCargoConfig { load_out_dirs_from_check: false, with_proc_macro: false }; load_out_dirs_from_check: false,
with_proc_macro: false,
run_rustc_build_scripts: false,
};
let (host, _vfs, _proc_macro) = let (host, _vfs, _proc_macro) =
load_workspace_at(path, &cargo_config, &load_cargo_config, &|_| {})?; load_workspace_at(path, &cargo_config, &load_cargo_config, &|_| {})?;

View file

@ -9,8 +9,13 @@ use ide_ssr::{MatchFinder, SsrPattern, SsrRule};
pub fn apply_ssr_rules(rules: Vec<SsrRule>) -> Result<()> { pub fn apply_ssr_rules(rules: Vec<SsrRule>) -> Result<()> {
use ide_db::base_db::SourceDatabaseExt; use ide_db::base_db::SourceDatabaseExt;
let cargo_config = Default::default(); let cargo_config = Default::default();
let load_cargo_config = let load_cargo_config = LoadCargoConfig {
LoadCargoConfig { load_out_dirs_from_check: true, with_proc_macro: true }; load_out_dirs_from_check: true,
with_proc_macro: true,
// This will currently never have rustcSource set, however if in
// future it does this will handle that case
run_rustc_build_scripts: true,
};
let (host, vfs, _proc_macro) = let (host, vfs, _proc_macro) =
load_workspace_at(&std::env::current_dir()?, &cargo_config, &load_cargo_config, &|_| {})?; load_workspace_at(&std::env::current_dir()?, &cargo_config, &load_cargo_config, &|_| {})?;
let db = host.raw_database(); let db = host.raw_database();
@ -36,8 +41,13 @@ pub fn search_for_patterns(patterns: Vec<SsrPattern>, debug_snippet: Option<Stri
use ide_db::base_db::SourceDatabaseExt; use ide_db::base_db::SourceDatabaseExt;
use ide_db::symbol_index::SymbolsDatabase; use ide_db::symbol_index::SymbolsDatabase;
let cargo_config = Default::default(); let cargo_config = Default::default();
let load_cargo_config = let load_cargo_config = LoadCargoConfig {
LoadCargoConfig { load_out_dirs_from_check: true, with_proc_macro: true }; load_out_dirs_from_check: true,
with_proc_macro: true,
// This will currently never have rustcSource set, however if in
// future it does this will handle that case
run_rustc_build_scripts: true,
};
let (host, _vfs, _proc_macro) = let (host, _vfs, _proc_macro) =
load_workspace_at(&std::env::current_dir()?, &cargo_config, &load_cargo_config, &|_| {})?; load_workspace_at(&std::env::current_dir()?, &cargo_config, &load_cargo_config, &|_| {})?;
let db = host.raw_database(); let db = host.raw_database();

View file

@ -49,6 +49,8 @@ config_data! {
/// Run build scripts (`build.rs`) for more precise code analysis. /// Run build scripts (`build.rs`) for more precise code analysis.
cargo_runBuildScripts | cargo_runBuildScripts |
cargo_loadOutDirsFromCheck: bool = "false", cargo_loadOutDirsFromCheck: bool = "false",
/// Disable running build scripts (`build.rs`) for the `rustc_private` crates in `rustcSource`.
cargo_disableRustcBuildScripts: bool = "false",
/// Do not activate the `default` feature. /// Do not activate the `default` feature.
cargo_noDefaultFeatures: bool = "false", cargo_noDefaultFeatures: bool = "false",
/// Compilation target (target triple). /// Compilation target (target triple).
@ -482,6 +484,9 @@ impl Config {
pub fn run_build_scripts(&self) -> bool { pub fn run_build_scripts(&self) -> bool {
self.data.cargo_runBuildScripts || self.data.procMacro_enable self.data.cargo_runBuildScripts || self.data.procMacro_enable
} }
pub fn run_rustc_build_scripts(&self) -> bool {
self.run_build_scripts() && !self.data.cargo_disableRustcBuildScripts
}
pub fn cargo(&self) -> CargoConfig { pub fn cargo(&self) -> CargoConfig {
let rustc_source = self.data.rustcSource.as_ref().map(|rustc_src| { let rustc_source = self.data.rustcSource.as_ref().map(|rustc_src| {
if rustc_src == "discover" { if rustc_src == "discover" {

View file

@ -340,7 +340,10 @@ impl GlobalState {
if self.config.run_build_scripts() && workspace_build_data.is_none() { if self.config.run_build_scripts() && workspace_build_data.is_none() {
let mut collector = BuildDataCollector::default(); let mut collector = BuildDataCollector::default();
for ws in &workspaces { for ws in &workspaces {
ws.collect_build_data_configs(&mut collector); ws.collect_build_data_configs(
&mut collector,
self.config.run_rustc_build_scripts(),
);
} }
self.fetch_build_data_request(collector) self.fetch_build_data_request(collector)
} }

View file

@ -12,6 +12,8 @@
List of features to activate. List of features to activate.
[[rust-analyzer.cargo.runBuildScripts]]rust-analyzer.cargo.runBuildScripts (default: `false`):: [[rust-analyzer.cargo.runBuildScripts]]rust-analyzer.cargo.runBuildScripts (default: `false`)::
Run build scripts (`build.rs`) for more precise code analysis. Run build scripts (`build.rs`) for more precise code analysis.
[[rust-analyzer.cargo.disableRustcBuildScripts]]rust-analyzer.cargo.disableRustcBuildScripts (default: `false`)::
Disable running build scripts (`build.rs`) for the `rustc_private` crates in `rustcSource`.
[[rust-analyzer.cargo.noDefaultFeatures]]rust-analyzer.cargo.noDefaultFeatures (default: `false`):: [[rust-analyzer.cargo.noDefaultFeatures]]rust-analyzer.cargo.noDefaultFeatures (default: `false`)::
Do not activate the `default` feature. Do not activate the `default` feature.
[[rust-analyzer.cargo.target]]rust-analyzer.cargo.target (default: `null`):: [[rust-analyzer.cargo.target]]rust-analyzer.cargo.target (default: `null`)::

View file

@ -413,6 +413,11 @@
"default": false, "default": false,
"type": "boolean" "type": "boolean"
}, },
"rust-analyzer.cargo.disableRustcBuildScripts": {
"markdownDescription": "Disable running build scripts (`build.rs`) for the `rustc_private` crates in `rustcSource`.",
"default": false,
"type": "boolean"
},
"rust-analyzer.cargo.noDefaultFeatures": { "rust-analyzer.cargo.noDefaultFeatures": {
"markdownDescription": "Do not activate the `default` feature.", "markdownDescription": "Do not activate the `default` feature.",
"default": false, "default": false,