about summary refs log tree commit diff
diff options
context:
space:
mode:
authorChristiaan Dirkx <christiaan@dirkx.email>2021-04-14 21:36:13 +0200
committerChristiaan Dirkx <christiaan@dirkx.email>2021-05-03 16:56:22 +0200
commita0ca3f94f00fb8772ac9b89333d98e668375163b (patch)
treee1b216bac178b6c23e6be52d73b2ad4303256b82
parente098d2730abfe7210599998d43e2af3be72c74fc (diff)
downloadrust-a0ca3f94f00fb8772ac9b89333d98e668375163b.tar.gz
rust-a0ca3f94f00fb8772ac9b89333d98e668375163b.zip
Rework `os` to avoid using `cfg_if!` with public items
-rw-r--r--library/std/src/os/mod.rs202
-rw-r--r--library/std/src/os/unix/mod.rs72
2 files changed, 151 insertions, 123 deletions
diff --git a/library/std/src/os/mod.rs b/library/std/src/os/mod.rs
index ecaa25cf800..4365966e728 100644
--- a/library/std/src/os/mod.rs
+++ b/library/std/src/os/mod.rs
@@ -5,91 +5,119 @@
 
 pub mod raw;
 
-cfg_if::cfg_if! {
-    if #[cfg(all(doc, not(any(target_os = "hermit",
-                        all(target_arch = "wasm32", not(target_os = "wasi")),
-                        all(target_vendor = "fortanix", target_env = "sgx")))))]{
-        // When documenting std we want to show the `unix`, `windows`, `linux` and `wasi`
-        // modules as these are the "main modules" that are used across platforms,
-        // so these modules are enabled when `cfg(doc)` is set.
-        // This should help show platform-specific functionality in a hopefully cross-platform
-        // way in the documentation.
-
-        pub mod unix;
-
-        pub mod linux;
-
-        pub mod wasi;
-
-        pub mod windows;
-    } else if #[cfg(doc)] {
-        // On certain platforms right now the "main modules" modules that are
-        // documented don't compile (missing things in `libc` which is empty),
-        // so just omit them with an empty module.
-
-        #[unstable(issue = "none", feature = "std_internals")]
-        pub mod unix {}
-
-        #[unstable(issue = "none", feature = "std_internals")]
-        pub mod linux {}
-
-        #[unstable(issue = "none", feature = "std_internals")]
-        pub mod wasi {}
-
-        #[unstable(issue = "none", feature = "std_internals")]
-        pub mod windows {}
-    } else {
-        // If we're not documenting std then we only expose modules appropriate for the
-        // current platform.
-
-        #[cfg(all(target_vendor = "fortanix", target_env = "sgx"))]
-        pub mod fortanix_sgx;
-
-        #[cfg(target_os = "hermit")]
-        mod hermit;
-        #[cfg(target_os = "hermit")]
-        pub use hermit as unix;
-
-        #[cfg(unix)]
-        pub mod unix;
-        #[cfg(target_os = "android")]
-        pub mod android;
-        #[cfg(target_os = "dragonfly")]
-        pub mod dragonfly;
-        #[cfg(target_os = "emscripten")]
-        pub mod emscripten;
-        #[cfg(target_os = "freebsd")]
-        pub mod freebsd;
-        #[cfg(target_os = "fuchsia")]
-        pub mod fuchsia;
-        #[cfg(target_os = "haiku")]
-        pub mod haiku;
-        #[cfg(target_os = "illumos")]
-        pub mod illumos;
-        #[cfg(target_os = "ios")]
-        pub mod ios;
-        #[cfg(target_os = "l4re")]
-        pub mod linux;
-        #[cfg(target_os = "linux")]
-        pub mod linux;
-        #[cfg(target_os = "macos")]
-        pub mod macos;
-        #[cfg(target_os = "netbsd")]
-        pub mod netbsd;
-        #[cfg(target_os = "openbsd")]
-        pub mod openbsd;
-        #[cfg(target_os = "redox")]
-        pub mod redox;
-        #[cfg(target_os = "solaris")]
-        pub mod solaris;
-
-        #[cfg(target_os = "vxworks")]
-        pub mod vxworks;
-
-        #[cfg(target_os = "wasi")]
-        pub mod wasi;
-
-        #[cfg(windows)]
-        pub mod windows;
-    }
+// The code below could be written clearer using `cfg_if!`. However, the items below are
+// publicly exported by `std` and external tools can have trouble analysing them because of the use
+// of a macro that is not vendored by Rust and included in the toolchain.
+// See https://github.com/rust-analyzer/rust-analyzer/issues/6038.
+
+#[cfg(all(
+    doc,
+    not(any(
+        target_os = "hermit",
+        all(target_arch = "wasm32", not(target_os = "wasi")),
+        all(target_vendor = "fortanix", target_env = "sgx")
+    ))
+))]
+#[path = "."]
+mod doc {
+    // When documenting std we want to show the `unix`, `windows`, `linux` and `wasi`
+    // modules as these are the "main modules" that are used across platforms,
+    // so these modules are enabled when `cfg(doc)` is set.
+    // This should help show platform-specific functionality in a hopefully cross-platform
+    // way in the documentation.
+
+    pub mod unix;
+
+    pub mod linux;
+
+    pub mod wasi;
+
+    pub mod windows;
 }
