Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/test-fixture/src/lib.rs')
-rw-r--r--crates/test-fixture/src/lib.rs154
1 files changed, 98 insertions, 56 deletions
diff --git a/crates/test-fixture/src/lib.rs b/crates/test-fixture/src/lib.rs
index 4413d2f222..7574d12c0c 100644
--- a/crates/test-fixture/src/lib.rs
+++ b/crates/test-fixture/src/lib.rs
@@ -1,10 +1,11 @@
//! A set of high-level utility fixture methods to use in tests.
use std::{any::TypeId, mem, str::FromStr, sync};
+use base_db::target::TargetData;
use base_db::{
Crate, CrateDisplayName, CrateGraphBuilder, CrateName, CrateOrigin, CrateWorkspaceData,
- DependencyBuilder, Env, FileChange, FileSet, LangCrateOrigin, SourceDatabase, SourceRoot,
- Version, VfsPath, salsa,
+ DependencyBuilder, Env, FileChange, FileSet, FxIndexMap, LangCrateOrigin, SourceDatabase,
+ SourceRoot, Version, VfsPath, salsa,
};
use cfg::CfgOptions;
use hir_expand::{
@@ -20,7 +21,6 @@ use hir_expand::{
};
use intern::{Symbol, sym};
use paths::AbsPathBuf;
-use rustc_hash::FxHashMap;
use span::{Edition, FileId, Span};
use stdx::itertools::Itertools;
use test_utils::{
@@ -137,8 +137,11 @@ impl ChangeFixture {
proc_macro_names,
toolchain,
target_data_layout,
+ target_arch,
} = FixtureWithProjectMeta::parse(ra_fixture);
- let target_data_layout = Ok(target_data_layout.into());
+ let target_data_layout = target_data_layout.into();
+ let target_arch = parse_target_arch(&target_arch);
+ let target = Ok(TargetData { arch: target_arch, data_layout: target_data_layout });
let toolchain = Some({
let channel = toolchain.as_deref().unwrap_or("stable");
Version::parse(&format!("1.76.0-{channel}")).unwrap()
@@ -147,7 +150,7 @@ impl ChangeFixture {
let mut files = Vec::new();
let mut crate_graph = CrateGraphBuilder::default();
- let mut crates = FxHashMap::default();
+ let mut crates = FxIndexMap::default();
let mut crate_deps = Vec::new();
let mut default_crate_root: Option<FileId> = None;
let mut default_edition = Edition::CURRENT;
@@ -164,8 +167,7 @@ impl ChangeFixture {
let mut file_position = None;
- let crate_ws_data =
- Arc::new(CrateWorkspaceData { data_layout: target_data_layout, toolchain });
+ let crate_ws_data = Arc::new(CrateWorkspaceData { target, toolchain });
// FIXME: This is less than ideal
let proc_macro_cwd = Arc::new(AbsPathBuf::assert_utf8(std::env::current_dir().unwrap()));
@@ -249,37 +251,7 @@ impl ChangeFixture {
file_id = FileId::from_raw(file_id.index() + 1);
}
- if crates.is_empty() {
- let crate_root = default_crate_root
- .expect("missing default crate root, specify a main.rs or lib.rs");
- crate_graph.add_crate_root(
- crate_root,
- default_edition,
- Some(CrateName::new("ra_test_fixture").unwrap().into()),
- None,
- default_cfg.clone(),
- Some(default_cfg),
- default_env,
- CrateOrigin::Local { repo: None, name: None },
- false,
- proc_macro_cwd.clone(),
- crate_ws_data.clone(),
- );
- } else {
- for (from, to, prelude) in crate_deps {
- let from_id = crates[&from];
- let to_id = crates[&to];
- let sysroot = crate_graph[to_id].basic.origin.is_lang();
- crate_graph
- .add_dep(
- from_id,
- DependencyBuilder::with_prelude(to.clone(), to_id, prelude, sysroot),
- )
- .unwrap();
- }
- }
-
- if let Some(mini_core) = mini_core {
+ let mini_core = mini_core.map(|mini_core| {
let core_file = file_id;
file_id = FileId::from_raw(file_id.index() + 1);
@@ -289,8 +261,6 @@ impl ChangeFixture {
source_change.change_file(core_file, Some(mini_core.source_code()));
- let all_crates = crate_graph.iter().collect::<Vec<_>>();
-
let core_crate = crate_graph.add_crate_root(
core_file,
Edition::CURRENT,
@@ -308,16 +278,58 @@ impl ChangeFixture {
crate_ws_data.clone(),
);
- for krate in all_crates {
+ (
+ move || {
+ DependencyBuilder::with_prelude(
+ CrateName::new("core").unwrap(),
+ core_crate,
+ true,
+ true,
+ )
+ },
+ core_crate,
+ )
+ });
+
+ if crates.is_empty() {
+ let crate_root = default_crate_root
+ .expect("missing default crate root, specify a main.rs or lib.rs");
+ let root = crate_graph.add_crate_root(
+ crate_root,
+ default_edition,
+ Some(CrateName::new("ra_test_fixture").unwrap().into()),
+ None,
+ default_cfg.clone(),
+ Some(default_cfg),
+ default_env,
+ CrateOrigin::Local { repo: None, name: None },
+ false,
+ proc_macro_cwd.clone(),
+ crate_ws_data.clone(),
+ );
+ if let Some((mini_core, _)) = mini_core {
+ crate_graph.add_dep(root, mini_core()).unwrap();
+ }
+ } else {
+ // Insert minicore first to match with `project-model::workspace`
+ if let Some((mini_core, core_crate)) = mini_core {
+ let all_crates = crate_graph.iter().collect::<Vec<_>>();
+ for krate in all_crates {
+ if krate == core_crate {
+ continue;
+ }
+ crate_graph.add_dep(krate, mini_core()).unwrap();
+ }
+ }
+
+ for (from, to, prelude) in crate_deps {
+ let from_id = crates[&from];
+ let to_id = crates[&to];
+ let sysroot = crate_graph[to_id].basic.origin.is_lang();
crate_graph
.add_dep(
- krate,
- DependencyBuilder::with_prelude(
- CrateName::new("core").unwrap(),
- core_crate,
- true,
- true,
- ),
+ from_id,
+ DependencyBuilder::with_prelude(to.clone(), to_id, prelude, sysroot),
)
.unwrap();
}
@@ -386,6 +398,15 @@ impl ChangeFixture {
}
}
+fn parse_target_arch(arch: &str) -> base_db::target::Arch {
+ use base_db::target::Arch::*;
+ match arch {
+ "wasm32" => Wasm32,
+ "wasm64" => Wasm64,
+ _ => Other,
+ }
+}
+
fn default_test_proc_macros() -> Box<[(String, ProcMacro)]> {
Box::new([
(
@@ -627,11 +648,23 @@ impl FileMeta {
}
}
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+enum ForceNoneLangOrigin {
+ Yes,
+ No,
+}
+
fn parse_crate(
crate_str: String,
current_source_root_kind: SourceRootKind,
explicit_non_workspace_member: bool,
) -> (String, CrateOrigin, Option<String>) {
+ let (crate_str, force_non_lang_origin) = if let Some(s) = crate_str.strip_prefix("r#") {
+ (s.to_owned(), ForceNoneLangOrigin::Yes)
+ } else {
+ (crate_str, ForceNoneLangOrigin::No)
+ };
+
// syntax:
// "my_awesome_crate"
// "[email protected],http://example.com"
@@ -646,16 +679,25 @@ fn parse_crate(
let non_workspace_member = explicit_non_workspace_member
|| matches!(current_source_root_kind, SourceRootKind::Library);
- let origin = match LangCrateOrigin::from(&*name) {
- LangCrateOrigin::Other => {
- let name = Symbol::intern(&name);
- if non_workspace_member {
- CrateOrigin::Library { repo, name }
- } else {
- CrateOrigin::Local { repo, name: Some(name) }
+ let origin = if force_non_lang_origin == ForceNoneLangOrigin::Yes {
+ let name = Symbol::intern(&name);
+ if non_workspace_member {
+ CrateOrigin::Library { repo, name }
+ } else {
+ CrateOrigin::Local { repo, name: Some(name) }
+ }
+ } else {
+ match LangCrateOrigin::from(&*name) {
+ LangCrateOrigin::Other => {
+ let name = Symbol::intern(&name);
+ if non_workspace_member {
+ CrateOrigin::Library { repo, name }
+ } else {
+ CrateOrigin::Local { repo, name: Some(name) }
+ }
}
+ origin => CrateOrigin::Lang(origin),
}
- origin => CrateOrigin::Lang(origin),
};
(name, origin, version)