Cleanup workspace loading a tiny bit
This commit is contained in:
parent
aeda30e301
commit
4dfda64b39
@ -65,6 +65,10 @@ pub struct CargoConfig {
|
||||
/// rustc target
|
||||
pub target: Option<String>,
|
||||
|
||||
/// Don't load sysroot crates (`std`, `core` & friends). Might be useful
|
||||
/// when debugging isolated issues.
|
||||
pub no_sysroot: bool,
|
||||
|
||||
/// rustc private crate source
|
||||
pub rustc_source: Option<AbsPathBuf>,
|
||||
}
|
||||
@ -140,27 +144,27 @@ pub fn root(&self) -> &AbsPath {
|
||||
impl CargoWorkspace {
|
||||
pub fn from_cargo_metadata(
|
||||
cargo_toml: &AbsPath,
|
||||
cargo_features: &CargoConfig,
|
||||
config: &CargoConfig,
|
||||
) -> Result<CargoWorkspace> {
|
||||
let mut meta = MetadataCommand::new();
|
||||
meta.cargo_path(toolchain::cargo());
|
||||
meta.manifest_path(cargo_toml.to_path_buf());
|
||||
if cargo_features.all_features {
|
||||
if config.all_features {
|
||||
meta.features(CargoOpt::AllFeatures);
|
||||
} else {
|
||||
if cargo_features.no_default_features {
|
||||
if config.no_default_features {
|
||||
// FIXME: `NoDefaultFeatures` is mutual exclusive with `SomeFeatures`
|
||||
// https://github.com/oli-obk/cargo_metadata/issues/79
|
||||
meta.features(CargoOpt::NoDefaultFeatures);
|
||||
}
|
||||
if !cargo_features.features.is_empty() {
|
||||
meta.features(CargoOpt::SomeFeatures(cargo_features.features.clone()));
|
||||
if !config.features.is_empty() {
|
||||
meta.features(CargoOpt::SomeFeatures(config.features.clone()));
|
||||
}
|
||||
}
|
||||
if let Some(parent) = cargo_toml.parent() {
|
||||
meta.current_dir(parent.to_path_buf());
|
||||
}
|
||||
if let Some(target) = cargo_features.target.as_ref() {
|
||||
if let Some(target) = config.target.as_ref() {
|
||||
meta.other_options(vec![String::from("--filter-platform"), target.clone()]);
|
||||
}
|
||||
let mut meta = meta.exec().with_context(|| {
|
||||
@ -170,8 +174,8 @@ pub fn from_cargo_metadata(
|
||||
let mut out_dir_by_id = FxHashMap::default();
|
||||
let mut cfgs = FxHashMap::default();
|
||||
let mut proc_macro_dylib_paths = FxHashMap::default();
|
||||
if cargo_features.load_out_dirs_from_check {
|
||||
let resources = load_extern_resources(cargo_toml, cargo_features)?;
|
||||
if config.load_out_dirs_from_check {
|
||||
let resources = load_extern_resources(cargo_toml, config)?;
|
||||
out_dir_by_id = resources.out_dirs;
|
||||
cfgs = resources.cfgs;
|
||||
proc_macro_dylib_paths = resources.proc_dylib_paths;
|
||||
|
@ -1,3 +1,7 @@
|
||||
//! Handles lowering of build-system specific workspace information (`cargo
|
||||
//! metadata` or `rust-project.json`) into representation stored in the salsa
|
||||
//! database -- `CrateGraph`.
|
||||
|
||||
use std::{fmt, fs, path::Component, process::Command};
|
||||
|
||||
use anyhow::{Context, Result};
|
||||
@ -56,11 +60,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
}
|
||||
|
||||
impl ProjectWorkspace {
|
||||
pub fn load(
|
||||
manifest: ProjectManifest,
|
||||
cargo_config: &CargoConfig,
|
||||
with_sysroot: bool,
|
||||
) -> Result<ProjectWorkspace> {
|
||||
pub fn load(manifest: ProjectManifest, config: &CargoConfig) -> Result<ProjectWorkspace> {
|
||||
let res = match manifest {
|
||||
ProjectManifest::ProjectJson(project_json) => {
|
||||
let file = fs::read_to_string(&project_json).with_context(|| {
|
||||
@ -84,32 +84,30 @@ pub fn load(
|
||||
cmd
|
||||
})?;
|
||||
|
||||
let cargo = CargoWorkspace::from_cargo_metadata(&cargo_toml, cargo_config)
|
||||
.with_context(|| {
|
||||
let cargo = CargoWorkspace::from_cargo_metadata(&cargo_toml, config).with_context(
|
||||
|| {
|
||||
format!(
|
||||
"Failed to read Cargo metadata from Cargo.toml file {}, {}",
|
||||
cargo_toml.display(),
|
||||
cargo_version
|
||||
)
|
||||
})?;
|
||||
let sysroot = if with_sysroot {
|
||||
},
|
||||
)?;
|
||||
let sysroot = if config.no_sysroot {
|
||||
Sysroot::default()
|
||||
} else {
|
||||
Sysroot::discover(&cargo_toml).with_context(|| {
|
||||
format!(
|
||||
"Failed to find sysroot for Cargo.toml file {}. Is rust-src installed?",
|
||||
cargo_toml.display()
|
||||
)
|
||||
})?
|
||||
} else {
|
||||
Sysroot::default()
|
||||
};
|
||||
|
||||
let rustc = if let Some(rustc_dir) = &cargo_config.rustc_source {
|
||||
Some(
|
||||
CargoWorkspace::from_cargo_metadata(&rustc_dir, cargo_config)
|
||||
.with_context(|| {
|
||||
format!("Failed to read Cargo metadata for Rust sources")
|
||||
})?,
|
||||
)
|
||||
let rustc = if let Some(rustc_dir) = &config.rustc_source {
|
||||
Some(CargoWorkspace::from_cargo_metadata(&rustc_dir, config).with_context(
|
||||
|| format!("Failed to read Cargo metadata for Rust sources"),
|
||||
)?)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
@ -21,7 +21,6 @@ pub fn load_cargo(
|
||||
let ws = ProjectWorkspace::load(
|
||||
root,
|
||||
&CargoConfig { load_out_dirs_from_check, ..Default::default() },
|
||||
true,
|
||||
)?;
|
||||
|
||||
let (sender, receiver) = unbounded();
|
||||
|
@ -49,7 +49,6 @@ pub struct Config {
|
||||
pub hover: HoverConfig,
|
||||
pub semantic_tokens_refresh: bool,
|
||||
|
||||
pub with_sysroot: bool,
|
||||
pub linked_projects: Vec<LinkedProject>,
|
||||
pub root_path: AbsPathBuf,
|
||||
}
|
||||
@ -155,7 +154,6 @@ pub fn new(root_path: AbsPathBuf) -> Self {
|
||||
Config {
|
||||
client_caps: ClientCapsConfig::default(),
|
||||
|
||||
with_sysroot: true,
|
||||
publish_diagnostics: true,
|
||||
diagnostics: DiagnosticsConfig::default(),
|
||||
diagnostics_map: DiagnosticsMapConfig::default(),
|
||||
@ -209,7 +207,6 @@ pub fn update(&mut self, json: serde_json::Value) {
|
||||
|
||||
let data = ConfigData::from_json(json);
|
||||
|
||||
self.with_sysroot = data.withSysroot;
|
||||
self.publish_diagnostics = data.diagnostics_enable;
|
||||
self.diagnostics = DiagnosticsConfig {
|
||||
disable_experimental: !data.diagnostics_enableExperimental,
|
||||
@ -246,6 +243,7 @@ pub fn update(&mut self, json: serde_json::Value) {
|
||||
load_out_dirs_from_check: data.cargo_loadOutDirsFromCheck,
|
||||
target: data.cargo_target.clone(),
|
||||
rustc_source: rustc_source,
|
||||
no_sysroot: data.cargo_noSysroot,
|
||||
};
|
||||
self.runnables = RunnablesConfig {
|
||||
override_cargo: data.runnables_overrideCargo,
|
||||
@ -492,6 +490,7 @@ struct ConfigData {
|
||||
cargo_loadOutDirsFromCheck: bool = false,
|
||||
cargo_noDefaultFeatures: bool = false,
|
||||
cargo_target: Option<String> = None,
|
||||
cargo_noSysroot: bool = false,
|
||||
|
||||
checkOnSave_enable: bool = true,
|
||||
checkOnSave_allFeatures: Option<bool> = None,
|
||||
@ -544,7 +543,6 @@ struct ConfigData {
|
||||
rustfmt_extraArgs: Vec<String> = Vec::new(),
|
||||
rustfmt_overrideCommand: Option<Vec<String>> = None,
|
||||
|
||||
withSysroot: bool = true,
|
||||
rustcSource : Option<String> = None,
|
||||
}
|
||||
}
|
||||
|
@ -96,17 +96,12 @@ pub(crate) fn fetch_workspaces(&mut self) {
|
||||
self.task_pool.handle.spawn({
|
||||
let linked_projects = self.config.linked_projects.clone();
|
||||
let cargo_config = self.config.cargo.clone();
|
||||
let with_sysroot = self.config.with_sysroot.clone();
|
||||
move || {
|
||||
let workspaces = linked_projects
|
||||
.iter()
|
||||
.map(|project| match project {
|
||||
LinkedProject::ProjectManifest(manifest) => {
|
||||
project_model::ProjectWorkspace::load(
|
||||
manifest.clone(),
|
||||
&cargo_config,
|
||||
with_sysroot,
|
||||
)
|
||||
project_model::ProjectWorkspace::load(manifest.clone(), &cargo_config)
|
||||
}
|
||||
LinkedProject::InlineJsonProject(it) => {
|
||||
project_model::ProjectWorkspace::load_inline(it.clone())
|
||||
|
@ -12,7 +12,7 @@
|
||||
notification::Exit, request::Shutdown, TextDocumentIdentifier, Url, WorkDoneProgress,
|
||||
};
|
||||
use lsp_types::{ProgressParams, ProgressParamsValue};
|
||||
use project_model::ProjectManifest;
|
||||
use project_model::{CargoConfig, ProjectManifest};
|
||||
use rust_analyzer::{
|
||||
config::{ClientCapsConfig, Config, FilesConfig, FilesWatcher, LinkedProject},
|
||||
main_loop,
|
||||
@ -47,8 +47,8 @@ pub(crate) fn root(mut self, path: &str) -> Project<'a> {
|
||||
self
|
||||
}
|
||||
|
||||
pub(crate) fn with_sysroot(mut self, sysroot: bool) -> Project<'a> {
|
||||
self.with_sysroot = sysroot;
|
||||
pub(crate) fn with_sysroot(mut self, yes: bool) -> Project<'a> {
|
||||
self.with_sysroot = yes;
|
||||
self
|
||||
}
|
||||
|
||||
@ -90,7 +90,7 @@ pub(crate) fn server(self) -> Server {
|
||||
work_done_progress: true,
|
||||
..Default::default()
|
||||
},
|
||||
with_sysroot: self.with_sysroot,
|
||||
cargo: CargoConfig { no_sysroot: !self.with_sysroot, ..Default::default() },
|
||||
linked_projects,
|
||||
files: FilesConfig { watcher: FilesWatcher::Client, exclude: Vec::new() },
|
||||
..Config::new(tmp_dir_path)
|
||||
|
@ -283,6 +283,11 @@
|
||||
"default": null,
|
||||
"description": "Specify the compilation target"
|
||||
},
|
||||
"rust-analyzer.noSysroot": {
|
||||
"markdownDescription": "Internal config for debugging, disables loading of sysroot crates",
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"rust-analyzer.rustfmt.extraArgs": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
@ -605,11 +610,6 @@
|
||||
},
|
||||
"default": null
|
||||
},
|
||||
"rust-analyzer.withSysroot": {
|
||||
"markdownDescription": "Internal config for debugging, disables loading of sysroot crates",
|
||||
"type": "boolean",
|
||||
"default": true
|
||||
},
|
||||
"rust-analyzer.diagnostics.enable": {
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
|
Loading…
Reference in New Issue
Block a user