]> git.lizzy.rs Git - rust.git/commitdiff
Use CrateName for semantic names
authorAleksey Kladov <aleksey.kladov@gmail.com>
Wed, 1 Jul 2020 07:53:53 +0000 (09:53 +0200)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Wed, 1 Jul 2020 07:53:53 +0000 (09:53 +0200)
crates/ra_db/src/input.rs
crates/ra_hir_expand/src/builtin_derive.rs
crates/ra_hir_expand/src/name.rs
crates/ra_project_model/src/lib.rs
crates/ra_project_model/src/project_json.rs

index 7f366011853ea61947997ffbf5f811044f3bc12d..a8cc588f9cde11e539e452cb16abab9eb6e3d961 100644 (file)
@@ -94,6 +94,13 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
     }
 }
 
+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);
 
@@ -138,7 +145,7 @@ pub struct Env {
 #[derive(Debug, Clone, PartialEq, Eq)]
 pub struct Dependency {
     pub crate_id: CrateId,
-    pub name: SmolStr,
+    pub name: CrateName,
 }
 
 impl CrateGraph {
@@ -178,7 +185,7 @@ pub fn add_dep(
         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(())
     }
 
@@ -247,7 +254,7 @@ pub fn shift(self, amount: u32) -> CrateId {
 }
 
 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 })
     }
 }
@@ -429,7 +436,10 @@ fn dashes_are_normalized() {
             .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()
+            }]
         );
     }
 }
index 26b667b55715e791c0bc9bd020e3027c42989ea8..f2d6648638563cc6be5eff2a6d530cb23a4a17ee 100644 (file)
@@ -161,7 +161,7 @@ fn find_builtin_crate(db: &dyn AstDatabase, id: LazyMacroId) -> tt::TokenTree {
     // 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 }
index 1b0303685d0f162a31176aded85512630af40da3..969a2e5b834eea7e3ebc450d6142bc104f9a4f61 100644 (file)
@@ -117,7 +117,7 @@ fn as_name(&self) -> Name {
 
 impl AsName for ra_db::Dependency {
     fn as_name(&self) -> Name {
-        Name::new_text(self.name.clone())
+        Name::new_text(SmolStr::new(&*self.name))
     }
 }
 
index 8b85b4831f4e83c0707e8ff4493828dff87052b2..1533d32c98aa599cf68ef21d8bf7c7b69b34e617 100644 (file)
@@ -288,10 +288,7 @@ pub fn to_crate_graph(
                         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,
index 4b5dcd6340be51fab63c3f9f1d73c3ac4abefb18..9fe1e2dcb792d423516e22d27ad83d390857274a 100644 (file)
@@ -4,9 +4,9 @@
 
 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.
@@ -50,7 +50,7 @@ pub fn new(base: &AbsPath, data: ProjectJsonData) -> ProjectJson {
                         .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: {
@@ -113,5 +113,14 @@ struct DepData {
     /// 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)))
 }