diff --git a/crates/base_db/src/fixture.rs b/crates/base_db/src/fixture.rs index a8a5a7e3b5..9baae92144 100644 --- a/crates/base_db/src/fixture.rs +++ b/crates/base_db/src/fixture.rs @@ -131,13 +131,13 @@ impl ChangeFixture { current_source_root_kind = *kind; } - if let Some((krate, origin)) = meta.krate { + if let Some((krate, origin, version)) = meta.krate { let crate_name = CrateName::normalize_dashes(&krate); let crate_id = crate_graph.add_crate_root( file_id, meta.edition, Some(crate_name.clone().into()), - None, + version, meta.cfg.clone(), meta.cfg, meta.env, @@ -212,7 +212,7 @@ impl ChangeFixture { CfgOptions::default(), Env::default(), Vec::new(), - CrateOrigin::Lang("core".to_string()), + CrateOrigin::Lang, ); for krate in all_crates { @@ -247,7 +247,7 @@ impl ChangeFixture { CfgOptions::default(), Env::default(), proc_macro, - CrateOrigin::Lang("proc-macro".to_string()), + CrateOrigin::Lang, ); for krate in all_crates { @@ -329,7 +329,7 @@ enum SourceRootKind { #[derive(Debug)] struct FileMeta { path: String, - krate: Option<(String, CrateOrigin)>, + krate: Option<(String, CrateOrigin, Option)>, deps: Vec, extern_prelude: Vec, cfg: CfgOptions, @@ -338,24 +338,20 @@ struct FileMeta { introduce_new_source_root: Option, } -fn parse_crate(crate_str: String) -> (String, CrateOrigin) { +fn parse_crate(crate_str: String) -> (String, CrateOrigin, Option) { if let Some((a, b)) = crate_str.split_once("@") { - ( - a.to_owned(), - match b.split_once(":") { - Some(("CratesIo", data)) => match data.split_once(",") { - Some((version, url)) => CrateOrigin::CratesIo { - name: a.to_owned(), - repo: Some(url.to_owned()), - version: version.to_owned(), - }, - _ => panic!("Bad crates.io parameter: {}", data), - }, - _ => panic!("Bad string for crate origin: {}", b), + let (version, origin) = match b.split_once(":") { + Some(("CratesIo", data)) => match data.split_once(",") { + Some((version, url)) => { + (version, CrateOrigin::CratesIo { repo: Some(url.to_owned()) }) + } + _ => panic!("Bad crates.io parameter: {}", data), }, - ) + _ => panic!("Bad string for crate origin: {}", b), + }; + (a.to_owned(), origin, Some(version.to_string())) } else { - (crate_str, CrateOrigin::Unknown) + (crate_str, CrateOrigin::Unknown, None) } } diff --git a/crates/base_db/src/input.rs b/crates/base_db/src/input.rs index fc673f40f5..f182427e47 100644 --- a/crates/base_db/src/input.rs +++ b/crates/base_db/src/input.rs @@ -116,9 +116,9 @@ impl ops::Deref for CrateName { #[derive(Debug, Clone)] pub enum CrateOrigin { /// Crates that are from crates.io official registry, - CratesIo { name: String, version: String, repo: Option }, + CratesIo { repo: Option }, /// Crates that are provided by the language, like std, core, proc-macro, ... - Lang(String), + Lang, /// Crates that we don't know their origin. // Idealy this enum should cover all cases, and then we remove this variant. Unknown, diff --git a/crates/ide/src/moniker.rs b/crates/ide/src/moniker.rs index 146ea490b6..9d8c742fc4 100644 --- a/crates/ide/src/moniker.rs +++ b/crates/ide/src/moniker.rs @@ -117,10 +117,10 @@ pub(crate) fn def_to_moniker( }, kind: if krate == from_crate { MonikerKind::Export } else { MonikerKind::Import }, package_information: { - let (name, repo, version) = match krate.origin(db) { - CrateOrigin::CratesIo { repo, name, version } => (name, repo?, version), - CrateOrigin::Lang(name) => ( - name, + let name = krate.display_name(db)?.to_string(); + let (repo, version) = match krate.origin(db) { + CrateOrigin::CratesIo { repo } => (repo?, krate.version(db)?), + CrateOrigin::Lang => ( "https://github.com/rust-lang/rust/".to_string(), "compiler_version".to_string(), ), diff --git a/crates/project_model/src/workspace.rs b/crates/project_model/src/workspace.rs index cc26fcb587..0335f8b174 100644 --- a/crates/project_model/src/workspace.rs +++ b/crates/project_model/src/workspace.rs @@ -474,12 +474,8 @@ fn project_json_to_crate_graph( cfg_options, env, proc_macro.unwrap_or_default(), - if let Some(name) = &krate.display_name { - CrateOrigin::CratesIo { - repo: krate.repository.clone(), - name: name.crate_name().to_string(), - version: krate.version.clone().unwrap_or_default(), - } + if krate.display_name.is_some() { + CrateOrigin::CratesIo { repo: krate.repository.clone() } } else { CrateOrigin::Unknown }, @@ -832,7 +828,6 @@ fn add_target_crate_root( .iter() .map(|feat| CfgFlag::KeyValue { key: "feature".into(), value: feat.0.into() }), ); - let crate_name = display_name.crate_name().to_string(); crate_graph.add_crate_root( file_id, edition, @@ -842,11 +837,7 @@ fn add_target_crate_root( potential_cfg_options, env, proc_macro, - CrateOrigin::CratesIo { - name: crate_name, - repo: pkg.repository.clone(), - version: pkg.version.to_string(), - }, + CrateOrigin::CratesIo { repo: pkg.repository.clone() }, ) } @@ -890,7 +881,7 @@ fn sysroot_to_crate_graph( cfg_options.clone(), env, proc_macro, - CrateOrigin::Lang(sysroot[krate].name.clone()), + CrateOrigin::Lang, ); Some((krate, crate_id)) })