+#[cfg(all(
+    doc,
+    any(
+        target_os = "hermit",
+        all(target_arch = "wasm32", not(target_os = "wasi")),
+        all(target_vendor = "fortanix", target_env = "sgx")
+    )
+))]
+mod doc {
+    // On certain platforms right now the "main modules" modules that are
+    // documented don't compile (missing things in `libc` which is empty),
+    // so just omit them with an empty module.
+
+    #[unstable(issue = "none", feature = "std_internals")]
+    pub mod unix {}
+
+    #[unstable(issue = "none", feature = "std_internals")]
+    pub mod linux {}
+
+    #[unstable(issue = "none", feature = "std_internals")]
+    pub mod wasi {}
+
+    #[unstable(issue = "none", feature = "std_internals")]
+    pub mod windows {}
+}
+#[cfg(doc)]
+#[stable(feature = "os", since = "1.0.0")]
+pub use doc::*;
+
+#[cfg(not(doc))]
+#[path = "."]
+mod imp {
+    // If we're not documenting std then we only expose modules appropriate for the
+    // current platform.
+
+    #[cfg(all(target_vendor = "fortanix", target_env = "sgx"))]
+    pub mod fortanix_sgx;
+
+    #[cfg(target_os = "hermit")]
+    #[path = "hermit/mod.rs"]
+    pub mod unix;
+
+    #[cfg(target_os = "android")]
+    pub mod android;
+    #[cfg(target_os = "dragonfly")]
+    pub mod dragonfly;
+    #[cfg(target_os = "emscripten")]
+    pub mod emscripten;
+    #[cfg(target_os = "freebsd")]
+    pub mod freebsd;
+    #[cfg(target_os = "fuchsia")]
+    pub mod fuchsia;
+    #[cfg(target_os = "haiku")]
+    pub mod haiku;
+    #[cfg(target_os = "illumos")]
+    pub mod illumos;
+    #[cfg(target_os = "ios")]
+    pub mod ios;
+    #[cfg(target_os = "l4re")]
+    pub mod linux;
+    #[cfg(target_os = "linux")]
+    pub mod linux;
+    #[cfg(target_os = "macos")]
+    pub mod macos;
+    #[cfg(target_os = "netbsd")]
+    pub mod netbsd;
+    #[cfg(target_os = "openbsd")]
+    pub mod openbsd;
+    #[cfg(target_os = "redox")]
+    pub mod redox;
+    #[cfg(target_os = "solaris")]
+    pub mod solaris;
+    #[cfg(unix)]
+    pub mod unix;
+
+    #[cfg(target_os = "vxworks")]
+    pub mod vxworks;
+
+    #[cfg(target_os = "wasi")]
+    pub mod wasi;
+
+    #[cfg(windows)]
+    pub mod windows;
+}
+#[cfg(not(doc))]
+#[stable(feature = "os", since = "1.0.0")]
+pub use imp::*;
diff --git a/library/std/src/os/unix/mod.rs b/library/std/src/os/unix/mod.rs
index a93ed333cec..6fc1c89a2ba 100644
--- a/library/std/src/os/unix/mod.rs
+++ b/library/std/src/os/unix/mod.rs
@@ -28,42 +28,42 @@
 #![stable(feature = "rust1", since = "1.0.0")]
 #![doc(cfg(unix))]
 
