@@ -5,6 +5,8 @@ use std::fs::OpenOptions;
55use std:: io:: Write ;
66use std:: path:: Path ;
77
8+ use fluent_syntax:: ast:: Entry ;
9+ use fluent_syntax:: parser;
810use regex:: Regex ;
911
1012use crate :: diagnostics:: { CheckId , DiagCtx , RunningCheck } ;
@@ -24,30 +26,31 @@ fn check_alphabetic(
2426 check : & mut RunningCheck ,
2527 all_defined_msgs : & mut HashMap < String , String > ,
2628) {
27- let mut matches = message ( ) . captures_iter ( fluent) . peekable ( ) ;
28- while let Some ( m) = matches. next ( ) {
29- let name = m. get ( 1 ) . unwrap ( ) ;
30- if let Some ( defined_filename) = all_defined_msgs. get ( name. as_str ( ) ) {
31- check. error ( format ! (
32- "{filename}: message `{}` is already defined in {defined_filename}" ,
33- name. as_str( ) ,
34- ) ) ;
35- }
29+ let Ok ( resource) = parser:: parse ( fluent) else {
30+ panic ! ( "Errors encountered while parsing fluent file `{filename}`" ) ;
31+ } ;
3632
37- all_defined_msgs . insert ( name . as_str ( ) . to_owned ( ) , filename . to_owned ( ) ) ;
33+ let mut prev : Option < & str > = None ;
3834
39- if let Some ( next) = matches. peek ( ) {
40- let next = next. get ( 1 ) . unwrap ( ) ;
41- if name. as_str ( ) > next. as_str ( ) {
35+ for entry in & resource. body {
36+ if let Entry :: Message ( msg) = entry {
37+ let name: & str = msg. id . name ;
38+ if let Some ( defined_filename) = all_defined_msgs. get ( name) {
4239 check. error ( format ! (
43- "{filename}: message `{}` appears before `{}`, but is alphabetically later than it
44- run `./x.py test tidy --bless` to sort the file correctly" ,
45- name. as_str( ) ,
46- next. as_str( )
40+ "{filename}: message `{name}` is already defined in {defined_filename}" ,
41+ ) ) ;
42+ } else {
43+ all_defined_msgs. insert ( name. to_string ( ) , filename. to_owned ( ) ) ;
44+ }
45+ if let Some ( prev) = prev
46+ && prev > name
47+ {
48+ check. error ( format ! (
49+ "{filename}: message `{prev}` appears before `{name}`, but is alphabetically \
50+ later than it. Run `./x.py test tidy --bless` to sort the file correctly",
4751 ) ) ;
4852 }
49- } else {
50- break ;
53+ prev = Some ( name) ;
5154 }
5255 }
5356}
0 commit comments