From 58ae216d73356ed0e90e48f09b3e5eaadb8fdbe5 Mon Sep 17 00:00:00 2001 From: Zalathar Date: Sun, 18 Feb 2024 00:39:12 +1100 Subject: [PATCH] Wrap `iter_header` callback arguments in a documentable struct --- src/tools/compiletest/src/header.rs | 45 +++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/src/tools/compiletest/src/header.rs b/src/tools/compiletest/src/header.rs index 4ceb8a646e060..7b37e5ebb3a9f 100644 --- a/src/tools/compiletest/src/header.rs +++ b/src/tools/compiletest/src/header.rs @@ -54,7 +54,7 @@ impl EarlyProps { &mut poisoned, testfile, rdr, - &mut |_, _, ln, _| { + &mut |IterHeaderCallbackArgs { directive: ln, .. }| { config.push_name_value_directive(ln, directives::AUX_BUILD, &mut props.aux, |r| { r.trim().to_string() }); @@ -329,8 +329,8 @@ impl TestProps { &mut poisoned, testfile, file, - &mut |revision, _, ln, _| { - if revision.is_some() && revision != cfg { + &mut |IterHeaderCallbackArgs { header_revision, directive: ln, .. }| { + if header_revision.is_some() && header_revision != cfg { return; } @@ -677,7 +677,7 @@ fn iter_header( poisoned: &mut bool, testfile: &Path, rdr: R, - it: &mut dyn FnMut(Option<&str>, &str, &str, usize), + it: &mut dyn FnMut(IterHeaderCallbackArgs<'_>), ) { iter_header_extra(mode, suite, poisoned, testfile, rdr, &[], it) } @@ -800,6 +800,17 @@ const DIAGNOSTICS_DIRECTIVE_NAMES: &[&str] = &[ "unset-rustc-env", ]; +struct IterHeaderCallbackArgs<'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, @@ -807,7 +818,7 @@ fn iter_header_extra( testfile: &Path, rdr: impl Read, extra_directives: &[&str], - it: &mut dyn FnMut(Option<&str>, &str, &str, usize), + it: &mut dyn FnMut(IterHeaderCallbackArgs<'_>), ) { if testfile.is_dir() { return; @@ -816,7 +827,12 @@ 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(IterHeaderCallbackArgs { + header_revision: None, + original_line: directive, + directive, + line_number: 0, + }); } let comment = if testfile.extension().is_some_and(|e| e == "rs") { @@ -841,14 +857,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(IterHeaderCallbackArgs { header_revision, original_line, directive, line_number }); } else if mode == Mode::Ui && suite == "ui" && !revision_magic_comment.is_match(ln) { let Some((_, rest)) = line_directive("//", ln) else { continue; @@ -1177,8 +1193,13 @@ pub fn make_test_description( path, src, extra_directives, - &mut |revision, og_ln, ln, line_number| { - if revision.is_some() && revision != cfg { + &mut |IterHeaderCallbackArgs { + header_revision, + original_line, + directive: ln, + line_number, + }| { + if header_revision.is_some() && header_revision != cfg { return; } @@ -1202,7 +1223,7 @@ pub fn make_test_description( }; } - 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