Rollup merge of #120132 - oli-obk:helpful_tidy, r=Mark-Simulacrum

Teach tidy about line/col information for malformed features

This makes it significantly easier to find the specific feature, since you can now just click it in the command line of your IDE
This commit is contained in:
Matthias Krüger 2024-01-20 09:37:27 +01:00 committed by GitHub
commit 836bc69bd1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -15,7 +15,7 @@
use std::fmt;
use std::fs;
use std::num::NonZeroU32;
use std::path::Path;
use std::path::{Path, PathBuf};
use regex::Regex;
@ -52,6 +52,8 @@ pub struct Feature {
pub since: Option<Version>,
pub has_gate_test: bool,
pub tracking_issue: Option<NonZeroU32>,
pub file: PathBuf,
pub line: usize,
}
impl Feature {
fn tracking_issue_display(&self) -> impl fmt::Display {
@ -184,23 +186,25 @@ pub fn check(
.chain(lib_features.iter().map(|feat| (feat, "lib")));
for ((feature_name, feature), kind) in all_features_iter {
let since = if let Some(since) = feature.since { since } else { continue };
let file = feature.file.display();
let line = feature.line;
if since > version && since != Version::CurrentPlaceholder {
tidy_error!(
bad,
"The stabilization version {since} of {kind} feature `{feature_name}` is newer than the current {version}"
"{file}:{line}: The stabilization version {since} of {kind} feature `{feature_name}` is newer than the current {version}"
);
}
if channel == "nightly" && since == version {
tidy_error!(
bad,
"The stabilization version {since} of {kind} feature `{feature_name}` is written out but should be {}",
"{file}:{line}: The stabilization version {since} of {kind} feature `{feature_name}` is written out but should be {}",
version::VERSION_PLACEHOLDER
);
}
if channel != "nightly" && since == Version::CurrentPlaceholder {
tidy_error!(
bad,
"The placeholder use of {kind} feature `{feature_name}` is not allowed on the {channel} channel",
"{file}:{line}: The placeholder use of {kind} feature `{feature_name}` is not allowed on the {channel} channel",
);
}
}
@ -433,7 +437,14 @@ fn collect_lang_features_in(features: &mut Features, base: &Path, file: &str, ba
);
}
Entry::Vacant(e) => {
e.insert(Feature { level, since, has_gate_test: false, tracking_issue });
e.insert(Feature {
level,
since,
has_gate_test: false,
tracking_issue,
file: path.to_path_buf(),
line: line_number,
});
}
}
}
@ -559,6 +570,8 @@ macro_rules! err {
since: None,
has_gate_test: false,
tracking_issue: find_attr_val(line, "issue").and_then(handle_issue_none),
file: file.to_path_buf(),
line: i + 1,
};
mf(Ok((feature_name, feature)), file, i + 1);
continue;
@ -588,7 +601,14 @@ macro_rules! err {
};
let tracking_issue = find_attr_val(line, "issue").and_then(handle_issue_none);
let feature = Feature { level, since, has_gate_test: false, tracking_issue };
let feature = Feature {
level,
since,
has_gate_test: false,
tracking_issue,
file: file.to_path_buf(),
line: i + 1,
};
if line.contains(']') {
mf(Ok((feature_name, feature)), file, i + 1);
} else {