diff --git a/serde/build.rs b/serde/build.rs index 9d0d3a97..1c195f98 100644 --- a/serde/build.rs +++ b/serde/build.rs @@ -1,13 +1,29 @@ use std::env; +use std::fs; +use std::path::PathBuf; use std::process::Command; use std::str; +const PRIVATE: &str = "\ +#[doc(hidden)] +pub mod __private$$ { + #[doc(hidden)] + pub use crate::private::*; +} +use serde_core::__private$$ as serde_core_private; +"; + // The rustc-cfg strings below are *not* public API. Please let us know by // opening a GitHub issue if your build environment requires some way to enable // these cfgs other than by executing our build script. fn main() { println!("cargo:rerun-if-changed=build.rs"); + let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap()); + let patch_version = env::var("CARGO_PKG_VERSION_PATCH").unwrap(); + let module = PRIVATE.replace("$$", &patch_version); + fs::write(out_dir.join("private.rs"), module).unwrap(); + let minor = match rustc_minor_version() { Some(minor) => minor, None => return, diff --git a/serde/src/lib.rs b/serde/src/lib.rs index b8898438..64f36f96 100644 --- a/serde/src/lib.rs +++ b/serde/src/lib.rs @@ -239,8 +239,9 @@ mod integer128; // Used by generated code and doc tests. Not public API. #[doc(hidden)] -#[path = "private/mod.rs"] -pub mod __private; +mod private; + +include!(concat!(env!("OUT_DIR"), "/private.rs")); // Re-export #[derive(Serialize, Deserialize)]. // diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index 924d2d79..6f657f50 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -17,7 +17,7 @@ pub use self::content::{ UntaggedUnitVisitor, }; -pub use serde_core::__private::InPlaceSeed; +pub use crate::serde_core_private::InPlaceSeed; /// If the missing field is of type `Option` then treat is as `None`, /// otherwise it is an error. @@ -216,8 +216,8 @@ mod content { self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Expected, IgnoredAny, MapAccess, SeqAccess, Unexpected, Visitor, }; - use serde_core::__private::size_hint; - pub use serde_core::__private::Content; + use crate::serde_core_private::size_hint; + pub use crate::serde_core_private::Content; pub fn content_as_str<'a, 'de>(content: &'a Content<'de>) -> Option<&'a str> { match *content { diff --git a/serde/src/private/mod.rs b/serde/src/private/mod.rs index 0098f16b..20bfa4eb 100644 --- a/serde/src/private/mod.rs +++ b/serde/src/private/mod.rs @@ -12,7 +12,7 @@ pub use crate::lib::option::Option::{self, None, Some}; pub use crate::lib::ptr; pub use crate::lib::result::Result::{self, Err, Ok}; -pub use serde_core::__private::string::from_utf8_lossy; +pub use crate::serde_core_private::string::from_utf8_lossy; #[cfg(any(feature = "alloc", feature = "std"))] pub use crate::lib::{ToString, Vec}; diff --git a/serde_core/build.rs b/serde_core/build.rs index fe9fd15c..0f0c88e8 100644 --- a/serde_core/build.rs +++ b/serde_core/build.rs @@ -1,13 +1,28 @@ use std::env; +use std::fs; +use std::path::PathBuf; use std::process::Command; use std::str; +const PRIVATE: &str = "\ +#[doc(hidden)] +pub mod __private$$ { + #[doc(hidden)] + pub use crate::private::*; +} +"; + // The rustc-cfg strings below are *not* public API. Please let us know by // opening a GitHub issue if your build environment requires some way to enable // these cfgs other than by executing our build script. fn main() { println!("cargo:rerun-if-changed=build.rs"); + let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap()); + let patch_version = env::var("CARGO_PKG_VERSION_PATCH").unwrap(); + let module = PRIVATE.replace("$$", &patch_version); + fs::write(out_dir.join("private.rs"), module).unwrap(); + let minor = match rustc_minor_version() { Some(minor) => minor, None => return, diff --git a/serde_core/src/lib.rs b/serde_core/src/lib.rs index aefc808c..a3b022aa 100644 --- a/serde_core/src/lib.rs +++ b/serde_core/src/lib.rs @@ -252,9 +252,18 @@ pub use crate::ser::{Serialize, Serializer}; // Used by generated code. Not public API. #[doc(hidden)] -#[path = "private/mod.rs"] -pub mod __private; -use self::__private as private; +mod private; + +// Used by declarative macro generated code. Not public API. +#[doc(hidden)] +pub mod __private { + #[doc(hidden)] + pub use crate::private::doc; + #[doc(hidden)] + pub use core::result::Result; +} + +include!(concat!(env!("OUT_DIR"), "/private.rs")); #[cfg(all(not(feature = "std"), no_core_error))] mod std_error; diff --git a/serde_derive/src/lib.rs b/serde_derive/src/lib.rs index 69f1f43d..b0e1ad2f 100644 --- a/serde_derive/src/lib.rs +++ b/serde_derive/src/lib.rs @@ -96,7 +96,10 @@ struct private; impl private { fn ident(&self) -> Ident { - Ident::new("__private", Span::call_site()) + Ident::new( + concat!("__private", env!("CARGO_PKG_VERSION_PATCH")), + Span::call_site(), + ) } }