]> git.proxmox.com Git - cargo.git/commitdiff
minimal-copy `deserialize` for `InternedString` and use `InternedString` more places
authorEh2406 <YeomanYaacov@gmail.com>
Thu, 29 Aug 2019 19:16:18 +0000 (15:16 -0400)
committerEh2406 <YeomanYaacov@gmail.com>
Tue, 3 Sep 2019 14:26:15 +0000 (10:26 -0400)
crates/resolver-tests/src/lib.rs
crates/resolver-tests/tests/resolve.rs
src/cargo/core/dependency.rs
src/cargo/core/interning.rs
src/cargo/core/package_id.rs
src/cargo/core/registry.rs
src/cargo/core/resolver/dep_cache.rs
src/cargo/core/summary.rs
src/cargo/sources/registry/index.rs
src/cargo/sources/registry/mod.rs
src/cargo/util/toml/mod.rs

index dce94689eb3232760f23d6269565a86ea2d1cae4..c77a050758ea1139ae99018bf8631e5eb986d460 100644 (file)
@@ -171,7 +171,7 @@ pub fn resolve_with_config_raw(
         pkg_id("root"),
         deps,
         &BTreeMap::<String, Vec<String>>::new(),
-        None::<String>,
+        None::<&String>,
         false,
     )
     .unwrap();
index 0c6512186d7a7e29a97a3afd28b0d76eaee38895..362a6dc9b9bc7f5caea49a08a006b6384a35f83b 100644 (file)
@@ -1,5 +1,3 @@
-use std::env;
-
 use cargo::core::dependency::Kind;
 use cargo::core::{enable_nightly_features, Dependency};
 use cargo::util::{is_ci, Config};
