Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
70639c8
Fixing shellcheck comments on lvi test script
raoulstrackx Feb 27, 2024
c3954b3
Add a tidy check that checks whether the fluent slugs only appear once
mu001999 Mar 2, 2024
d88c7ff
Remove unused fluent messages
mu001999 Mar 2, 2024
489dcf2
skip sanity check for non-host targets in `check` builds
onur-ozkan Mar 2, 2024
fbb97ed
Avoid some interning in bootstrap
Noratrieb Feb 24, 2024
1195518
Helper function for resolve_path
kornelski Mar 1, 2024
25ab1c7
Suggest correct path in include_bytes!
kornelski Mar 1, 2024
fbb2129
Fix test for multiline span ui display
estebank Mar 3, 2024
9693a46
Move multispan test to svg output
estebank Mar 3, 2024
e119b32
When displaying multispans, ignore empty lines adjacent to `...`
estebank Mar 5, 2024
7843e46
Factor out non-branch-related pattern data
Nadrieril Mar 9, 2024
594cf1d
review
Nadrieril Mar 9, 2024
2dd05e8
Error on invalid compiletest directives in Rust test files
jieyouxu Feb 24, 2024
046c28f
Fix invalid compiletest directives in tests
jieyouxu Feb 24, 2024
092a1ab
fix: remove memory leak due to missing drop implementation for local …
tvallotton Mar 9, 2024
ff1459a
Add test to check unused_lifetimes don't duplicate "parameter is neve…
jieyouxu Mar 9, 2024
0953296
Rollup merge of #121561 - jieyouxu:compiletest-directive-typo-check, …
matthiaskrgr Mar 9, 2024
245a663
Rollup merge of #121567 - Nilstrieb:less-interning, r=albertlarsan68
matthiaskrgr Mar 9, 2024
3481e05
Rollup merge of #121685 - fortanix:raoul/shellcheck_on_lvi_test_scrip…
matthiaskrgr Mar 9, 2024
c991ec4
Rollup merge of #121833 - kornelski:parent_include, r=estebank
matthiaskrgr Mar 9, 2024
5ea1672
Rollup merge of #121860 - mu001999:master, r=Nilstrieb
matthiaskrgr Mar 9, 2024
6e14b65
Rollup merge of #121907 - onur-ozkan:better-target-sanity-check, r=al…
matthiaskrgr Mar 9, 2024
eae182c
Rollup merge of #122029 - estebank:drive-by-ui-test, r=oli-obk
matthiaskrgr Mar 9, 2024
f31e4dc
Rollup merge of #122221 - Nadrieril:patextradata, r=oli-obk
matthiaskrgr Mar 9, 2024
8d232c9
Rollup merge of #122244 - tvallotton:local_waker_leak_fix, r=Nilstrieb
matthiaskrgr Mar 9, 2024
9814eda
Rollup merge of #122251 - jieyouxu:unused-lifetimes-dedup-test, r=Nad…
matthiaskrgr Mar 9, 2024
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
Prev Previous commit
Next Next commit
Add a tidy check that checks whether the fluent slugs only appear once
  • Loading branch information
mu001999 committed Mar 2, 2024
commit c3954b358f9e2be96d0dd553a8efaefc49f0bba7
58 changes: 52 additions & 6 deletions src/tools/tidy/src/fluent_alphabetical.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
//! Checks that all Flunt files have messages in alphabetical order

use crate::walk::{filter_dirs, walk};
use std::collections::HashMap;
use std::{fs::OpenOptions, io::Write, path::Path};

use regex::Regex;
Expand All @@ -13,11 +14,27 @@ fn filter_fluent(path: &Path) -> bool {
if let Some(ext) = path.extension() { ext.to_str() != Some("ftl") } else { true }
}

