@@ -5,6 +5,8 @@ use std::fs::OpenOptions;
5
5
use std:: io:: Write ;
6
6
use std:: path:: Path ;
7
7
8
+ use fluent_syntax:: ast:: Entry ;
9
+ use fluent_syntax:: parser;
8
10
use regex:: Regex ;
9
11
10
12
use crate :: diagnostics:: { CheckId , DiagCtx , RunningCheck } ;
@@ -24,30 +26,31 @@ fn check_alphabetic(
24
26
check : & mut RunningCheck ,
25
27
all_defined_msgs : & mut HashMap < String , String > ,
26
28
) {
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
+ } ;
36
32
37
- all_defined_msgs . insert ( name . as_str ( ) . to_owned ( ) , filename . to_owned ( ) ) ;
33
+ let mut prev : Option < & str > = None ;
38
34
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) {
42
39
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",
47
51
) ) ;
48
52
}
49
- } else {
50
- break ;
53
+ prev = Some ( name) ;
51
54
}
52
55
}
53
56
}
0 commit comments