@@ -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,29 @@ 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 resource = parser:: parse ( fluent) . expect ( "Errors encountered while parsing a resource." ) ;
3630
37- all_defined_msgs . insert ( name . as_str ( ) . to_owned ( ) , filename . to_owned ( ) ) ;
31+ let mut prev : Option < & str > = None ;
3832
39- if let Some ( next) = matches. peek ( ) {
40- let next = next. get ( 1 ) . unwrap ( ) ;
41- if name. as_str ( ) > next. as_str ( ) {
33+ for entry in & resource. body {
34+ if let Entry :: Message ( msg) = entry {
35+ let name: & str = msg. id . name ;
36+ if let Some ( defined_filename) = all_defined_msgs. get ( name) {
4237 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( )
38+ "{filename}: message `{name}` is already defined in {defined_filename}" ,
39+ ) ) ;
40+ } else {
41+ all_defined_msgs. insert ( name. to_string ( ) , filename. to_owned ( ) ) ;
42+ }
43+ if let Some ( prev) = prev
44+ && prev > name
45+ {
46+ check. error ( format ! (
47+ "{filename}: message `{prev}` appears before `{name}`, but is alphabetically \
48+ later than it run `./x.py test tidy --bless` to sort the file correctly",
4749 ) ) ;
4850 }
49- } else {
50- break ;
51+ prev = Some ( name) ;
5152 }
5253 }
5354}
0 commit comments