}
}
+impl ops::Deref for CrateName {
+ type Target = str;
+ fn deref(&self) -> &Self::Target {
+ &*self.0
+ }
+}
+
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct ProcMacroId(pub u32);
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Dependency {
pub crate_id: CrateId,
- pub name: SmolStr,
+ pub name: CrateName,
}
impl CrateGraph {
if self.dfs_find(from, to, &mut FxHashSet::default()) {
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(())
}
}
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 })
}
}
.is_ok());
assert_eq!(
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()
+ }]
);
}
}
// XXX
// All crates except core itself should have a dependency on core,
// 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 }
} else {
quote! { crate }
impl AsName for ra_db::Dependency {
fn as_name(&self) -> Name {
- Name::new_text(self.name.clone())
+ Name::new_text(SmolStr::new(&*self.name))
}
}
if let (Some(&from), Some(&to)) =
(crates.get(&from_crate_id), crates.get(&to_crate_id))
{
- if crate_graph
- .add_dep(from, CrateName::new(&dep.name).unwrap(), to)
- .is_err()
- {
+ if crate_graph.add_dep(from, dep.name.clone(), to).is_err() {
log::error!(
"cyclic dependency {:?} -> {:?}",
from_crate_id,
use paths::{AbsPath, AbsPathBuf};
use ra_cfg::CfgOptions;
-use ra_db::{CrateId, Dependency, Edition};
+use ra_db::{CrateId, CrateName, Dependency, Edition};
use rustc_hash::FxHashSet;
-use serde::Deserialize;
+use serde::{de, Deserialize};
use stdx::split_delim;
/// Roots and crates that compose this Rust project.
.into_iter()
.map(|dep_data| Dependency {
crate_id: CrateId(dep_data.krate as u32),
- name: dep_data.name.into(),
+ name: dep_data.name,
})
.collect::<Vec<_>>(),
cfg: {
/// Identifies a crate by position in the crates array.
#[serde(rename = "crate")]
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)))
}