Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Wrap iter_header callback arguments in a documentable struct
  • Loading branch information
Zalathar committed Feb 17, 2024
commit 488ffaa7260901a13ac3e51a6ba06f26b976e9cd
36 changes: 24 additions & 12 deletions src/tools/compiletest/src/header.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ impl EarlyProps {
&mut poisoned,
testfile,
rdr,
&mut |_, _, ln, _| {
&mut |HeaderLine { directive: ln, .. }| {
config.push_name_value_directive(ln, directives::AUX_BUILD, &mut props.aux, |r| {
r.trim().to_string()
});
Expand Down Expand Up @@ -330,8 +330,8 @@ impl TestProps {
&mut poisoned,
testfile,
file,
&mut |revision, _, ln, _| {
if revision.is_some() && revision != cfg {
&mut |HeaderLine { header_revision, directive: ln, .. }| {
if header_revision.is_some() && header_revision != cfg {
return;
}

Expand Down Expand Up @@ -678,7 +678,7 @@ fn iter_header<R: Read>(
poisoned: &mut bool,
testfile: &Path,
rdr: R,
it: &mut dyn FnMut(Option<&str>, &str, &str, usize),
it: &mut dyn FnMut(HeaderLine<'_>),
) {
iter_header_extra(mode, suite, poisoned, testfile, rdr, &[], it)
}
Expand Down Expand Up @@ -801,14 +801,26 @@ const DIAGNOSTICS_DIRECTIVE_NAMES: &[&str] = &[
"unset-rustc-env",
];

/// Arguments passed to the callback in [`iter_header`].
struct HeaderLine<'ln> {
/// Contents of the square brackets preceding this header, if present.
header_revision: Option<&'ln str>,
/// Raw line from the test file, including comment prefix and any revision.
original_line: &'ln str,
/// Remainder of the directive line, after the initial comment prefix
/// (`//` or `//@` or `#`) and revision (if any) have been stripped.
directive: &'ln str,
line_number: usize,
}

fn iter_header_extra(
mode: Mode,
suite: &str,
poisoned: &mut bool,
testfile: &Path,
rdr: impl Read,
extra_directives: &[&str],
it: &mut dyn FnMut(Option<&str>, &str, &str, usize),
it: &mut dyn FnMut(HeaderLine<'_>),
) {
if testfile.is_dir() {
return;
Expand All @@ -817,7 +829,7 @@ fn iter_header_extra(
// Process any extra directives supplied by the caller (e.g. because they
// are implied by the test mode), with a dummy line number of 0.
for directive in extra_directives {
it(None, directive, directive, 0);
it(HeaderLine { header_revision: None, original_line: "", directive, line_number: 0 });
}

let comment = if testfile.extension().is_some_and(|e| e == "rs") {
Expand All @@ -843,14 +855,14 @@ fn iter_header_extra(
// Assume that any directives will be found before the first
// module or function. This doesn't seem to be an optimization
// with a warm page cache. Maybe with a cold one.
let orig_ln = &ln;
let original_line = &ln;
let ln = ln.trim();
if ln.starts_with("fn") || ln.starts_with("mod") {
return;

// First try to accept `ui_test` style comments
} else if let Some((lncfg, ln)) = line_directive(comment, ln) {
it(lncfg, orig_ln, ln, line_number);
} else if let Some((header_revision, directive)) = line_directive(comment, ln) {
it(HeaderLine { header_revision, original_line, directive, line_number });
} else if mode == Mode::Ui && suite == "ui" && !REVISION_MAGIC_COMMENT_RE.is_match(ln) {
let Some((_, rest)) = line_directive("//", ln) else {
continue;
Expand Down Expand Up @@ -1179,8 +1191,8 @@ pub fn make_test_description<R: Read>(
path,
src,
extra_directives,
&mut |revision, og_ln, ln, line_number| {
if revision.is_some() && revision != cfg {
&mut |HeaderLine { header_revision, original_line, directive: ln, line_number }| {
if header_revision.is_some() && header_revision != cfg {
return;
}

Expand All @@ -1204,7 +1216,7 @@ pub fn make_test_description<R: Read>(
};
}

if let Some((_, post)) = og_ln.trim_start().split_once("//") {
if let Some((_, post)) = original_line.trim_start().split_once("//") {
let post = post.trim_start();
if post.starts_with("ignore-tidy")
&& config.mode == Mode::Ui
Expand Down