Skip to content

Commit

Permalink
Unrolled build for rust-lang#134840
Browse files Browse the repository at this point in the history
Rollup merge of rust-lang#134840 - Zalathar:normalize, r=jieyouxu

compiletest: Only pass the post-colon value to `parse_normalize_rule`

Addresses one of the FIXMEs noted in rust-lang#134759.

I started working on the other FIXME, but it became complex enough that I wanted to split it off from this PR.

r? jieyouxu
  • Loading branch information
rust-timer authored Dec 28, 2024
2 parents 7cb0849 + f557363 commit 2793225
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 22 deletions.
22 changes: 11 additions & 11 deletions src/tools/compiletest/src/header.rs
Original file line number Diff line number Diff line change
Expand Up @@ -978,10 +978,10 @@ impl Config {
}
}

fn parse_custom_normalization(&self, line: &str) -> Option<NormalizeRule> {
fn parse_custom_normalization(&self, raw_directive: &str) -> Option<NormalizeRule> {
// FIXME(Zalathar): Integrate name/value splitting into `DirectiveLine`
// instead of doing it here.
let (directive_name, _value) = line.split_once(':')?;
let (directive_name, raw_value) = raw_directive.split_once(':')?;

let kind = match directive_name {
"normalize-stdout" => NormalizeKind::Stdout,
Expand All @@ -991,11 +991,9 @@ impl Config {
_ => return None,
};

// FIXME(Zalathar): The normalize rule parser should only care about
// the value part, not the "line" (which isn't even the whole line).
let Some((regex, replacement)) = parse_normalize_rule(line) else {
let Some((regex, replacement)) = parse_normalize_rule(raw_value) else {
panic!(
"couldn't parse custom normalization rule: `{line}`\n\
"couldn't parse custom normalization rule: `{raw_directive}`\n\
help: expected syntax is: `{directive_name}: \"REGEX\" -> \"REPLACEMENT\"`"
);
};
Expand Down Expand Up @@ -1141,24 +1139,26 @@ enum NormalizeKind {
/// Parses the regex and replacement values of a `//@ normalize-*` header,
/// in the format:
/// ```text
/// normalize-*: "REGEX" -> "REPLACEMENT"
/// "REGEX" -> "REPLACEMENT"
/// ```
fn parse_normalize_rule(header: &str) -> Option<(String, String)> {
fn parse_normalize_rule(raw_value: &str) -> Option<(String, String)> {
// FIXME: Support escaped double-quotes in strings.
let captures = static_regex!(
r#"(?x) # (verbose mode regex)
^
[^:\s]+:\s* # (header name followed by colon)
\s* # (leading whitespace)
"(?<regex>[^"]*)" # "REGEX"
\s+->\s+ # ->
"(?<replacement>[^"]*)" # "REPLACEMENT"
$
"#
)
.captures(header)?;
.captures(raw_value)?;
let regex = captures["regex"].to_owned();
let replacement = captures["replacement"].to_owned();
// FIXME: Support escaped new-line in strings.
// A `\n` sequence in the replacement becomes an actual newline.
// FIXME: Do unescaping in a less ad-hoc way, and perhaps support escaped
// backslashes and double-quotes.
let replacement = replacement.replace("\\n", "\n");
Some((regex, replacement))
}
Expand Down
25 changes: 14 additions & 11 deletions src/tools/compiletest/src/header/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,14 @@ fn make_test_description<R: Read>(

#[test]
fn test_parse_normalize_rule() {
let good_data = &[(
r#"normalize-stderr-32bit: "something (32 bits)" -> "something ($WORD bits)""#,
"something (32 bits)",
"something ($WORD bits)",
)];
let good_data = &[
(
r#""something (32 bits)" -> "something ($WORD bits)""#,
"something (32 bits)",
"something ($WORD bits)",
),
(r#" " with whitespace" -> " replacement""#, " with whitespace", " replacement"),
];

for &(input, expected_regex, expected_replacement) in good_data {
let parsed = parse_normalize_rule(input);
Expand All @@ -49,15 +52,15 @@ fn test_parse_normalize_rule() {
}

let bad_data = &[
r#"normalize-stderr-32bit "something (32 bits)" -> "something ($WORD bits)""#,
r#"normalize-stderr-16bit: something (16 bits) -> something ($WORD bits)"#,
r#"normalize-stderr-32bit: something (32 bits) -> something ($WORD bits)"#,
r#"normalize-stderr-32bit: "something (32 bits) -> something ($WORD bits)"#,
r#"normalize-stderr-32bit: "something (32 bits)" -> "something ($WORD bits)"#,
r#"normalize-stderr-32bit: "something (32 bits)" -> "something ($WORD bits)"."#,
r#"something (11 bits) -> something ($WORD bits)"#,
r#"something (12 bits) -> something ($WORD bits)"#,
r#""something (13 bits) -> something ($WORD bits)"#,
r#""something (14 bits)" -> "something ($WORD bits)"#,
r#""something (15 bits)" -> "something ($WORD bits)"."#,
];

for &input in bad_data {
println!("- {input:?}");
let parsed = parse_normalize_rule(input);
assert_eq!(parsed, None);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
1st emitted line
second emitted line
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
first emitted line
2nd emitted line
20 changes: 20 additions & 0 deletions tests/ui/compiletest-self-test/normalize-with-revision.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//! Checks that `[rev] normalize-*` directives affect the specified revision,
//! and don't affect other revisions.
//!
//! This currently relies on the fact that `normalize-*` directives are
//! applied to run output, not just compiler output. If that ever changes,
//! this test might need to be adjusted.
//@ edition: 2021
//@ revisions: a b
//@ run-pass
//@ check-run-results

//@ normalize-stderr: "output" -> "emitted"
//@[a] normalize-stderr: "first" -> "1st"
//@[b] normalize-stderr: "second" -> "2nd"

fn main() {
eprintln!("first output line");
eprintln!("second output line");
}

0 comments on commit 2793225

Please sign in to comment.