5158: Use CrateName correctly r=matklad a=matklad

bors r+
🤖

Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
bors[bot] 2020-07-01 08:03:47 +00:00 committed by GitHub
commit 686e115e73
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 45 additions and 29 deletions

View file

@ -149,15 +149,17 @@ fn with_files(
let crate_id = crate_graph.add_crate_root( let crate_id = crate_graph.add_crate_root(
file_id, file_id,
meta.edition, meta.edition,
Some(CrateName::new(&krate).unwrap()), Some(krate.clone()),
meta.cfg, meta.cfg,
meta.env, meta.env,
Default::default(), Default::default(),
); );
let prev = crates.insert(krate.clone(), crate_id); let crate_name = CrateName::new(&krate).unwrap();
let prev = crates.insert(crate_name.clone(), crate_id);
assert!(prev.is_none()); assert!(prev.is_none());
for dep in meta.deps { for dep in meta.deps {
crate_deps.push((krate.clone(), dep)) let dep = CrateName::new(&dep).unwrap();
crate_deps.push((crate_name.clone(), dep))
} }
} else if meta.path == "/main.rs" || meta.path == "/lib.rs" { } else if meta.path == "/main.rs" || meta.path == "/lib.rs" {
assert!(default_crate_root.is_none()); assert!(default_crate_root.is_none());

View file

@ -67,7 +67,7 @@ pub struct CrateGraph {
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct CrateId(pub u32); pub struct CrateId(pub u32);
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct CrateName(SmolStr); pub struct CrateName(SmolStr);
impl CrateName { impl CrateName {
@ -94,6 +94,13 @@ impl fmt::Display for CrateName {
} }
} }
impl ops::Deref for CrateName {
type Target = str;
fn deref(&self) -> &Self::Target {
&*self.0
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct ProcMacroId(pub u32); pub struct ProcMacroId(pub u32);
@ -117,7 +124,7 @@ pub struct CrateData {
/// The name to display to the end user. /// The name to display to the end user.
/// This actual crate name can be different in a particular dependent crate /// This actual crate name can be different in a particular dependent crate
/// or may even be missing for some cases, such as a dummy crate for the code snippet. /// or may even be missing for some cases, such as a dummy crate for the code snippet.
pub display_name: Option<CrateName>, pub display_name: Option<String>,
pub cfg_options: CfgOptions, pub cfg_options: CfgOptions,
pub env: Env, pub env: Env,
pub dependencies: Vec<Dependency>, pub dependencies: Vec<Dependency>,
@ -138,7 +145,7 @@ pub struct Env {
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
pub struct Dependency { pub struct Dependency {
pub crate_id: CrateId, pub crate_id: CrateId,
pub name: SmolStr, pub name: CrateName,
} }
impl CrateGraph { impl CrateGraph {
@ -146,7 +153,7 @@ impl CrateGraph {
&mut self, &mut self,
file_id: FileId, file_id: FileId,
edition: Edition, edition: Edition,
display_name: Option<CrateName>, display_name: Option<String>,
cfg_options: CfgOptions, cfg_options: CfgOptions,
env: Env, env: Env,
proc_macro: Vec<(SmolStr, Arc<dyn ra_tt::TokenExpander>)>, proc_macro: Vec<(SmolStr, Arc<dyn ra_tt::TokenExpander>)>,
@ -178,7 +185,7 @@ impl CrateGraph {
if self.dfs_find(from, to, &mut FxHashSet::default()) { if self.dfs_find(from, to, &mut FxHashSet::default()) {
return Err(CyclicDependenciesError); return Err(CyclicDependenciesError);
} }
self.arena.get_mut(&from).unwrap().add_dep(name.0, to); self.arena.get_mut(&from).unwrap().add_dep(name, to);
Ok(()) Ok(())
} }
@ -247,7 +254,7 @@ impl CrateId {
} }
impl CrateData { impl CrateData {
fn add_dep(&mut self, name: SmolStr, crate_id: CrateId) { fn add_dep(&mut self, name: CrateName, crate_id: CrateId) {
self.dependencies.push(Dependency { name, crate_id }) self.dependencies.push(Dependency { name, crate_id })
} }
} }
@ -429,7 +436,10 @@ mod tests {
.is_ok()); .is_ok());
assert_eq!( assert_eq!(
graph[crate1].dependencies, graph[crate1].dependencies,
vec![Dependency { crate_id: crate2, name: "crate_name_with_dashes".into() }] vec![Dependency {
crate_id: crate2,
name: CrateName::new("crate_name_with_dashes").unwrap()
}]
); );
} }
} }

View file

@ -31,7 +31,7 @@ use hir_ty::{
ApplicationTy, Canonical, GenericPredicate, InEnvironment, Substs, TraitEnvironment, Ty, ApplicationTy, Canonical, GenericPredicate, InEnvironment, Substs, TraitEnvironment, Ty,
TyDefId, TypeCtor, TyDefId, TypeCtor,
}; };
use ra_db::{CrateId, CrateName, Edition, FileId}; use ra_db::{CrateId, Edition, FileId};
use ra_prof::profile; use ra_prof::profile;
use ra_syntax::ast::{self, AttrsOwner, NameOwner}; use ra_syntax::ast::{self, AttrsOwner, NameOwner};
use rustc_hash::FxHashSet; use rustc_hash::FxHashSet;
@ -94,8 +94,8 @@ impl Crate {
db.crate_graph()[self.id].edition db.crate_graph()[self.id].edition
} }
pub fn display_name(self, db: &dyn HirDatabase) -> Option<CrateName> { pub fn display_name(self, db: &dyn HirDatabase) -> Option<String> {
db.crate_graph()[self.id].display_name.as_ref().cloned() db.crate_graph()[self.id].display_name.clone()
} }
pub fn query_external_importables( pub fn query_external_importables(

View file

@ -161,7 +161,7 @@ fn find_builtin_crate(db: &dyn AstDatabase, id: LazyMacroId) -> tt::TokenTree {
// XXX // XXX
// All crates except core itself should have a dependency on core, // All crates except core itself should have a dependency on core,
// We detect `core` by seeing whether it doesn't have such a dependency. // We detect `core` by seeing whether it doesn't have such a dependency.
let tt = if cg[krate].dependencies.iter().any(|dep| dep.name == "core") { let tt = if cg[krate].dependencies.iter().any(|dep| &*dep.name == "core") {
quote! { core } quote! { core }
} else { } else {
quote! { crate } quote! { crate }

View file

@ -117,7 +117,7 @@ impl AsName for ast::FieldKind {
impl AsName for ra_db::Dependency { impl AsName for ra_db::Dependency {
fn as_name(&self) -> Name { fn as_name(&self) -> Name {
Name::new_text(self.name.clone()) Name::new_text(SmolStr::new(&*self.name))
} }
} }

View file

@ -130,7 +130,7 @@ impl MockAnalysis {
let other_crate = crate_graph.add_crate_root( let other_crate = crate_graph.add_crate_root(
file_id, file_id,
edition, edition,
Some(CrateName::new(crate_name).unwrap()), Some(crate_name.to_string()),
cfg, cfg,
env, env,
Default::default(), Default::default(),

View file

@ -288,10 +288,7 @@ impl ProjectWorkspace {
if let (Some(&from), Some(&to)) = if let (Some(&from), Some(&to)) =
(crates.get(&from_crate_id), crates.get(&to_crate_id)) (crates.get(&from_crate_id), crates.get(&to_crate_id))
{ {
if crate_graph if crate_graph.add_dep(from, dep.name.clone(), to).is_err() {
.add_dep(from, CrateName::new(&dep.name).unwrap(), to)
.is_err()
{
log::error!( log::error!(
"cyclic dependency {:?} -> {:?}", "cyclic dependency {:?} -> {:?}",
from_crate_id, from_crate_id,
@ -312,13 +309,11 @@ impl ProjectWorkspace {
let env = Env::default(); let env = Env::default();
let proc_macro = vec![]; let proc_macro = vec![];
let crate_name = CrateName::new(&sysroot[krate].name) let name = sysroot[krate].name.clone();
.expect("Sysroot crate names should not contain dashes");
let crate_id = crate_graph.add_crate_root( let crate_id = crate_graph.add_crate_root(
file_id, file_id,
Edition::Edition2018, Edition::Edition2018,
Some(crate_name), Some(name),
cfg_options.clone(), cfg_options.clone(),
env, env,
proc_macro, proc_macro,
@ -392,7 +387,7 @@ impl ProjectWorkspace {
let crate_id = crate_graph.add_crate_root( let crate_id = crate_graph.add_crate_root(
file_id, file_id,
edition, edition,
Some(CrateName::normalize_dashes(&cargo[pkg].name)), Some(cargo[pkg].name.clone()),
cfg_options, cfg_options,
env, env,
proc_macro.clone(), proc_macro.clone(),

View file

@ -4,9 +4,9 @@ use std::path::PathBuf;
use paths::{AbsPath, AbsPathBuf}; use paths::{AbsPath, AbsPathBuf};
use ra_cfg::CfgOptions; use ra_cfg::CfgOptions;
use ra_db::{CrateId, Dependency, Edition}; use ra_db::{CrateId, CrateName, Dependency, Edition};
use rustc_hash::FxHashSet; use rustc_hash::FxHashSet;
use serde::Deserialize; use serde::{de, Deserialize};
use stdx::split_delim; use stdx::split_delim;
/// Roots and crates that compose this Rust project. /// Roots and crates that compose this Rust project.
@ -50,7 +50,7 @@ impl ProjectJson {
.into_iter() .into_iter()
.map(|dep_data| Dependency { .map(|dep_data| Dependency {
crate_id: CrateId(dep_data.krate as u32), crate_id: CrateId(dep_data.krate as u32),
name: dep_data.name.into(), name: dep_data.name,
}) })
.collect::<Vec<_>>(), .collect::<Vec<_>>(),
cfg: { cfg: {
@ -113,5 +113,14 @@ struct DepData {
/// Identifies a crate by position in the crates array. /// Identifies a crate by position in the crates array.
#[serde(rename = "crate")] #[serde(rename = "crate")]
krate: usize, krate: usize,
name: String, #[serde(deserialize_with = "deserialize_crate_name")]
name: CrateName,
}
fn deserialize_crate_name<'de, D>(de: D) -> Result<CrateName, D::Error>
where
D: de::Deserializer<'de>,
{
let name = String::deserialize(de)?;
CrateName::new(&name).map_err(|err| de::Error::custom(format!("invalid crate name: {:?}", err)))
} }