index 1da54590ef4667f78ac4bd0f8fde9fb2ba2f45c0..0624b09807b9dacca48d2b6d9fc50b267365064e 100644 (file)
@@ -101,7 +101,7 @@ pub enum Kind {
 }
 
 fn parse_req_with_deprecated(
-    name: &str,
+    name: InternedString,
     req: &str,
     extra: Option<(PackageId, &Config)>,
 ) -> CargoResult<VersionReq> {
@@ -163,12 +163,13 @@ impl ser::Serialize for Kind {
 impl Dependency {
     /// Attempt to create a `Dependency` from an entry in the manifest.
     pub fn parse(
-        name: &str,
+        name: impl Into<InternedString>,
         version: Option<&str>,
         source_id: SourceId,
         inside: PackageId,
         config: &Config,
     ) -> CargoResult<Dependency> {
+        let name = name.into();
         let arg = Some((inside, config));
         let (specified_req, version_req) = match version {
             Some(v) => (true, parse_req_with_deprecated(name, v, arg)?),
@@ -187,10 +188,11 @@ impl Dependency {
 
     /// Attempt to create a `Dependency` from an entry in the manifest.
     pub fn parse_no_deprecated(
-        name: &str,
+        name: impl Into<InternedString>,
         version: Option<&str>,
         source_id: SourceId,
     ) -> CargoResult<Dependency> {
+        let name = name.into();
         let (specified_req, version_req) = match version {
             Some(v) => (true, parse_req_with_deprecated(name, v, None)?),
             None => (false, VersionReq::any()),
@@ -206,11 +208,11 @@ impl Dependency {
         Ok(ret)
     }
 
-    pub fn new_override(name: &str, source_id: SourceId) -> Dependency {
+    pub fn new_override(name: InternedString, source_id: SourceId) -> Dependency {
         assert!(!name.is_empty());
         Dependency {
             inner: Rc::new(Inner {
-                name: InternedString::new(name),
+                name,
                 source_id,
                 registry_id: None,
                 req: VersionReq::any(),
@@ -338,12 +340,9 @@ impl Dependency {
     /// Sets the list of features requested for the package.
     pub fn set_features(
         &mut self,
-        features: impl IntoIterator<Item = impl AsRef<str>>,
+        features: impl IntoIterator<Item = impl Into<InternedString>>,
     ) -> &mut Dependency {
-        Rc::make_mut(&mut self.inner).features = features
-            .into_iter()
-            .map(|s| InternedString::new(s.as_ref()))
-            .collect();
+        Rc::make_mut(&mut self.inner).features = features.into_iter().map(|s| s.into()).collect();
         self
     }
 
@@ -376,8 +375,11 @@ impl Dependency {
         self
     }
 
-    pub fn set_explicit_name_in_toml(&mut self, name: &str) -> &mut Dependency {
-        Rc::make_mut(&mut self.inner).explicit_name_in_toml = Some(InternedString::new(name));
+    pub fn set_explicit_name_in_toml(
+        &mut self,
+        name: impl Into<InternedString>,
+    ) -> &mut Dependency {
+        Rc::make_mut(&mut self.inner).explicit_name_in_toml = Some(name.into());
         self
     }
 
index c5f975044909207480d1136d194f2b3096d5a4e7..f4223f414e4958cdce0d57dd0ae4d6c67f97f8aa 100644 (file)
@@ -23,6 +23,18 @@ pub struct InternedString {
     inner: &'static str,
 }
 
+impl<'a> From<&'a str> for InternedString {
+    fn from(item: &'a str) -> Self {
+        InternedString::new(item)
+    }
+}
+
+impl<'a> From<&'a String> for InternedString {
+    fn from(item: &'a String) -> Self {
+        InternedString::new(item)
+    }
+}
+
 impl PartialEq for InternedString {
     fn eq(&self, other: &InternedString) -> bool {
         ptr::eq(self.as_str(), other.as_str())
@@ -56,6 +68,12 @@ impl Deref for InternedString {
     }
 }
 
+impl AsRef<str> for InternedString {
+    fn as_ref(&self) -> &str {
+        self.as_str()
+    }
+}
+
 impl Hash for InternedString {
     // N.B., we can't implement this as `identity(self).hash(state)`,
     // because we use this for on-disk fingerprints and so need
@@ -105,3 +123,29 @@ impl Serialize for InternedString {
         serializer.serialize_str(self.inner)
     }
 }
+
+struct InternedStringVisitor;
+
+impl<'de> serde::Deserialize<'de> for InternedString {
+    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+    where
+        D: serde::Deserializer<'de>,
+    {
+        deserializer.deserialize_str(InternedStringVisitor)
+    }
+}
+
+impl<'de> serde::de::Visitor<'de> for InternedStringVisitor {
+    type Value = InternedString;
+
+    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
+        formatter.write_str("an String like thing")
+    }
+
+    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
+    where
+        E: serde::de::Error,
+    {
+        Ok(InternedString::new(v))
+    }
+}
index 208c3ba3e1be46bed7298c1c865cfda1916e8f00..8c40e9dd9d6c3d371fabb5641110086df9c96411 100644 (file)
@@ -113,9 +113,13 @@ impl Hash for PackageId {
 }
 
 impl PackageId {
-    pub fn new<T: ToSemver>(name: &str, version: T, sid: SourceId) -> CargoResult<PackageId> {
+    pub fn new<T: ToSemver>(
+        name: impl Into<InternedString>,
+        version: T,
+        sid: SourceId,
+    ) -> CargoResult<PackageId> {
         let v = version.to_semver()?;
-        Ok(PackageId::pure(InternedString::new(name), v, sid))
+        Ok(PackageId::pure(name.into(), v, sid))
     }
 
     pub fn pure(name: InternedString, version: semver::Version, source_id: SourceId) -> PackageId {
index 54468d9f84c066516ea54d957a3d8846ffa69a2a..979e54759e32f9bf17c2f673d89c7507b94fdcd4 100644 (file)
@@ -366,7 +366,7 @@ impl<'cfg> PackageRegistry<'cfg> {
     fn query_overrides(&mut self, dep: &Dependency) -> CargoResult<Option<Summary>> {
         for &s in self.overrides.iter() {
             let src = self.sources.get_mut(s).unwrap();
-            let dep = Dependency::new_override(&*dep.package_name(), s);
+            let dep = Dependency::new_override(dep.package_name(), s);
             let mut results = src.query_vec(&dep)?;
             if !results.is_empty() {
                 return Ok(Some(results.remove(0)));
index ccfde1adec19c81b066b35b29bb5cab5dcd8b1fe..aa33b1b0c64c106d604bb0b4c2729319706fa50e 100644 (file)
@@ -433,7 +433,7 @@ impl Requirements<'_> {
         for fv in self
             .summary
             .features()
-            .get(feat.as_str())
+            .get(&feat)
             .expect("must be a valid feature")
         {
             match *fv {
index fb52b9179d71e743255bf830a6353a214d56f06b..7080d22745344d43811900583808a06b0409313d 100644 (file)
@@ -37,7 +37,7 @@ impl Summary {
         pkg_id: PackageId,
         dependencies: Vec<Dependency>,
         features: &BTreeMap<K, Vec<impl AsRef<str>>>,
-        links: Option<impl AsRef<str>>,
+        links: Option<impl Into<InternedString>>,
         namespaced_features: bool,
     ) -> CargoResult<Summary>
     where
@@ -66,7 +66,7 @@ impl Summary {
                 dependencies,
                 features: feature_map,
                 checksum: None,
-                links: links.map(|l| InternedString::new(l.as_ref())),
+                links: links.map(|l| l.into()),
                 namespaced_features,
             }),
         })
index accc40deb1f88a89e5268f0d5435573e64ff0a34..597c39e3816a3232e679392b30c4d3b0bafa03bb 100644 (file)
@@ -716,7 +716,7 @@ impl IndexSummary {
             links,
         } = serde_json::from_slice(line)?;
         log::trace!("json parsed registry {}/{}", name, vers);
-        let pkgid = PackageId::new(&name, &vers, source_id)?;
+        let pkgid = PackageId::new(name, &vers, source_id)?;
         let deps = deps
             .into_iter()
             .map(|dep| dep.into_dep(source_id))
index a63d15e010324ad8460e1324fae1ce050f239bc3..7b28e9ae5a30775f4f76d7e33f185a45ebc06a8e 100644 (file)
@@ -219,17 +219,18 @@ pub struct RegistryConfig {
 
 #[derive(Deserialize)]
 pub struct RegistryPackage<'a> {
-    name: Cow<'a, str>,
+    name: InternedString,
     vers: Version,
+    #[serde(borrow)]
     deps: Vec<RegistryDependency<'a>>,
-    features: BTreeMap<Cow<'a, str>, Vec<Cow<'a, str>>>,
+    features: BTreeMap<InternedString, Vec<InternedString>>,
     cksum: String,
     yanked: Option<bool>,
-    links: Option<Cow<'a, str>>,
+    links: Option<InternedString>,
 }
 
 #[test]
-fn escaped_cher_in_json() {
+fn escaped_char_in_json() {
     let _: RegistryPackage<'_> = serde_json::from_str(
         r#"{"name":"a","vers":"0.0.1","deps":[],"cksum":"bae3","features":{}}"#,
     )
@@ -275,15 +276,16 @@ enum Field {
 
 #[derive(Deserialize)]
 struct RegistryDependency<'a> {
-    name: Cow<'a, str>,
+    name: InternedString,
+    #[serde(borrow)]
     req: Cow<'a, str>,
-    features: Vec<Cow<'a, str>>,
+    features: Vec<InternedString>,
     optional: bool,
     default_features: bool,
     target: Option<Cow<'a, str>>,
     kind: Option<Cow<'a, str>>,
     registry: Option<Cow<'a, str>>,
-    package: Option<Cow<'a, str>>,
+    package: Option<InternedString>,
     public: Option<bool>,
 }
 
@@ -309,10 +311,9 @@ impl<'a> RegistryDependency<'a> {
             default
         };
 
-        let mut dep =
-            Dependency::parse_no_deprecated(package.as_ref().unwrap_or(&name), Some(&req), id)?;
+        let mut dep = Dependency::parse_no_deprecated(package.unwrap_or(name), Some(&req), id)?;
         if package.is_some() {
-            dep.set_explicit_name_in_toml(&name);
+            dep.set_explicit_name_in_toml(name);
         }
         let kind = match kind.as_ref().map(|s| &s[..]).unwrap_or("") {
             "dev" => Kind::Development,
index 5d9e000b807dddfd4b3033de133661928e156de8..dd4da3e6e7c12fd452eb4701df78445ddc25424a 100644 (file)
@@ -16,7 +16,7 @@ use url::Url;
 use crate::core::dependency::{Kind, Platform};
 use crate::core::manifest::{LibKind, ManifestMetadata, TargetSourcePath, Warnings};
 use crate::core::profiles::Profiles;
-use crate::core::{Dependency, Manifest, PackageId, Summary, Target};
+use crate::core::{Dependency, InternedString, Manifest, PackageId, Summary, Target};
 use crate::core::{Edition, EitherManifest, Feature, Features, VirtualManifest};
 use crate::core::{GitReference, PackageIdSpec, SourceId, WorkspaceConfig, WorkspaceRootConfig};
 use crate::sources::{CRATES_IO_INDEX, CRATES_IO_REGISTRY};
@@ -650,7 +650,7 @@ impl<'de> de::Deserialize<'de> for VecStringOrBool {
 #[derive(Deserialize, Serialize, Clone, Debug)]
 pub struct TomlProject {
     edition: Option<String>,
-    name: String,
+    name: InternedString,
     version: semver::Version,
     authors: Option<Vec<String>>,
     build: Option<StringOrBool>,
@@ -697,7 +697,7 @@ pub struct TomlWorkspace {
 
 impl TomlProject {
     pub fn to_package_id(&self, source_id: SourceId) -> CargoResult<PackageId> {
-        PackageId::new(&self.name, self.version.clone(), source_id)
+        PackageId::new(self.name, self.version.clone(), source_id)
     }
 }