-cfg_if::cfg_if! {
-    if #[cfg(doc)] {
-        // Use linux as the default platform when documenting on other platforms like Windows
-        use crate::os::linux as platform;
-    } else {
-        #[cfg(target_os = "android")]
-        use crate::os::android as platform;
-        #[cfg(target_os = "dragonfly")]
-        use crate::os::dragonfly as platform;
-        #[cfg(target_os = "emscripten")]
-        use crate::os::emscripten as platform;
-        #[cfg(target_os = "freebsd")]
-        use crate::os::freebsd as platform;
-        #[cfg(target_os = "fuchsia")]
-        use crate::os::fuchsia as platform;
-        #[cfg(target_os = "haiku")]
-        use crate::os::haiku as platform;
-        #[cfg(target_os = "illumos")]
-        use crate::os::illumos as platform;
-        #[cfg(target_os = "ios")]
-        use crate::os::ios as platform;
-        #[cfg(any(target_os = "linux", target_os = "l4re"))]
-        use crate::os::linux as platform;
-        #[cfg(target_os = "macos")]
-        use crate::os::macos as platform;
-        #[cfg(target_os = "netbsd")]
-        use crate::os::netbsd as platform;
-        #[cfg(target_os = "openbsd")]
-        use crate::os::openbsd as platform;
-        #[cfg(target_os = "redox")]
-        use crate::os::redox as platform;
-        #[cfg(target_os = "solaris")]
-        use crate::os::solaris as platform;
-        #[cfg(target_os = "vxworks")]
-        use crate::os::vxworks as platform;
-    }
+// Use linux as the default platform when documenting on other platforms like Windows
+#[cfg(doc)]
+use crate::os::linux as platform;
+
+#[cfg(not(doc))]
+mod platform {
+    #[cfg(target_os = "android")]
+    pub use crate::os::android::*;
+    #[cfg(target_os = "dragonfly")]
+    pub use crate::os::dragonfly::*;
+    #[cfg(target_os = "emscripten")]
+    pub use crate::os::emscripten::*;
+    #[cfg(target_os = "freebsd")]
+    pub use crate::os::freebsd::*;
+    #[cfg(target_os = "fuchsia")]
+    pub use crate::os::fuchsia::*;
+    #[cfg(target_os = "haiku")]
+    pub use crate::os::haiku::*;
+    #[cfg(target_os = "illumos")]
+    pub use crate::os::illumos::*;
+    #[cfg(target_os = "ios")]
+    pub use crate::os::ios::*;
+    #[cfg(any(target_os = "linux", target_os = "l4re"))]
+    pub use crate::os::linux::*;
+    #[cfg(target_os = "macos")]
+    pub use crate::os::macos::*;
+    #[cfg(target_os = "netbsd")]
+    pub use crate::os::netbsd::*;
+    #[cfg(target_os = "openbsd")]
+    pub use crate::os::openbsd::*;
+    #[cfg(target_os = "redox")]
+    pub use crate::os::redox::*;
+    #[cfg(target_os = "solaris")]
+    pub use crate::os::solaris::*;
+    #[cfg(target_os = "vxworks")]
+    pub use crate::os::vxworks::*;
 }
 
 pub mod ffi;