From 4a39daf6f3638554381b15b572e0331d722a3862 Mon Sep 17 00:00:00 2001
From: nori li <50680474+thenorili@users.noreply.github.com>
Date: Thu, 9 Nov 2023 19:23:31 -0800
Subject: [PATCH] Remove obsolete private_in_public lint in nightly and beta.
RFC 2145 is in beta now, deprecating the public_in_private lint.
https://rust-lang.github.io/rfcs/2145-type-privacy.html
public_in_private has been superceded by three new lints. The first two
are warn-by-default and the third is allow-by-default. See the excerpt
below for some details.
This change skips this lint in nightly and beta in favor of the new
warn-by-default lints.
This change revealed a bug in the toolchain config option for
color-spantrace -- it doesn't exist! The lint it was guarding was never
turned on. This adds a minimal build script to check for toolchain to
color-spantrace. Its functionality is tested in the eyre crate, which
seems sufficient to me.
After this change there are only two more build warnings for eyre and
color-spantrace, the future-incompat dependency warning and the more
serious filename collision.
Lint private_interfaces is reported when a type with visibility x is
used in primary interface of an item with effective visibility y and
x < y. This lint is warn-by-default.
Lint private_bounds is reported when a type or trait with visibility
x is used in secondary interface of an item with effective
visibility y and x < y. This lint is warn-by-default.
Lint unnameable_types is reported when effective visibility of a
type is larger than module in which it can be named, either
directly, or through reexports, or through trivial type aliases
(type X = Y;, no generics on both sides). This lint is
allow-by-default.
Compatibility lint private_in_public is never reported and removed.
---
color-spantrace/build.rs | 53 ++++++++++++++++++++++++++++++++++++
color-spantrace/src/lib.rs | 4 +--
eyre/build.rs | 31 +++++++++++++++++----
eyre/src/lib.rs | 4 +--
eyre/tests/test_toolchain.rs | 31 ++++++++++++++++-----
5 files changed, 106 insertions(+), 17 deletions(-)
create mode 100644 color-spantrace/build.rs
diff --git a/color-spantrace/build.rs b/color-spantrace/build.rs
new file mode 100644
index 0000000..aae2878
--- /dev/null
+++ b/color-spantrace/build.rs
@@ -0,0 +1,53 @@
+use std::env;
+use std::ffi::OsString;
+use std::process::Command;
+use std::str;
+
+fn main() {
+ let version = match rustc_version_info() {
+ Some(version) => version,
+ None => return,
+ };
+ version.toolchain.set_feature();
+}
+
+#[derive(PartialEq)]
+enum Toolchain {
+ Stable,
+ Beta,
+ Nightly,
+}
+
+impl Toolchain {
+ fn set_feature(self) {
+ match self {
+ Toolchain::Nightly => println!("cargo:rustc-cfg=nightly"),
+ Toolchain::Beta => println!("cargo:rustc-cfg=beta"),
+ Toolchain::Stable => println!("cargo:rustc-cfg=stable"),
+ }
+ }
+}
+
+struct VersionInfo {
+ toolchain: Toolchain,
+}
+
+fn rustc_version_info() -> Option {
+ let rustc = env::var_os("RUSTC").unwrap_or_else(|| OsString::from("rustc"));
+ let output = Command::new(rustc).arg("--version").output().ok()?;
+ let version = str::from_utf8(&output.stdout).ok()?;
+ let mut pieces = version.split(['.', ' ', '-']);
+ if pieces.next() != Some("rustc") {
+ return None;
+ }
+ let _major: u32 = pieces.next()?.parse().ok()?;
+ let _minor: u32 = pieces.next()?.parse().ok()?;
+ let _patch: u32 = pieces.next()?.parse().ok()?;
+ let toolchain = match pieces.next() {
+ Some("beta") => Toolchain::Beta,
+ Some("nightly") => Toolchain::Nightly,
+ _ => Toolchain::Stable,
+ };
+ let version = VersionInfo { toolchain };
+ Some(version)
+}
diff --git a/color-spantrace/src/lib.rs b/color-spantrace/src/lib.rs
index 80a0cee..61fc923 100644
--- a/color-spantrace/src/lib.rs
+++ b/color-spantrace/src/lib.rs
@@ -61,10 +61,11 @@
//! [`color-backtrace`]: https://github.com/athre0z/color-backtrace
#![doc(html_root_url = "https://docs.rs/color-spantrace/0.2.0")]
#![cfg_attr(
- nightly_features,
+ nightly,
feature(rustdoc_missing_doc_code_examples),
warn(rustdoc::missing_doc_code_examples)
)]
+#![cfg_attr(stable, warn(private_in_public))]
#![warn(
missing_debug_implementations,
missing_docs,
@@ -78,7 +79,6 @@
overflowing_literals,
path_statements,
patterns_in_fns_without_body,
- private_in_public,
unconditional_recursion,
unused,
unused_allocation,
diff --git a/eyre/build.rs b/eyre/build.rs
index bb63ea9..e0b2d29 100644
--- a/eyre/build.rs
+++ b/eyre/build.rs
@@ -61,9 +61,7 @@ fn main() {
None => return,
};
- if version.is_nightly {
- println!("cargo:rustc-cfg=nightly_features");
- }
+ version.toolchain.set_feature();
if version.minor < 52 {
println!("cargo:rustc-cfg=eyre_no_fmt_arguments_as_str");
@@ -91,9 +89,26 @@ fn compile_probe(probe: &str) -> Option {
.ok()
}
+// TODO factor this toolchain parsing and related tests into its own file
+#[derive(PartialEq)]
+enum Toolchain {
+ Stable,
+ Beta,
+ Nightly,
+}
+impl Toolchain {
+ fn set_feature(self) {
+ match self {
+ Toolchain::Nightly => println!("cargo:rustc-cfg=nightly"),
+ Toolchain::Beta => println!("cargo:rustc-cfg=beta"),
+ Toolchain::Stable => println!("cargo:rustc-cfg=stable"),
+ }
+ }
+}
+
struct VersionInfo {
minor: u32,
- is_nightly: bool,
+ toolchain: Toolchain,
}
fn rustc_version_info() -> Option {
@@ -107,7 +122,11 @@ fn rustc_version_info() -> Option {
let _major: u32 = pieces.next()?.parse().ok()?;
let minor = pieces.next()?.parse().ok()?;
let _patch: u32 = pieces.next()?.parse().ok()?;
- let is_nightly = pieces.next() == Some("nightly");
- let version = VersionInfo { minor, is_nightly };
+ let toolchain = match pieces.next() {
+ Some("beta") => Toolchain::Beta,
+ Some("nightly") => Toolchain::Nightly,
+ _ => Toolchain::Stable,
+ };
+ let version = VersionInfo { minor, toolchain };
Some(version)
}
diff --git a/eyre/src/lib.rs b/eyre/src/lib.rs
index 39d4316..bce3b23 100644
--- a/eyre/src/lib.rs
+++ b/eyre/src/lib.rs
@@ -316,10 +316,11 @@
//! [`color-backtrace`]: https://github.com/athre0z/color-backtrace
#![doc(html_root_url = "https://docs.rs/eyre/0.6.8")]
#![cfg_attr(
- nightly_features,
+ nightly,
feature(rustdoc_missing_doc_code_examples),
warn(rustdoc::missing_doc_code_examples)
)]
+#![cfg_attr(stable, warn(private_in_public))]
#![warn(
missing_debug_implementations,
missing_docs,
@@ -334,7 +335,6 @@
overflowing_literals,
path_statements,
patterns_in_fns_without_body,
- private_in_public,
unconditional_recursion,
unused,
unused_allocation,
diff --git a/eyre/tests/test_toolchain.rs b/eyre/tests/test_toolchain.rs
index fc54cd6..0309398 100644
--- a/eyre/tests/test_toolchain.rs
+++ b/eyre/tests/test_toolchain.rs
@@ -1,17 +1,34 @@
+// These tests check our build script against rustversion.
+
#[rustversion::attr(not(nightly), ignore)]
-//#[cfg_attr(miri, ignore)]
#[test]
fn nightlytest() {
- if !cfg!(nightly_features) {
- panic!("nightly feature isn't set when the toolchain is nightly");
+ if !cfg!(nightly) {
+ panic!("nightly feature isn't set when the toolchain is nightly.");
+ }
+ if cfg!(any(beta, stable)) {
+ panic!("beta, stable, and nightly are mutually exclusive features.")
+ }
+}
+
+#[rustversion::attr(not(beta), ignore)]
+#[test]
+fn betatest() {
+ if !cfg!(beta) {
+ panic!("beta feature is not set when the toolchain is beta.");
+ }
+ if cfg!(any(nightly, stable)) {
+ panic!("beta, stable, and nightly are mutually exclusive features.")
}
}
-#[rustversion::attr(nightly, ignore)]
-//#[cfg_attr(miri, ignore)]
+#[rustversion::attr(not(stable), ignore)]
#[test]
fn stabletest() {
- if cfg!(nightly_features) {
- panic!("nightly feature is set when the toolchain isn't nightly");
+ if !cfg!(stable) {
+ panic!("stable feature is not set when the toolchain is stable.");
+ }
+ if cfg!(any(nightly, beta)) {
+ panic!("beta, stable, and nightly are mutually exclusive features.")
}
}