| 
18 | 18 | // ignore-tidy-dbg  | 
19 | 19 | 
 
  | 
20 | 20 | use crate::walk::{filter_dirs, walk};  | 
21 |  | -use regex::RegexSet;  | 
22 | 21 | use rustc_hash::FxHashMap;  | 
23 |  | -use std::{ffi::OsStr, path::Path};  | 
 | 22 | +use std::{ffi::OsStr, path::Path, sync::LazyLock};  | 
24 | 23 | 
 
  | 
25 | 24 | #[cfg(test)]  | 
26 | 25 | mod tests;  | 
@@ -110,15 +109,32 @@ const ROOT_PROBLEMATIC_CONSTS: &[u32] = &[  | 
110 | 109 |     173390526, 721077,  | 
111 | 110 | ];  | 
112 | 111 | 
 
  | 
 | 112 | +#[cfg(not(test))]  | 
 | 113 | +const LETTER_DIGIT: &[(char, char)] = &[('A', '4'), ('B', '8'), ('E', '3')];  | 
 | 114 | + | 
 | 115 | +#[cfg(test)]  | 
 | 116 | +const LETTER_DIGIT: &[(char, char)] = &[('A', '4'), ('B', '8'), ('E', '3'), ('0', 'F')]; // use "futile" F intentionally  | 
 | 117 | + | 
113 | 118 | fn generate_problematic_strings(  | 
114 | 119 |     consts: &[u32],  | 
115 | 120 |     letter_digit: &FxHashMap<char, char>,  | 
116 | 121 | ) -> Vec<String> {  | 
117 | 122 |     generate_problems(consts, letter_digit)  | 
118 |  | -        .flat_map(|v| vec![v.to_string(), format!("{:x}", v), format!("{:X}", v)])  | 
 | 123 | +        .flat_map(|v| vec![v.to_string(), format!("{:X}", v)])  | 
119 | 124 |         .collect()  | 
120 | 125 | }  | 
121 | 126 | 
 
  | 
 | 127 | +static PROBLEMATIC_CONSTS_STRINGS: LazyLock<Vec<String>> = LazyLock::new(|| {  | 
 | 128 | +    generate_problematic_strings(  | 
 | 129 | +        ROOT_PROBLEMATIC_CONSTS,  | 
 | 130 | +        &FxHashMap::from_iter(LETTER_DIGIT.iter().copied()),  | 
 | 131 | +    )  | 
 | 132 | +});  | 
 | 133 | + | 
 | 134 | +fn contains_problematic_const(trimmed: &str) -> bool {  | 
 | 135 | +    PROBLEMATIC_CONSTS_STRINGS.iter().any(|s| trimmed.to_uppercase().contains(s))  | 
 | 136 | +}  | 
 | 137 | + | 
122 | 138 | const INTERNAL_COMPILER_DOCS_LINE: &str = "#### This error code is internal to the compiler and will not be emitted with normal Rust code.";  | 
123 | 139 | 
 
  | 
124 | 140 | /// Parser states for `line_is_url`.  | 
@@ -315,11 +331,6 @@ pub fn check(path: &Path, bad: &mut bool) {  | 
315 | 331 |         // We only check CSS files in rustdoc.  | 
316 | 332 |         path.extension().map_or(false, |e| e == "css") && !is_in(path, "src", "librustdoc")  | 
317 | 333 |     }  | 
318 |  | -    let problematic_consts_strings = generate_problematic_strings(  | 
319 |  | -        ROOT_PROBLEMATIC_CONSTS,  | 
320 |  | -        &[('A', '4'), ('B', '8'), ('E', '3')].iter().cloned().collect(),  | 
321 |  | -    );  | 
322 |  | -    let problematic_regex = RegexSet::new(problematic_consts_strings.as_slice()).unwrap();  | 
323 | 334 | 
 
  | 
324 | 335 |     walk(path, skip, &mut |entry, contents| {  | 
325 | 336 |         let file = entry.path();  | 
@@ -389,7 +400,6 @@ pub fn check(path: &Path, bad: &mut bool) {  | 
389 | 400 |         let is_test = file.components().any(|c| c.as_os_str() == "tests");  | 
390 | 401 |         // scanning the whole file for multiple needles at once is more efficient than  | 
391 | 402 |         // executing lines times needles separate searches.  | 
392 |  | -        let any_problematic_line = problematic_regex.is_match(contents);  | 
393 | 403 |         for (i, line) in contents.split('\n').enumerate() {  | 
394 | 404 |             if line.is_empty() {  | 
395 | 405 |                 if i == 0 {  | 
@@ -459,12 +469,8 @@ pub fn check(path: &Path, bad: &mut bool) {  | 
459 | 469 |                 if trimmed.contains("//") && trimmed.contains(" XXX") {  | 
460 | 470 |                     err("Instead of XXX use FIXME")  | 
461 | 471 |                 }  | 
462 |  | -                if any_problematic_line {  | 
463 |  | -                    for s in problematic_consts_strings.iter() {  | 
464 |  | -                        if trimmed.contains(s) {  | 
465 |  | -                            err("Don't use magic numbers that spell things (consider 0x12345678)");  | 
466 |  | -                        }  | 
467 |  | -                    }  | 
 | 472 | +                if contains_problematic_const(trimmed) {  | 
 | 473 | +                    err("Don't use magic numbers that spell things (consider 0x12345678)");  | 
468 | 474 |                 }  | 
469 | 475 |             }  | 
470 | 476 |             // for now we just check libcore  | 
 | 
0 commit comments