@@ -71,50 +71,67 @@ fn extract_error_codes(root_path: &Path, errors: &mut Vec<String>) -> Vec<String
7171    let  path = root_path. join ( Path :: new ( ERROR_CODES_PATH ) ) ; 
7272    let  file =
7373        fs:: read_to_string ( & path) . unwrap_or_else ( |e| panic ! ( "failed to read `{path:?}`: {e}" ) ) ; 
74+     let  path = path. display ( ) ; 
7475
7576    let  mut  error_codes = Vec :: new ( ) ; 
7677
77-     for  line in  file. lines ( )  { 
78+     for  ( line_index,  line)  in  file. lines ( ) . enumerate ( )  { 
79+         let  line_index = line_index + 1 ; 
7880        let  line = line. trim ( ) ; 
7981
8082        if  line. starts_with ( 'E' )  { 
8183            let  split_line = line. split_once ( ':' ) ; 
8284
8385            // Extract the error code from the line. Emit a fatal error if it is not in the correct 
8486            // format. 
85-             let  err_code = if  let  Some ( err_code)  = split_line { 
86-                 err_code. 0 . to_owned ( ) 
87-             }  else  { 
87+             let  Some ( split_line)  = split_line else  { 
8888                errors. push ( format ! ( 
89-                     "Expected a line with the format `Eabcd: abcd, \  
89+                     "{path}:{line_index}:  Expected a line with the format `Eabcd: abcd, \  
9090                     but got \" {}\"  without a `:` delimiter", 
9191                    line, 
9292                ) ) ; 
9393                continue ; 
9494            } ; 
9595
96+             let  err_code = split_line. 0 . to_owned ( ) ; 
97+ 
9698            // If this is a duplicate of another error code, emit a fatal error. 
9799            if  error_codes. contains ( & err_code)  { 
98-                 errors. push ( format ! ( "Found duplicate error code: `{}`" ,  err_code) ) ; 
100+                 errors. push ( format ! ( 
101+                     "{path}:{line_index}: Found duplicate error code: `{}`" , 
102+                     err_code
103+                 ) ) ; 
99104                continue ; 
100105            } 
101106
102107            let  mut  chars = err_code. chars ( ) ; 
103-             chars. next ( ) ; 
108+             assert_eq ! ( chars. next( ) ,   Some ( 'E' ) ) ; 
104109            let  error_num_as_str = chars. as_str ( ) ; 
105110
106111            // Ensure that the line references the correct markdown file. 
107-             let  expected_filename = format ! ( " {}," ,  error_num_as_str) ; 
108-             if  expected_filename != split_line. unwrap ( ) . 1  { 
112+             let  rest = split_line. 1 . split_once ( ',' ) ; 
113+             let  Some ( rest)  = rest else  { 
114+                 errors. push ( format ! ( 
115+                     "{path}:{line_index}: Expected a line with the format `Eabcd: abcd, \  
116+                      but got \" {}\"  without a `,` delimiter", 
117+                     line, 
118+                 ) ) ; 
119+                 continue ; 
120+             } ; 
121+             if  error_num_as_str != rest. 0 . trim ( )  { 
109122                errors. push ( format ! ( 
110-                     "`{}:` should be followed by `{}` but instead found `{}` in \  
123+                     "{path}:{line_index}:  `{}:` should be followed by `{}, ` but instead found `{}` in \  
111124                     `compiler/rustc_error_codes/src/lib.rs`", 
112125                    err_code, 
113-                     expected_filename , 
114-                     split_line. unwrap ( ) . 1 , 
126+                     error_num_as_str , 
127+                     split_line. 1 , 
115128                ) ) ; 
116129                continue ; 
117130            } 
131+             if  !rest. 1 . trim ( ) . is_empty ( )  && !rest. 1 . trim ( ) . starts_with ( "//" )  { 
132+                 errors. push ( format ! ( "{path}:{line_index}: should only have one error per line" ) ) ; 
133+                 continue ; 
134+             } 
118135
119136            error_codes. push ( err_code) ; 
120137        } 
@@ -146,14 +163,14 @@ fn check_error_codes_docs(
146163            return ; 
147164        } 
148165
149-         // Make sure that the file is referenced in `error_codes .rs` 
166+         // Make sure that the file is referenced in `rustc_error_codes/src/lib .rs` 
150167        let  filename = path. file_name ( ) . unwrap ( ) . to_str ( ) . unwrap ( ) . split_once ( '.' ) ; 
151168        let  err_code = filename. unwrap ( ) . 0 ;  // `unwrap` is ok because we know the filename is in the correct format. 
152169
153170        if  error_codes. iter ( ) . all ( |e| e != err_code)  { 
154171            errors. push ( format ! ( 
155172                "Found valid file `{}` in error code docs directory without corresponding \  
156-                  entry in `error_code .rs`", 
173+                  entry in `rustc_error_codes/src/lib .rs`", 
157174                path. display( ) 
158175            ) ) ; 
159176            return ; 
0 commit comments