Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/project-model/src/tests.rs')
-rw-r--r--crates/project-model/src/tests.rs79
1 files changed, 57 insertions, 22 deletions
diff --git a/crates/project-model/src/tests.rs b/crates/project-model/src/tests.rs
index f3cf2d83ea..681bce3a5a 100644
--- a/crates/project-model/src/tests.rs
+++ b/crates/project-model/src/tests.rs
@@ -12,39 +12,44 @@ use span::FileId;
use triomphe::Arc;
use crate::{
- sysroot::SysrootMode, workspace::ProjectWorkspaceKind, CargoWorkspace, CfgOverrides,
- ManifestPath, ProjectJson, ProjectJsonData, ProjectWorkspace, Sysroot, SysrootQueryMetadata,
- WorkspaceBuildScripts,
+ sysroot::SysrootWorkspace, workspace::ProjectWorkspaceKind, CargoWorkspace, CfgOverrides,
+ ManifestPath, ProjectJson, ProjectJsonData, ProjectWorkspace, Sysroot,
+ SysrootSourceWorkspaceConfig, WorkspaceBuildScripts,
};
fn load_cargo(file: &str) -> (CrateGraph, ProcMacroPaths) {
- load_cargo_with_overrides(file, CfgOverrides::default())
+ let project_workspace = load_workspace_from_metadata(file);
+ to_crate_graph(project_workspace, &mut Default::default())
}
fn load_cargo_with_overrides(
file: &str,
cfg_overrides: CfgOverrides,
) -> (CrateGraph, ProcMacroPaths) {
+ let project_workspace =
+ ProjectWorkspace { cfg_overrides, ..load_workspace_from_metadata(file) };
+ to_crate_graph(project_workspace, &mut Default::default())
+}
+
+fn load_workspace_from_metadata(file: &str) -> ProjectWorkspace {
let meta: Metadata = get_test_json_file(file);
let manifest_path =
ManifestPath::try_from(AbsPathBuf::try_from(meta.workspace_root.clone()).unwrap()).unwrap();
- let cargo_workspace = CargoWorkspace::new(meta, manifest_path);
- let project_workspace = ProjectWorkspace {
+ let cargo_workspace = CargoWorkspace::new(meta, manifest_path, Default::default());
+ ProjectWorkspace {
kind: ProjectWorkspaceKind::Cargo {
cargo: cargo_workspace,
build_scripts: WorkspaceBuildScripts::default(),
rustc: Err(None),
- cargo_config_extra_env: Default::default(),
error: None,
set_test: true,
},
- cfg_overrides,
+ cfg_overrides: Default::default(),
sysroot: Sysroot::empty(),
rustc_cfg: Vec::new(),
toolchain: None,
target_layout: Err("target_data_layout not loaded".into()),
- };
- to_crate_graph(project_workspace)
+ }
}
fn load_rust_project(file: &str) -> (CrateGraph, ProcMacroPaths) {
@@ -59,7 +64,7 @@ fn load_rust_project(file: &str) -> (CrateGraph, ProcMacroPaths) {
target_layout: Err(Arc::from("test has no data layout")),
cfg_overrides: Default::default(),
};
- to_crate_graph(project_workspace)
+ to_crate_graph(project_workspace, &mut Default::default())
}
fn get_test_json_file<T: DeserializeOwned>(file: &str) -> T {
@@ -117,7 +122,9 @@ fn get_fake_sysroot() -> Sysroot {
// fake sysroot, so we give them both the same path:
let sysroot_dir = AbsPathBuf::assert(sysroot_path);
let sysroot_src_dir = sysroot_dir.clone();
- Sysroot::load(Some(sysroot_dir), Some(sysroot_src_dir), SysrootQueryMetadata::CargoMetadata)
+ let mut sysroot = Sysroot::new(Some(sysroot_dir), Some(sysroot_src_dir));
+ sysroot.load_workspace(&SysrootSourceWorkspaceConfig::default_cargo());
+ sysroot
}
fn rooted_project_json(data: ProjectJsonData) -> ProjectJson {
@@ -128,13 +135,15 @@ fn rooted_project_json(data: ProjectJsonData) -> ProjectJson {
ProjectJson::new(None, base, data)
}
-fn to_crate_graph(project_workspace: ProjectWorkspace) -> (CrateGraph, ProcMacroPaths) {
+fn to_crate_graph(
+ project_workspace: ProjectWorkspace,
+ file_map: &mut FxHashMap<AbsPathBuf, FileId>,
+) -> (CrateGraph, ProcMacroPaths) {
project_workspace.to_crate_graph(
&mut {
- let mut counter = 0;
- move |_path| {
- counter += 1;
- Some(FileId::from_raw(counter))
+ |path| {
+ let len = file_map.len() + 1;
+ Some(*file_map.entry(path.to_path_buf()).or_insert(FileId::from_raw(len as u32)))
}
},
&Default::default(),
@@ -223,24 +232,50 @@ fn rust_project_is_proc_macro_has_proc_macro_dep() {
}
#[test]
+fn crate_graph_dedup_identical() {
+ let (mut crate_graph, proc_macros) = load_cargo("regex-metadata.json");
+
+ let (d_crate_graph, mut d_proc_macros) = (crate_graph.clone(), proc_macros.clone());
+
+ crate_graph.extend(d_crate_graph.clone(), &mut d_proc_macros);
+ assert!(crate_graph.iter().eq(d_crate_graph.iter()));
+ assert_eq!(proc_macros, d_proc_macros);
+}
+
+#[test]
+fn crate_graph_dedup() {
+ let mut file_map = Default::default();
+
+ let ripgrep_workspace = load_workspace_from_metadata("ripgrep-metadata.json");
+ let (mut crate_graph, _proc_macros) = to_crate_graph(ripgrep_workspace, &mut file_map);
+ assert_eq!(crate_graph.iter().count(), 71);
+
+ let regex_workspace = load_workspace_from_metadata("regex-metadata.json");
+ let (regex_crate_graph, mut regex_proc_macros) = to_crate_graph(regex_workspace, &mut file_map);
+ assert_eq!(regex_crate_graph.iter().count(), 50);
+
+ crate_graph.extend(regex_crate_graph, &mut regex_proc_macros);
+ assert_eq!(crate_graph.iter().count(), 108);
+}
+
+#[test]
fn smoke_test_real_sysroot_cargo() {
let file_map = &mut FxHashMap::<AbsPathBuf, FileId>::default();
let meta: Metadata = get_test_json_file("hello-world-metadata.json");
let manifest_path =
ManifestPath::try_from(AbsPathBuf::try_from(meta.workspace_root.clone()).unwrap()).unwrap();
- let cargo_workspace = CargoWorkspace::new(meta, manifest_path);
- let sysroot = Sysroot::discover(
+ let cargo_workspace = CargoWorkspace::new(meta, manifest_path, Default::default());
+ let mut sysroot = Sysroot::discover(
AbsPath::assert(Utf8Path::new(env!("CARGO_MANIFEST_DIR"))),
&Default::default(),
- SysrootQueryMetadata::CargoMetadata,
);
- assert!(matches!(sysroot.mode(), SysrootMode::Workspace(_)));
+ sysroot.load_workspace(&SysrootSourceWorkspaceConfig::default_cargo());
+ assert!(matches!(sysroot.workspace(), SysrootWorkspace::Workspace(_)));
let project_workspace = ProjectWorkspace {
kind: ProjectWorkspaceKind::Cargo {
cargo: cargo_workspace,
build_scripts: WorkspaceBuildScripts::default(),
rustc: Err(None),
- cargo_config_extra_env: Default::default(),
error: None,
set_test: true,
},