fn check_alphabetic(filename: &str, fluent: &str, bad: &mut bool) {
fn check_alphabetic(
filename: &str,
fluent: &str,
bad: &mut bool,
all_defined_msgs: &mut HashMap<String, String>,
) {
let mut matches = MESSAGE.captures_iter(fluent).peekable();
while let Some(m) = matches.next() {
let name = m.get(1).unwrap();
if let Some(defined_filename) = all_defined_msgs.get(name.as_str()) {
tidy_error!(
bad,
"{filename}: message `{}` is already defined in {}",
name.as_str(),
defined_filename,
);
}

all_defined_msgs.insert(name.as_str().to_owned(), filename.to_owned());

if let Some(next) = matches.peek() {
let name = m.get(1).unwrap();
let next = next.get(1).unwrap();
if name.as_str() > next.as_str() {
tidy_error!(
Expand All @@ -34,13 +51,29 @@ run `./x.py test tidy --bless` to sort the file correctly",
}
}

fn sort_messages(fluent: &str) -> String {
fn sort_messages(
filename: &str,
fluent: &str,
bad: &mut bool,
all_defined_msgs: &mut HashMap<String, String>,
) -> String {
let mut chunks = vec![];
let mut cur = String::new();
for line in fluent.lines() {
if MESSAGE.is_match(line) {
if let Some(name) = MESSAGE.find(line) {
if let Some(defined_filename) = all_defined_msgs.get(name.as_str()) {
tidy_error!(
bad,
"{filename}: message `{}` is already defined in {}",
name.as_str(),
defined_filename,
);
}

all_defined_msgs.insert(name.as_str().to_owned(), filename.to_owned());
chunks.push(std::mem::take(&mut cur));
}

cur += line;
cur.push('\n');
}
Expand All @@ -53,20 +86,33 @@ fn sort_messages(fluent: &str) -> String {
}

pub fn check(path: &Path, bless: bool, bad: &mut bool) {
let mut all_defined_msgs = HashMap::new();
walk(
path,
|path, is_dir| filter_dirs(path) || (!is_dir && filter_fluent(path)),
&mut |ent, contents| {
if bless {
let sorted = sort_messages(contents);
let sorted = sort_messages(
ent.path().to_str().unwrap(),
contents,
bad,
&mut all_defined_msgs,
);
if sorted != contents {
let mut f =
OpenOptions::new().write(true).truncate(true).open(ent.path()).unwrap();
f.write(sorted.as_bytes()).unwrap();
}
} else {
check_alphabetic(ent.path().to_str().unwrap(), contents, bad);
check_alphabetic(
ent.path().to_str().unwrap(),
contents,
bad,
&mut all_defined_msgs,
);
}
},
);

crate::fluent_used::check(path, all_defined_msgs, bad);
}
43 changes: 43 additions & 0 deletions src/tools/tidy/src/fluent_used.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
//! Checks that all Fluent messages appear at least twice

use crate::walk::{filter_dirs, walk};
use regex::Regex;
use std::collections::HashMap;
use std::path::Path;

lazy_static::lazy_static! {
static ref WORD: Regex = Regex::new(r"\w+").unwrap();
}

fn filter_used_messages(
contents: &str,
msgs_not_appeared_yet: &mut HashMap<String, String>,
msgs_appeared_only_once: &mut HashMap<String, String>,
) {
// we don't just check messages never appear in Rust files,
// because messages can be used as parts of other fluent messages in Fluent files,
// so we do checking messages appear only once in all Rust and Fluent files.
let mut matches = WORD.find_iter(contents);
while let Some(name) = matches.next() {
if let Some((name, filename)) = msgs_not_appeared_yet.remove_entry(name.as_str()) {
// if one msg appears for the first time,
// remove it from `msgs_not_appeared_yet` and insert it into `msgs_appeared_only_once`.
msgs_appeared_only_once.insert(name, filename);
} else {
// if one msg appears for the second time,
// remove it from `msgs_appeared_only_once`.
msgs_appeared_only_once.remove(name.as_str());
}
}
}

pub fn check(path: &Path, mut all_defined_msgs: HashMap<String, String>, bad: &mut bool) {
let mut msgs_appear_only_once = HashMap::new();
walk(path, |path, _| filter_dirs(path), &mut |_, contents| {
filter_used_messages(contents, &mut all_defined_msgs, &mut msgs_appear_only_once);
});

for (name, filename) in msgs_appear_only_once {
tidy_error!(bad, "{filename}: message `{}` is not used", name,);
}
}
1 change: 1 addition & 0 deletions src/tools/tidy/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ pub mod ext_tool_checks;
pub mod extdeps;
pub mod features;
pub mod fluent_alphabetical;
mod fluent_used;
pub(crate) mod iter_header;
pub mod mir_opt_tests;
pub mod pal;
Expand Down