mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	 5d9dfbd08f
			
		
	
	
		5d9dfbd08f
		
	
	
	
	
		
			
			Error codes are integers, but `String` is used everywhere to represent them. Gross! This commit introduces `ErrCode`, an integral newtype for error codes, replacing `String`. It also introduces a constant for every error code, e.g. `E0123`, and removes the `error_code!` macro. The constants are imported wherever used with `use rustc_errors::codes::*`. With the old code, we have three different ways to specify an error code at a use point: ``` error_code!(E0123) // macro call struct_span_code_err!(dcx, span, E0123, "msg"); // bare ident arg to macro call \#[diag(name, code = "E0123")] // string struct Diag; ``` With the new code, they all use the `E0123` constant. ``` E0123 // constant struct_span_code_err!(dcx, span, E0123, "msg"); // constant \#[diag(name, code = E0123)] // constant struct Diag; ``` The commit also changes the structure of the error code definitions: - `rustc_error_codes` now just defines a higher-order macro listing the used error codes and nothing else. - Because that's now the only thing in the `rustc_error_codes` crate, I moved it into the `lib.rs` file and removed the `error_codes.rs` file. - `rustc_errors` uses that macro to define everything, e.g. the error code constants and the `DIAGNOSTIC_TABLES`. This is in its new `codes.rs` file.
		
			
				
	
	
		
			40 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //! This module defines the following.
 | |
| //! - The `ErrCode` type.
 | |
| //! - A constant for every error code, with a name like `E0123`.
 | |
| //! - A static table `DIAGNOSTICS` pairing every error code constant with its
 | |
| //!   long description text.
 | |
| 
 | |
| use std::fmt;
 | |
| 
 | |
| rustc_index::newtype_index! {
 | |
|     #[max = 9999] // Because all error codes have four digits.
 | |
|     #[orderable]
 | |
|     #[encodable]
 | |
|     #[debug_format = "ErrCode({})"]
 | |
|     pub struct ErrCode {}
 | |
| }
 | |
| 
 | |
| impl fmt::Display for ErrCode {
 | |
|     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 | |
|         write!(f, "E{:04}", self.as_u32())
 | |
|     }
 | |
| }
 | |
| 
 | |
| macro_rules! define_error_code_constants_and_diagnostics_table {
 | |
|     ($($name:ident: $num:literal,)*) => (
 | |
|         $(
 | |
|             pub const $name: $crate::ErrCode = $crate::ErrCode::from_u32($num);
 | |
|         )*
 | |
|         pub static DIAGNOSTICS: &[($crate::ErrCode, &str)] = &[
 | |
|             $( (
 | |
|                 $name,
 | |
|                 include_str!(
 | |
|                     concat!("../../rustc_error_codes/src/error_codes/", stringify!($name), ".md")
 | |
|                 )
 | |
|             ), )*
 | |
|         ];
 | |
|     )
 | |
| }
 | |
| 
 | |
| rustc_error_codes::error_codes!(define_error_code_constants_and_diagnostics_table);
 |